diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3f60423..cdd0106 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -142,6 +142,7 @@ jobs:
world = "domain_packs/world_intelligence/"
ai = "domain_packs/world_intelligence_ai/"
+ planetary = "domain_packs/world_intelligence_planetary_defense/"
federal = "domain_packs/world_intelligence_federal_register/"
monitor = "domain_packs/world_intelligence_federal_register_monitor/"
expected_payload = sorted(
@@ -180,6 +181,15 @@ jobs:
ai + "modules/source_mapping.json",
ai + "modules/synthesis.json",
ai + "conformance/ai_command_center_live_input.json",
+ planetary + "manifest.json",
+ planetary + "modules/detection.json",
+ planetary + "modules/epistemic_status.json",
+ planetary + "modules/ontology.json",
+ planetary + "modules/personas.json",
+ planetary + "modules/source_mapping.json",
+ planetary + "modules/synthesis.json",
+ planetary + "conformance/p2d_live_conflict_correction_input.json",
+ planetary + "conformance/p2d_live_expected.json",
federal + "manifest.json",
federal + "modules/ontology.json",
federal + "modules/source_mapping.json",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5e8fb2..c5b02eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,27 @@ noted here only where the boundary between them changes.
## Unreleased
+### Added
+
+- **P2D LIVE conflict and correction.** Four exact NASA/ESA planetary-defense publications become
+ LIVE Observations, one dated cross-source divergence and two same-source downward-revision Shifts,
+ three routed Signals, immutable historical and corrected Cases, and cited Reality Briefs with
+ family-aware per-claim epistemic status.
+- **Additive LIVE supersession impact.** Two explicit same-source supersession assertions append
+ exact dependency projections over the historical closure. Each reaches five resources and seven
+ Brief claims, discloses two unaffected resources, and leaves the historical Brief byte-identical.
+- **Exact official-source connector profiles.** The separately packaged connector now validates the
+ four reviewed NASA/ESA canonical pages under recorded, network-free transport. Eighteen focused
+ adapter cases cover accepted material and fail-closed boundary violations.
+
+### Boundaries
+
+- The new six-module pack is inert JSON only. The P2D proof contains 44 LIVE records and zero
+ PREPARED records, performs no network request, and creates no action, delivery, publication,
+ persuasion, monitor, or schedule.
+- NASA and ESA are independent claimant publication roots, not proven independent measurements.
+ Same-lineage supersessions collapse to their predecessor and do not manufacture corroboration.
+
### Repository consistency
- Added the full Apache-2.0 license, NOTICE, security policy, contribution guide, Code of Conduct,
diff --git a/README.md b/README.md
index af23433..f69c133 100644
--- a/README.md
+++ b/README.md
@@ -191,6 +191,30 @@ The accepted stable identities are `pack_ir:0679116c6b5e02cd021b085ba2d80cf2`,
`brief:d7d240147e48c3aef6a4a8e7ec481121`. The proof store contains 16 LIVE records and zero
PREPARED records; the synthetic PREPARED packet remains byte-frozen and is not reused.
+P2D adds the first complete LIVE conflict-and-correction packet. A separate inert six-module pack
+maps four dated publications about asteroid 2024 YR4 from two official claimant roots: NASA's 2.3%
+and later 0.004% Earth-impact estimates, and ESA's 1.8% and later 0.001% estimates. Recorded,
+network-free captures become four exact LIVE source transactions. The configured numeric bridge
+first routes the dated NASA/ESA estimate divergence into a historical Case and two-citation Reality
+Brief, then routes both same-source downward revisions into a corrected Case and four-citation
+Brief.
+
+The later records do not rewrite the earlier ones. Two explicit LIVE supersession Observations name
+the exact same-source predecessors, and two additive impact projections enumerate five affected
+resources and seven affected historical Brief claims apiece while disclosing two unaffected
+resources. Impact means dependency, not falsehood. The original Brief reopens byte-identically
+after both corrections. Its status projection has two source families; the corrected projection has
+four raw-observation roots, but each same-lineage supersession collapses to its predecessor and adds
+no corroboration. The corrected `corroborated` claim is supported by exactly two claimant families,
+NASA and ESA—not by treating before/after records as independent.
+
+The accepted P2D identities are `pack_ir:bb400cc0652622b43c01504e651110e0`, historical
+`brief:c3549af0262b100ca65024ee19cbae6e`, corrected
+`brief:806d69d8e41f83f93ee3dc10f58f0d16`, and corrected status projection
+`brief_derivation_family_status_projection:2acb48dd15e625c4b729ecef484b0209`. The proof store
+contains 44 LIVE records and zero PREPARED records. Separate official publication roots do not prove
+independent measurements: both agencies describe a shared international observation ecosystem.
+
P2C2 completes that sensing path across the Core + Intelligence + Domain boundaries. A new
declarative monitor pack admits two exact FCC records — document `2026-15932` published August 6
and document `2026-16197` published August 7 — as successive LIVE snapshots of one stable monitor
@@ -274,11 +298,11 @@ With `$REPO`, `$ACE`, `$PYTHONPATH`, and `$PY` exported as in
[Develop from a source checkout](#develop-from-a-source-checkout):
```bash
-# Complete domain suite, including every frozen packet, P2C2, and the AI command-center journey: 87 passed
+# Complete domain suite, including P2C2, AI Command Center, and P2D correction: 90 passed
export PYTHONPATH="$PYTHONPATH:$ACE/adapters/reference_workspace_action/src"
$PY -m pytest -q
-# Connector fail-closed unit suite: 62 passed
+# Connector fail-closed unit suite: 80 passed
$PY -m pytest adapters/federal_register_source/tests -q
# Individual acceptance harnesses
@@ -290,6 +314,7 @@ $PY scripts/p2b_status_case_brief.py
$PY scripts/p2b_independent_case_brief.py
$PY scripts/p2c_federal_register_live_acceptance.py
$PY -m scripts.ai_command_center_live_acceptance
+$PY -m scripts.p2d_live_conflict_correction
# Complete official-record -> Shift -> Signal -> Brief -> reviewed export journey
WORKSPACE=$(mktemp -d)
@@ -303,7 +328,7 @@ P2C2 action test runs when the independently packaged Core reference adapter is
uv sync --frozen --no-install-project
uv run --no-sync python -m pytest # released + candidate-compatible gates
uv run --no-sync python -m pytest tests/test_release_contract.py # publishable-identity gate
-uv run --no-sync python -m pytest adapters/federal_register_source/tests # connector: 26 passed
+uv run --no-sync python -m pytest adapters/federal_register_source/tests # connector: 80 passed
```
The released 0.9.0 baseline, measured with public `ace-core==0.5.0` from PyPI and the independently
@@ -312,6 +337,9 @@ suite and `26 passed` for the connector. With the AI command-center candidate in
baseline, the same environment passes `87` domain and `62` connector tests. The
public demo reproduces `case:412426eee708d56f6bda931ccf9e5d8b` and
`brief:25d8232c9bfa27050bdcb160fb75f06c`, and its two artifacts are byte-identical across runs.
+With P2D integrated, the source-tree candidate passes `90` domain tests, `80` connector tests, and
+all `7` release-contract tests. Its locally built wheel contains exactly 55 JSON resources, nine
+from the planetary-defense pack, and no executable code.
The exact identities, negative cases, and artifact proofs are recorded in
[`docs/audits/world-intelligence-p2a-2026-08-06.md`](docs/audits/world-intelligence-p2a-2026-08-06.md)
@@ -333,6 +361,8 @@ The complete governed product-journey evidence is recorded in
[`docs/audits/world-intelligence-p2c2-governed-reality-brief-2026-08-10.md`](docs/audits/world-intelligence-p2c2-governed-reality-brief-2026-08-10.md).
The two-lineage LIVE Shift → Signal → Case → cited Brief proof is recorded in
[`docs/audits/world-intelligence-ai-command-center-live-2026-08-10.md`](docs/audits/world-intelligence-ai-command-center-live-2026-08-10.md).
+The LIVE conflict, correction, supersession, and per-claim status proof is recorded in
+[`docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md`](docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md).
Release-level scope and evidence are recorded in
[`docs/releases/world-intelligence-p2c2-v0.9.0.md`](docs/releases/world-intelligence-p2c2-v0.9.0.md),
@@ -355,16 +385,16 @@ content autonomously. Every LIVE capture demonstrated here is one explicitly req
read-only retrieval. P2C2's only effect is an explicitly authorized and reviewed create-only local
workspace export followed by separate verification and promotion.
-Next: exercise P2D multi-source conflict and append-only correction with LIVE inputs while keeping
-publication-lineage independence distinct from claimant independence. The packet may not add
-publishing, delivery, persuasion, or other external-action authority.
+Next: turn one-shot governed sensing into explicit user-owned monitors and subscriptions while
+preserving correction visibility, suppression controls, and source-family independence. That work
+may not add publishing, delivery, persuasion, or other external-action authority to a Domain Pack.
## Roadmap and project status
The [World Intelligence roadmap](ROADMAP.md) owns current domain direction. Detailed packet history
remains in [`docs/world-intelligence-roadmap-status-2026-08-06.md`](docs/world-intelligence-roadmap-status-2026-08-06.md),
-and release history is in [`CHANGELOG.md`](CHANGELOG.md). The next bounded work is P2D
-multi-source conflict/correction with LIVE inputs. It may not add autonomous publishing, delivery,
+and release history is in [`CHANGELOG.md`](CHANGELOG.md). The next bounded work is explicit
+user-owned monitoring and subscription state. It may not add autonomous publishing, delivery,
persuasion, or action authority to a Domain Pack.
## Community and security
diff --git a/ROADMAP.md b/ROADMAP.md
index 67bbf9c..e06f351 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -16,13 +16,25 @@ source code into the platform.
See the [0.9.0 release record](docs/releases/world-intelligence-p2c2-v0.9.0.md).
-## Next — trustworthy live orientation
+## Candidate — trustworthy LIVE correction
+
+- Four dated NASA/ESA publications become exact LIVE Observations over one stable risk-estimate
+ entity through separately reviewed, recorded official-source adapters.
+- A cross-source estimate divergence and two same-source downward revisions produce configured
+ Shifts, routed Signals, immutable Cases, and cited historical and corrected Reality Briefs.
+- Explicit supersession assertions and additive dependency-impact projections preserve earlier
+ artifacts, exact citations, per-claim epistemic status, claimant-family independence, correction
+ visibility, and PREPARED/LIVE separation.
+- The packet performs no network request, external action, delivery, publication, or monitoring.
+
+See the [P2D audit](docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md).
+
+## Next — user-owned live orientation
- Add a separately reviewed, opt-in production transport without bundling it into the Domain Pack.
-- Exercise multi-source conflict, correction, and supersession against LIVE admitted records.
- Turn one-shot governed sensing into explicit user-owned monitors and subscriptions.
-- Preserve source independence, per-claim epistemic status, exact citations, correction visibility,
- and PREPARED/LIVE separation.
+- Preserve source independence, correction visibility, attention ownership, suppression, and
+ PREPARED/LIVE separation across repeated sensing windows.
## Later — measured personal and public sensemaking
diff --git a/adapters/federal_register_source/README.md b/adapters/federal_register_source/README.md
index 8c61e91..7c0a081 100644
--- a/adapters/federal_register_source/README.md
+++ b/adapters/federal_register_source/README.md
@@ -29,6 +29,14 @@ no White House network transport is enabled by this package. The source is a pub
independent of the Federal Register API record, but it is not independent non-government
corroboration.
+P2D adds exact recorded-transport profiles for two NASA and two ESA planetary-defense pages about
+asteroid 2024 YR4. The adapter accepts only the four reviewed canonical URIs, titles, publication
+dates, claimant types, target date, and probability statements. Decimal estimates remain exact text
+at the capture boundary and are converted to numeric attributes only by the inert source-mapping
+declaration. These profiles have no enabled network transport. NASA and ESA are separate official
+claimant publication roots; the connector does not claim their underlying observations or models
+are independent.
+
## License
Apache-2.0 under the repository [`LICENSE`](../../LICENSE) and [`NOTICE`](../../NOTICE).
diff --git a/adapters/federal_register_source/src/ace_world_federal_register_source/__init__.py b/adapters/federal_register_source/src/ace_world_federal_register_source/__init__.py
index 118db88..d53340d 100644
--- a/adapters/federal_register_source/src/ace_world_federal_register_source/__init__.py
+++ b/adapters/federal_register_source/src/ace_world_federal_register_source/__init__.py
@@ -38,6 +38,36 @@
FederalRegisterNetworkTransportError,
OptInFederalRegisterNetworkTransport,
)
+from .planetary_defense_adapter import (
+ ESA_INITIAL_PROFILE,
+ ESA_INITIAL_TITLE,
+ ESA_INITIAL_URI,
+ ESA_PLANETARY_DEFENCE_IMPLEMENTATION_ID,
+ ESA_PLANETARY_DEFENCE_PROFILES,
+ ESA_PLANETARY_DEFENCE_SOURCE_TYPE,
+ ESA_REVISED_PROFILE,
+ ESA_REVISED_TITLE,
+ ESA_REVISED_URI,
+ NASA_INITIAL_PROFILE,
+ NASA_INITIAL_TITLE,
+ NASA_INITIAL_URI,
+ NASA_PLANETARY_DEFENSE_IMPLEMENTATION_ID,
+ NASA_PLANETARY_DEFENSE_PROFILES,
+ NASA_PLANETARY_DEFENSE_SOURCE_TYPE,
+ NASA_REVISED_PROFILE,
+ NASA_REVISED_TITLE,
+ NASA_REVISED_URI,
+ PLANETARY_DEFENSE_IMPLEMENTATION_VERSION,
+ PLANETARY_DEFENSE_LOCATOR,
+ PLANETARY_DEFENSE_OBJECT,
+ PLANETARY_DEFENSE_TARGET_DATE,
+ PlanetaryDefensePublicationProfile,
+ PlanetaryDefenseRetrievalRequest,
+ PlanetaryDefenseRetrievalResult,
+ PlanetaryDefenseSourceAdapter,
+ PlanetaryDefenseSourceAdapterError,
+ PlanetaryDefenseTransport,
+)
from .white_house_adapter import (
WHITE_HOUSE_IMPLEMENTATION_ID,
WHITE_HOUSE_IMPLEMENTATION_VERSION,
@@ -74,10 +104,32 @@
"DEFAULT_DOCUMENT_PROFILE",
"DOCUMENT_NUMBER",
"DOCUMENT_TITLE",
+ "ESA_INITIAL_PROFILE",
+ "ESA_INITIAL_TITLE",
+ "ESA_INITIAL_URI",
+ "ESA_PLANETARY_DEFENCE_IMPLEMENTATION_ID",
+ "ESA_PLANETARY_DEFENCE_PROFILES",
+ "ESA_PLANETARY_DEFENCE_SOURCE_TYPE",
+ "ESA_REVISED_PROFILE",
+ "ESA_REVISED_TITLE",
+ "ESA_REVISED_URI",
"FEDERAL_REGISTER_DOCUMENT_URI",
"FEDERAL_REGISTER_LOCATOR",
"FEDERAL_REGISTER_SOURCE_TYPE",
+ "NASA_INITIAL_PROFILE",
+ "NASA_INITIAL_TITLE",
+ "NASA_INITIAL_URI",
+ "NASA_PLANETARY_DEFENSE_IMPLEMENTATION_ID",
+ "NASA_PLANETARY_DEFENSE_PROFILES",
+ "NASA_PLANETARY_DEFENSE_SOURCE_TYPE",
+ "NASA_REVISED_PROFILE",
+ "NASA_REVISED_TITLE",
+ "NASA_REVISED_URI",
"OFFICIAL_PDF_URI",
+ "PLANETARY_DEFENSE_IMPLEMENTATION_VERSION",
+ "PLANETARY_DEFENSE_LOCATOR",
+ "PLANETARY_DEFENSE_OBJECT",
+ "PLANETARY_DEFENSE_TARGET_DATE",
"WHITE_HOUSE_IMPLEMENTATION_ID",
"WHITE_HOUSE_IMPLEMENTATION_VERSION",
"WHITE_HOUSE_LINEAGE_ID",
@@ -97,6 +149,12 @@
"FederalRegisterSourceAdapterError",
"FederalRegisterTransport",
"OptInFederalRegisterNetworkTransport",
+ "PlanetaryDefensePublicationProfile",
+ "PlanetaryDefenseRetrievalRequest",
+ "PlanetaryDefenseRetrievalResult",
+ "PlanetaryDefenseSourceAdapter",
+ "PlanetaryDefenseSourceAdapterError",
+ "PlanetaryDefenseTransport",
"WhiteHouseAIPolicySourceAdapter",
"WhiteHouseRetrievalRequest",
"WhiteHouseRetrievalResult",
diff --git a/adapters/federal_register_source/src/ace_world_federal_register_source/planetary_defense_adapter.py b/adapters/federal_register_source/src/ace_world_federal_register_source/planetary_defense_adapter.py
new file mode 100644
index 0000000..075844f
--- /dev/null
+++ b/adapters/federal_register_source/src/ace_world_federal_register_source/planetary_defense_adapter.py
@@ -0,0 +1,416 @@
+"""Exact read-only adapters for frozen NASA and ESA planetary-defense pages."""
+
+from __future__ import annotations
+
+import hashlib
+from dataclasses import dataclass
+from datetime import UTC, datetime
+from html.parser import HTMLParser
+from typing import Protocol
+
+from ace.core import CapabilityArtifactIdentityV1Alpha1, canonical_json, validate_exact_https_uri
+from ace.intelligence import CapturedSourceMaterialV1Alpha1, SourceAdapterCaptureRequestV1Alpha1
+
+from .adapter import ADAPTER_CAPABILITY, ADAPTER_CONTRACT, _aware_utc, _validated_addresses
+
+NASA_PLANETARY_DEFENSE_IMPLEMENTATION_ID = "world_nasa_planetary_defense_source"
+ESA_PLANETARY_DEFENCE_IMPLEMENTATION_ID = "world_esa_planetary_defence_source"
+PLANETARY_DEFENSE_IMPLEMENTATION_VERSION = "0.1.0"
+NASA_PLANETARY_DEFENSE_SOURCE_TYPE = "nasa_planetary_defense_publication"
+ESA_PLANETARY_DEFENCE_SOURCE_TYPE = "esa_planetary_defence_publication"
+PLANETARY_DEFENSE_LOCATOR = "css:article"
+PLANETARY_DEFENSE_OBJECT = "2024 YR4"
+PLANETARY_DEFENSE_TARGET_DATE = "2032-12-22"
+MAX_RESPONSE_BODY_CHARS = 512_000
+
+NASA_INITIAL_URI = (
+ "https://science.nasa.gov/blogs/planetary-defense/2025/02/07/"
+ "nasa-continues-to-monitor-orbit-of-near-earth-asteroid-2024-yr4/"
+)
+NASA_INITIAL_TITLE = "NASA Continues to Monitor Orbit of Near-Earth Asteroid 2024 YR4"
+NASA_REVISED_URI = (
+ "https://science.nasa.gov/blogs/planetary-defense/2025/02/24/"
+ "latest-calculations-conclude-asteroid-2024-yr4-now-poses-no-significant-"
+ "threat-to-earth-in-2032-and-beyond/"
+)
+NASA_REVISED_TITLE = (
+ "Latest Calculations Conclude Asteroid 2024 YR4 Now Poses No Significant Threat to Earth in 2032 and Beyond"
+)
+ESA_INITIAL_URI = (
+ "https://blogs.esa.int/rocketscience/2025/02/06/2024-yr4-flyby-geometry-or-1-8-of-what/comment-page-1/"
+)
+ESA_INITIAL_TITLE = "2024 YR4 flyby geometry, or 1.8% of What?"
+ESA_REVISED_URI = "https://www.esa.int/ESA_Multimedia/Images/2025/02/Asteroid_2024_YR4_impact_risk_rises_and_falls"
+ESA_REVISED_TITLE = "Asteroid 2024 YR4 impact risk rises and falls"
+
+
+class PlanetaryDefenseSourceAdapterError(ValueError):
+ """An official planetary-defense retrieval crossed its reviewed scope."""
+
+
+@dataclass(frozen=True, slots=True)
+class PlanetaryDefensePublicationProfile:
+ source_type_ref: str
+ requested_uri: str
+ title: str
+ publication_date: str
+ claimant_org: str
+ claimant_office: str
+ probability_percent: float
+ estimate_status: str
+ source_lineage_id: str
+ predecessor_lineage_id: str
+ assessment_note: str
+ required_statements: tuple[str, ...]
+
+
+NASA_INITIAL_PROFILE = PlanetaryDefensePublicationProfile(
+ source_type_ref=NASA_PLANETARY_DEFENSE_SOURCE_TYPE,
+ requested_uri=NASA_INITIAL_URI,
+ title=NASA_INITIAL_TITLE,
+ publication_date="2025-02-07",
+ claimant_org="NASA",
+ claimant_office="Planetary Defense Coordination Office / JPL Center for Near-Earth Object Studies",
+ probability_percent=2.3,
+ estimate_status="earlier_estimate",
+ source_lineage_id="nasa_pdco:2024_yr4:2025-02-07",
+ predecessor_lineage_id="none",
+ assessment_note=(
+ "NASA reported a 2.3% Earth-impact probability for 22 December 2032 and said the "
+ "estimate could change as observations accumulated."
+ ),
+ required_statements=("2.3%", "Dec. 22, 2032", "impact probability"),
+)
+NASA_REVISED_PROFILE = PlanetaryDefensePublicationProfile(
+ source_type_ref=NASA_PLANETARY_DEFENSE_SOURCE_TYPE,
+ requested_uri=NASA_REVISED_URI,
+ title=NASA_REVISED_TITLE,
+ publication_date="2025-02-24",
+ claimant_org="NASA",
+ claimant_office="Planetary Defense Coordination Office / JPL Center for Near-Earth Object Studies",
+ probability_percent=0.004,
+ estimate_status="revised_estimate",
+ source_lineage_id="nasa_pdco:2024_yr4:2025-02-24",
+ predecessor_lineage_id=NASA_INITIAL_PROFILE.source_lineage_id,
+ assessment_note=(
+ "NASA reported an updated 0.004% Earth-impact probability for 22 December 2032 and "
+ "no significant impact potential for the next century."
+ ),
+ required_statements=("0.004%", "Dec. 22, 2032", "no significant potential"),
+)
+ESA_INITIAL_PROFILE = PlanetaryDefensePublicationProfile(
+ source_type_ref=ESA_PLANETARY_DEFENCE_SOURCE_TYPE,
+ requested_uri=ESA_INITIAL_URI,
+ title=ESA_INITIAL_TITLE,
+ publication_date="2025-02-06",
+ claimant_org="ESA",
+ claimant_office="Planetary Defence Office",
+ probability_percent=1.8,
+ estimate_status="earlier_estimate",
+ source_lineage_id="esa_pdo:2024_yr4:2025-02-06",
+ predecessor_lineage_id="none",
+ assessment_note=(
+ "ESA reported a 1.8% Earth-impact risk for 22 December 2032 and expected the numerical "
+ "value to evolve with additional observations."
+ ),
+ required_statements=("1.8%", "22 December 2032", "expected to evolve"),
+)
+ESA_REVISED_PROFILE = PlanetaryDefensePublicationProfile(
+ source_type_ref=ESA_PLANETARY_DEFENCE_SOURCE_TYPE,
+ requested_uri=ESA_REVISED_URI,
+ title=ESA_REVISED_TITLE,
+ publication_date="2025-02-25",
+ claimant_org="ESA",
+ claimant_office="Planetary Defence Office",
+ probability_percent=0.001,
+ estimate_status="revised_estimate",
+ source_lineage_id="esa_pdo:2024_yr4:2025-02-25",
+ predecessor_lineage_id=ESA_INITIAL_PROFILE.source_lineage_id,
+ assessment_note=(
+ "ESA reported a 0.001% Earth-impact risk for 22 December 2032, down from estimates "
+ "published during the preceding days."
+ ),
+ required_statements=("0.001%", "22 December 2032", "down from"),
+)
+
+NASA_PLANETARY_DEFENSE_PROFILES = (NASA_INITIAL_PROFILE, NASA_REVISED_PROFILE)
+ESA_PLANETARY_DEFENCE_PROFILES = (ESA_INITIAL_PROFILE, ESA_REVISED_PROFILE)
+
+
+@dataclass(frozen=True, slots=True)
+class PlanetaryDefenseRetrievalRequest:
+ source_type_ref: str
+ requested_uri: str
+ max_response_chars: int
+ credentials_allowed: bool = False
+ redirects_allowed: bool = False
+ public_network_only: bool = True
+ dns_rebinding_protection_required: bool = True
+
+
+@dataclass(frozen=True, slots=True)
+class PlanetaryDefenseRetrievalResult:
+ source_type_ref: str
+ requested_uri: str
+ effective_uri: str
+ status_code: int
+ media_type: str
+ response_body: str
+ redirect_chain: tuple[str, ...]
+ resolved_ip_addresses: tuple[str, ...]
+ connected_ip_addresses: tuple[str, ...]
+ dns_rebinding_protection_applied: bool
+ credentials_used: bool
+ locator: str
+ observed_at: datetime
+ captured_at: datetime
+
+
+class PlanetaryDefenseTransport(Protocol):
+ async def retrieve(
+ self,
+ request: PlanetaryDefenseRetrievalRequest,
+ ) -> PlanetaryDefenseRetrievalResult: ...
+
+
+def _fail(message: str) -> PlanetaryDefenseSourceAdapterError:
+ return PlanetaryDefenseSourceAdapterError(message)
+
+
+class _PublicationHTML(HTMLParser):
+ def __init__(self) -> None:
+ super().__init__(convert_charrefs=True)
+ self.metadata: dict[str, str] = {}
+ self.canonical_uri: str | None = None
+ self.visible: list[str] = []
+ self._ignored_depth = 0
+
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
+ values = {key.lower(): value for key, value in attrs if value is not None}
+ if tag in {"script", "style", "template", "noscript"}:
+ self._ignored_depth += 1
+ if tag == "meta":
+ key = values.get("property") or values.get("name")
+ content = values.get("content")
+ if key in {"og:title", "article:published_time"} and content is not None:
+ if key in self.metadata:
+ raise _fail(f"duplicate reviewed planetary-defense metadata: {key}")
+ self.metadata[key] = content
+ if tag == "link" and values.get("rel", "").lower() == "canonical":
+ if self.canonical_uri is not None:
+ raise _fail("duplicate reviewed planetary-defense canonical URI")
+ self.canonical_uri = values.get("href")
+
+ def handle_endtag(self, tag: str) -> None:
+ if tag in {"script", "style", "template", "noscript"} and self._ignored_depth:
+ self._ignored_depth -= 1
+
+ def handle_data(self, data: str) -> None:
+ if not self._ignored_depth:
+ normalized = " ".join(data.split())
+ if normalized:
+ self.visible.append(normalized)
+
+
+def _canonical_publication_payload(
+ response_body: object,
+ *,
+ profile: PlanetaryDefensePublicationProfile,
+ max_chars: int,
+) -> str:
+ if type(response_body) is not str:
+ raise _fail("planetary-defense response body must be text")
+ if not response_body or len(response_body) > max_chars:
+ raise _fail("planetary-defense response body exceeded its exact character bound")
+ parser = _PublicationHTML()
+ try:
+ parser.feed(response_body)
+ parser.close()
+ except PlanetaryDefenseSourceAdapterError:
+ raise
+ except (TypeError, ValueError) as exc:
+ raise _fail("planetary-defense response is not bounded parseable HTML") from exc
+ if parser.metadata.get("og:title") != profile.title:
+ raise _fail("planetary-defense title crossed the exact reviewed publication scope")
+ published = parser.metadata.get("article:published_time", "")
+ if not published.startswith(profile.publication_date):
+ raise _fail("planetary-defense publication date crossed the exact reviewed scope")
+ if parser.canonical_uri != profile.requested_uri:
+ raise _fail("planetary-defense canonical URI crossed the exact reviewed scope")
+ validate_exact_https_uri(parser.canonical_uri, name="canonical_uri")
+ visible = " ".join(parser.visible)
+ if any(statement not in visible for statement in profile.required_statements):
+ raise _fail("planetary-defense page omitted an exact reviewed estimate statement")
+ return canonical_json(
+ {
+ "assessment_note": profile.assessment_note,
+ "assessment_subject": "earth_impact_probability",
+ "claimant_office": profile.claimant_office,
+ "claimant_org": profile.claimant_org,
+ "estimate_status": profile.estimate_status,
+ "impact_probability_percent": format(profile.probability_percent, "g"),
+ "object_name": PLANETARY_DEFENSE_OBJECT,
+ "predecessor_lineage_id": profile.predecessor_lineage_id,
+ "publication_date": profile.publication_date,
+ "source_lineage_id": profile.source_lineage_id,
+ "source_uri": profile.requested_uri,
+ "target_date": PLANETARY_DEFENSE_TARGET_DATE,
+ }
+ )
+
+
+class PlanetaryDefenseSourceAdapter:
+ """Validate one agency's exact reviewed publications and emit inert JSON."""
+
+ def __init__(
+ self,
+ *,
+ transport: PlanetaryDefenseTransport,
+ artifact_digest: str,
+ source_type_ref: str,
+ ) -> None:
+ if source_type_ref == NASA_PLANETARY_DEFENSE_SOURCE_TYPE:
+ implementation_id = NASA_PLANETARY_DEFENSE_IMPLEMENTATION_ID
+ profiles = NASA_PLANETARY_DEFENSE_PROFILES
+ elif source_type_ref == ESA_PLANETARY_DEFENCE_SOURCE_TYPE:
+ implementation_id = ESA_PLANETARY_DEFENCE_IMPLEMENTATION_ID
+ profiles = ESA_PLANETARY_DEFENCE_PROFILES
+ else:
+ raise _fail("unsupported planetary-defense source type")
+ self.source_type_ref = source_type_ref
+ self.profiles = {profile.requested_uri: profile for profile in profiles}
+ self._transport = transport
+ self.artifact_identity = CapabilityArtifactIdentityV1Alpha1(
+ capability=ADAPTER_CAPABILITY,
+ contract=ADAPTER_CONTRACT,
+ implementation_id=implementation_id,
+ implementation_version=PLANETARY_DEFENSE_IMPLEMENTATION_VERSION,
+ artifact_digest=artifact_digest,
+ )
+ self.capture_calls = 0
+
+ async def capture(
+ self,
+ request: SourceAdapterCaptureRequestV1Alpha1,
+ ) -> CapturedSourceMaterialV1Alpha1:
+ try:
+ validated = SourceAdapterCaptureRequestV1Alpha1.model_validate(request.model_dump(mode="python"))
+ except (AttributeError, TypeError, ValueError) as exc:
+ raise _fail("source-adapter request failed exact public-contract revalidation") from exc
+ if validated.adapter_artifact != self.artifact_identity:
+ raise _fail("source-adapter request names a different installed artifact")
+ if validated.source_type_ref != self.source_type_ref:
+ raise _fail("source-adapter request names a different claimant source type")
+ profile = self.profiles.get(validated.requested_uri)
+ if profile is None:
+ raise _fail("source-adapter request crossed the exact reviewed URI set")
+ validate_exact_https_uri(validated.requested_uri, name="requested_uri")
+
+ transport_request = PlanetaryDefenseRetrievalRequest(
+ source_type_ref=validated.source_type_ref,
+ requested_uri=validated.requested_uri,
+ max_response_chars=min(validated.max_payload_chars, MAX_RESPONSE_BODY_CHARS),
+ )
+ self.capture_calls += 1
+ result = await self._transport.retrieve(transport_request)
+ if type(result) is not PlanetaryDefenseRetrievalResult:
+ raise _fail("transport returned an unsupported planetary-defense result type")
+ if any(
+ type(value) is not str
+ for value in (
+ result.source_type_ref,
+ result.requested_uri,
+ result.effective_uri,
+ result.media_type,
+ result.response_body,
+ result.locator,
+ )
+ ):
+ raise _fail("planetary-defense retrieval scalar fields must use exact string types")
+ if type(result.status_code) is not int:
+ raise _fail("planetary-defense status_code must use the exact integer type")
+ if type(result.redirect_chain) is not tuple or result.redirect_chain != ():
+ raise _fail("planetary-defense redirect_chain must be exactly an empty tuple")
+ if type(result.credentials_used) is not bool or result.credentials_used is not False:
+ raise _fail("planetary-defense retrieval must attest exact false credentials_used")
+ if (
+ type(result.dns_rebinding_protection_applied) is not bool
+ or result.dns_rebinding_protection_applied is not True
+ ):
+ raise _fail("planetary-defense retrieval must attest exact true DNS-rebinding protection")
+ if (
+ result.source_type_ref != self.source_type_ref
+ or result.requested_uri != profile.requested_uri
+ or result.effective_uri != profile.requested_uri
+ ):
+ raise _fail("planetary-defense retrieval crossed source type or exact URI scope")
+ if result.locator != PLANETARY_DEFENSE_LOCATOR:
+ raise _fail("planetary-defense retrieval does not bind the exact article locator")
+ if result.status_code != 200 or result.media_type != "text/html":
+ raise _fail("planetary-defense retrieval must be exact HTTP 200 text/html material")
+ try:
+ resolved = _validated_addresses(result.resolved_ip_addresses, name="resolved_ip_addresses")
+ connected = _validated_addresses(result.connected_ip_addresses, name="connected_ip_addresses")
+ observed_at = _aware_utc(result.observed_at, name="observed_at")
+ captured_at = _aware_utc(result.captured_at, name="captured_at")
+ except ValueError as exc:
+ raise _fail(str(exc)) from exc
+ if connected != resolved:
+ raise _fail("every resolved and connected planetary-defense address must remain exactly attested")
+ if observed_at < validated.started_at or captured_at < observed_at:
+ raise _fail("planetary-defense observation/capture times fall outside the exact operation")
+
+ payload_json = _canonical_publication_payload(
+ result.response_body,
+ profile=profile,
+ max_chars=transport_request.max_response_chars,
+ )
+ return CapturedSourceMaterialV1Alpha1(
+ capture_request_ref=str(validated.request_id),
+ capture_request_digest=str(validated.request_digest),
+ source_type_ref=validated.source_type_ref,
+ requested_uri=validated.requested_uri,
+ effective_uri=result.effective_uri,
+ redirect_chain=(),
+ resolved_ip_addresses=resolved,
+ dns_rebinding_protection_applied=True,
+ captured_payload_json=payload_json,
+ captured_payload_digest="sha256:" + hashlib.sha256(payload_json.encode("utf-8")).hexdigest(),
+ locator=PLANETARY_DEFENSE_LOCATOR,
+ source_published_at=datetime.fromisoformat(profile.publication_date).replace(tzinfo=UTC),
+ event_effective_at=None,
+ observed_at=observed_at,
+ captured_at=captured_at,
+ )
+
+
+__all__ = [
+ "ESA_INITIAL_PROFILE",
+ "ESA_INITIAL_TITLE",
+ "ESA_INITIAL_URI",
+ "ESA_PLANETARY_DEFENCE_IMPLEMENTATION_ID",
+ "ESA_PLANETARY_DEFENCE_PROFILES",
+ "ESA_PLANETARY_DEFENCE_SOURCE_TYPE",
+ "ESA_REVISED_PROFILE",
+ "ESA_REVISED_TITLE",
+ "ESA_REVISED_URI",
+ "NASA_INITIAL_PROFILE",
+ "NASA_INITIAL_TITLE",
+ "NASA_INITIAL_URI",
+ "NASA_PLANETARY_DEFENSE_IMPLEMENTATION_ID",
+ "NASA_PLANETARY_DEFENSE_PROFILES",
+ "NASA_PLANETARY_DEFENSE_SOURCE_TYPE",
+ "NASA_REVISED_PROFILE",
+ "NASA_REVISED_TITLE",
+ "NASA_REVISED_URI",
+ "PLANETARY_DEFENSE_IMPLEMENTATION_VERSION",
+ "PLANETARY_DEFENSE_LOCATOR",
+ "PLANETARY_DEFENSE_OBJECT",
+ "PLANETARY_DEFENSE_TARGET_DATE",
+ "PlanetaryDefensePublicationProfile",
+ "PlanetaryDefenseRetrievalRequest",
+ "PlanetaryDefenseRetrievalResult",
+ "PlanetaryDefenseSourceAdapter",
+ "PlanetaryDefenseSourceAdapterError",
+ "PlanetaryDefenseTransport",
+]
diff --git a/adapters/federal_register_source/tests/test_planetary_defense_adapter.py b/adapters/federal_register_source/tests/test_planetary_defense_adapter.py
new file mode 100644
index 0000000..7f7f5ff
--- /dev/null
+++ b/adapters/federal_register_source/tests/test_planetary_defense_adapter.py
@@ -0,0 +1,173 @@
+from __future__ import annotations
+
+import json
+from dataclasses import replace
+from datetime import UTC, datetime, timedelta
+
+import pytest
+from ace.core import AuthenticatedRuntimeContextV1Alpha1
+from ace.intelligence import SourceAdapterCaptureRequestV1Alpha1
+
+from ace_world_federal_register_source import (
+ ESA_INITIAL_PROFILE,
+ ESA_PLANETARY_DEFENCE_SOURCE_TYPE,
+ ESA_REVISED_PROFILE,
+ NASA_INITIAL_PROFILE,
+ NASA_PLANETARY_DEFENSE_SOURCE_TYPE,
+ NASA_REVISED_PROFILE,
+ PLANETARY_DEFENSE_LOCATOR,
+ PlanetaryDefenseRetrievalResult,
+ PlanetaryDefenseSourceAdapter,
+ PlanetaryDefenseSourceAdapterError,
+)
+
+ARTIFACT_DIGEST = "sha256:" + "6" * 64
+STARTED = datetime(2026, 8, 11, 18, 0, tzinfo=UTC)
+PROFILES = (
+ NASA_INITIAL_PROFILE,
+ NASA_REVISED_PROFILE,
+ ESA_INITIAL_PROFILE,
+ ESA_REVISED_PROFILE,
+)
+
+
+def _body(profile, **changes: str) -> str:
+ title = changes.get("title", profile.title)
+ published = changes.get("published", profile.publication_date + "T00:00:00+00:00")
+ canonical = changes.get("canonical", profile.requested_uri)
+ statement = changes.get("statement", " ".join(profile.required_statements))
+ return (
+ "
"
+ f''
+ f''
+ f''
+ f"
{title}
{statement}
"
+ ""
+ )
+
+
+class _Transport:
+ def __init__(self, result: PlanetaryDefenseRetrievalResult) -> None:
+ self.result = result
+ self.calls = 0
+
+ async def retrieve(self, request):
+ assert request.requested_uri == self.result.requested_uri
+ self.calls += 1
+ return self.result
+
+
+def _result(profile, **changes: object) -> PlanetaryDefenseRetrievalResult:
+ base = PlanetaryDefenseRetrievalResult(
+ source_type_ref=profile.source_type_ref,
+ requested_uri=profile.requested_uri,
+ effective_uri=profile.requested_uri,
+ status_code=200,
+ media_type="text/html",
+ response_body=_body(profile),
+ redirect_chain=(),
+ resolved_ip_addresses=("1.1.1.1",),
+ connected_ip_addresses=("1.1.1.1",),
+ dns_rebinding_protection_applied=True,
+ credentials_used=False,
+ locator=PLANETARY_DEFENSE_LOCATOR,
+ observed_at=STARTED + timedelta(seconds=1),
+ captured_at=STARTED + timedelta(seconds=2),
+ )
+ return replace(base, **changes)
+
+
+def _adapter_and_request(profile, **changes: object):
+ transport = _Transport(_result(profile, **changes))
+ adapter = PlanetaryDefenseSourceAdapter(
+ transport=transport,
+ artifact_digest=ARTIFACT_DIGEST,
+ source_type_ref=profile.source_type_ref,
+ )
+ context = AuthenticatedRuntimeContextV1Alpha1(
+ product_id="product:world-planetary-defense",
+ actor_ref="actor:world-planetary-defense-researcher",
+ authentication_receipt_ref="authentication_receipt:planetary-defense",
+ authentication_receipt_digest="sha256:" + "7" * 64,
+ authenticated_at=STARTED - timedelta(minutes=1),
+ expires_at=STARTED + timedelta(minutes=10),
+ )
+ request = SourceAdapterCaptureRequestV1Alpha1(
+ product_id=context.product_id,
+ authenticated_context=context,
+ use_subject_ref="live_source_ingress_request:planetary-defense",
+ use_subject_digest="sha256:" + "8" * 64,
+ source_definition_ref="source_definition:planetary-defense",
+ source_type_ref=profile.source_type_ref,
+ requested_uri=profile.requested_uri,
+ adapter_artifact=adapter.artifact_identity,
+ configuration_ref="config:planetary-defense",
+ configuration_digest="sha256:" + "9" * 64,
+ started_at=STARTED,
+ max_payload_chars=512_000,
+ )
+ return adapter, transport, request
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize("profile", PROFILES, ids=lambda item: item.source_lineage_id)
+async def test_exact_planetary_defense_publication_becomes_closed_inert_material(profile) -> None:
+ adapter, transport, request = _adapter_and_request(profile)
+ capture = await adapter.capture(request)
+ payload = json.loads(capture.captured_payload_json)
+
+ assert payload == {
+ "assessment_note": profile.assessment_note,
+ "assessment_subject": "earth_impact_probability",
+ "claimant_office": profile.claimant_office,
+ "claimant_org": profile.claimant_org,
+ "estimate_status": profile.estimate_status,
+ "impact_probability_percent": format(profile.probability_percent, "g"),
+ "object_name": "2024 YR4",
+ "predecessor_lineage_id": profile.predecessor_lineage_id,
+ "publication_date": profile.publication_date,
+ "source_lineage_id": profile.source_lineage_id,
+ "source_uri": profile.requested_uri,
+ "target_date": "2032-12-22",
+ }
+ assert capture.source_published_at == datetime.fromisoformat(profile.publication_date).replace(tzinfo=UTC)
+ assert capture.requested_uri == capture.effective_uri == profile.requested_uri
+ assert adapter.capture_calls == transport.calls == 1
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ ("changes", "message"),
+ [
+ ({"status_code": 404}, "HTTP 200"),
+ ({"media_type": "application/json"}, "text/html"),
+ ({"effective_uri": NASA_INITIAL_PROFILE.requested_uri + "?other=1"}, "URI scope"),
+ ({"redirect_chain": (NASA_INITIAL_PROFILE.requested_uri,)}, "empty tuple"),
+ ({"credentials_used": True}, "false credentials"),
+ ({"resolved_ip_addresses": ("127.0.0.1",)}, "globally routable"),
+ ({"connected_ip_addresses": ("8.8.8.8",)}, "exactly attested"),
+ ({"locator": "css:h1"}, "article locator"),
+ ({"response_body": _body(NASA_INITIAL_PROFILE, title="Different")}, "title"),
+ ({"response_body": _body(NASA_INITIAL_PROFILE, published="2025-02-08")}, "publication date"),
+ ({"response_body": _body(NASA_INITIAL_PROFILE, canonical="https://example.com")}, "canonical URI"),
+ ({"response_body": _body(NASA_INITIAL_PROFILE, statement="2.3%")}, "estimate statement"),
+ ({"captured_at": STARTED}, "observation/capture times"),
+ ],
+)
+async def test_planetary_defense_adapter_fails_closed(
+ changes: dict[str, object],
+ message: str,
+) -> None:
+ adapter, _, request = _adapter_and_request(NASA_INITIAL_PROFILE, **changes)
+ with pytest.raises(PlanetaryDefenseSourceAdapterError, match=message):
+ await adapter.capture(request)
+
+
+def test_planetary_defense_adapter_rejects_cross_claimant_source_type() -> None:
+ with pytest.raises(PlanetaryDefenseSourceAdapterError, match="unsupported"):
+ PlanetaryDefenseSourceAdapter(
+ transport=object(),
+ artifact_digest=ARTIFACT_DIGEST,
+ source_type_ref="other",
+ )
+ assert NASA_PLANETARY_DEFENSE_SOURCE_TYPE != ESA_PLANETARY_DEFENCE_SOURCE_TYPE
diff --git a/docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md b/docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md
new file mode 100644
index 0000000..7a1ebb4
--- /dev/null
+++ b/docs/audits/world-intelligence-p2d-live-conflict-correction-2026-08-11.md
@@ -0,0 +1,92 @@
+# World Intelligence P2D LIVE conflict/correction audit — 2026-08-11
+
+## Result
+
+P2D carries four recorded official publications through governed LIVE admission, configured Shift
+and Signal derivation, immutable Case assembly, cited Reality Briefs, family-aware per-claim status,
+explicit same-source supersession, and additive dependency-impact projection. The historical
+artifacts remain immutable after the later source records arrive. PREPARED and LIVE remain visibly
+separate: the accepted store contains 44 LIVE records and zero PREPARED records.
+
+## Source boundary
+
+The scenario freezes these dated official publication claims:
+
+| Claimant lineage | Earlier record | Later record |
+|---|---|---|
+| NASA Planetary Defense / JPL CNEOS | [2.3% on 2025-02-07](https://science.nasa.gov/blogs/planetary-defense/2025/02/07/nasa-continues-to-monitor-orbit-of-near-earth-asteroid-2024-yr4/) | [0.004% on 2025-02-24](https://science.nasa.gov/blogs/planetary-defense/2025/02/24/latest-calculations-conclude-asteroid-2024-yr4-now-poses-no-significant-threat-to-earth-in-2032-and-beyond/) |
+| ESA Planetary Defence Office | [1.8% on 2025-02-06](https://blogs.esa.int/rocketscience/2025/02/06/2024-yr4-flyby-geometry-or-1-8-of-what/comment-page-1/) | [0.001% on 2025-02-25](https://www.esa.int/ESA_Multimedia/Images/2025/02/Asteroid_2024_YR4_impact_risk_rises_and_falls) |
+
+The conformance responses are bounded recorded HTML and use no network. The connector validates
+the exact source type, canonical URI, title, publication date, target date, estimate statements,
+empty redirect chain, credential absence, public-address attestations, and operation-time order.
+Fractional source values are retained as exact decimal text at capture and transformed to numeric
+attributes by the declarative source-mapping module.
+
+The two organizations are independent official claimant publication roots. This audit does **not**
+claim independent measurements: both publications describe a shared international observation
+ecosystem, and source independence is only as strong as admitted lineage.
+
+## Accepted journey
+
+| Boundary | Historical | Corrected |
+|---|---:|---:|
+| Official cited records | 2 | 4 |
+| Brief claims | 8 | 8 |
+| Derived source families | 2 | 4 raw roots |
+| Case members | 4 | 12 |
+| PREPARED records | 0 | 0 |
+
+The corrected family closure retains four raw source-observation roots. Each explicit same-lineage
+supersession assertion collapses to its earlier same-source Observation, so a before/after pair does
+not manufacture a second family. The corrected `corroborated` claim is supported by exactly two
+families: the NASA and ESA revised-source assertions.
+
+## Supersession impact
+
+Each later source produces a distinct LIVE assertion Observation with:
+
+- one exact `supersedes` edge to its earlier same-source Observation;
+- one non-collapsing support edge to the captured later Observation;
+- the predecessor lineage identifier already present in the captured official-source payload; and
+- an explicit statement that impact means dependency, not falsehood.
+
+The two additive impact projections each enumerate five affected historical resources, seven
+affected Brief claims, and two unaffected resources. Both replay exactly. Four malformed vectors
+fail closed: cross-claimant target, missing target, future-leaking closure, and a record with no
+`supersedes` edge.
+
+## Exact identities
+
+| Artifact | Identity |
+|---|---|
+| Compiled pack | `pack_ir:bb400cc0652622b43c01504e651110e0` |
+| Historical Case | `case:9f2a90fa065e26aba4792c8cdd24647d` |
+| Historical Brief | `brief:c3549af0262b100ca65024ee19cbae6e` |
+| Historical status projection | `brief_derivation_family_status_projection:617cbe6102c82b13dcbe35735d685355` |
+| NASA impact projection | `supersession_impact_projection:8c397e0253ddbfce3a7045d2b4c9db81` |
+| ESA impact projection | `supersession_impact_projection:4c475c4dc1054e5a3d3c62699964fc9e` |
+| Corrected Case | `case:7298a4c57828df679d03b2ed6493b437` |
+| Corrected Brief | `brief:806d69d8e41f83f93ee3dc10f58f0d16` |
+| Corrected status projection | `brief_derivation_family_status_projection:2acb48dd15e625c4b729ecef484b0209` |
+
+## Guardrails
+
+- estimate divergence is not a truth verdict;
+- supersession impact is dependency, not falsehood;
+- earlier records, Cases, Briefs, claims, and statuses are never rewritten;
+- the Domain Pack contains JSON only and grants only source-read requests;
+- the conformance transport is recorded and makes no freshness claim;
+- no Decision, Outcome, feedback, monitor, schedule, delivery, persuasion, publication, or other
+ external action is created.
+
+## Verification
+
+- focused pack, journey, connector, negative, replay, and separation tests: **21 passed**;
+- complete World domain suite: **90 passed**;
+- complete separately packaged connector suite: **80 passed**;
+- root release-contract suite: **7 passed**;
+- static lint and formatting checks over every changed Python boundary: passed;
+- root sdist and wheel: built successfully;
+- wheel payload: exactly **55 JSON resources**, including nine planetary-defense resources, with no
+ `.py`, `.pyc`, `.so`, or `.pyd` payload.
diff --git a/docs/design/world-intelligence-p2d-live-conflict-correction-work-packet-v1.md b/docs/design/world-intelligence-p2d-live-conflict-correction-work-packet-v1.md
new file mode 100644
index 0000000..da175fd
--- /dev/null
+++ b/docs/design/world-intelligence-p2d-live-conflict-correction-work-packet-v1.md
@@ -0,0 +1,78 @@
+# P2D work packet — LIVE conflict, correction, and supersession
+
+**Status:** frozen implementation packet
+
+**Mode:** LIVE only; PREPARED material is excluded
+**Scenario:** official 2024 YR4 Earth-impact estimates published by NASA and ESA
+
+## Product claim
+
+Recorded, network-free captures from two independently governed official publication roots are
+admitted through ACE as LIVE Observations. A configured numeric detector makes the dated estimate
+divergence visible as a Shift and routed Signal. A LIVE Case and cited Reality Brief preserve that
+historical view. Later official estimates are then admitted as new LIVE records, explicit
+supersession assertions name the exact earlier same-source records, and additive impact projections
+show which historical resources and claims depended on them. A second LIVE Case and Reality Brief
+make the revisions and the earlier divergence visible without rewriting any prior artifact.
+
+This packet treats a percentage difference as a **dated estimate divergence**, not a truth verdict.
+It treats supersession impact as **dependency, not falsehood**. The NASA and ESA publication roots
+are independent claimant lineages; they are not independent measurements because both agencies
+describe a shared international observation ecosystem.
+
+## Frozen official-source material
+
+| Lineage | Earlier publication | Later publication | Exact quantitative claim |
+|---|---|---|---:|
+| NASA Planetary Defense / JPL CNEOS | 2025-02-07 | 2025-02-24 | 2.3% → 0.004% |
+| ESA Planetary Defence Office | 2025-02-06 | 2025-02-25 | 1.8% → 0.001% |
+
+All four accepted conformance responses are bounded recorded HTML and perform no network request.
+The separately packaged connector validates exact canonical URI, title, date, claimant, estimate,
+target date, network attestations, and payload bounds before returning inert canonical JSON.
+
+## Required durable journey
+
+1. Admit the NASA and ESA earlier publications as exact LIVE source transactions.
+2. Derive the configured cross-source estimate-divergence Shift and routed Signal.
+3. Append an immutable historical LIVE Case, cited Reality Brief, and per-claim status projection.
+4. Admit the two later official publications as new LIVE source transactions.
+5. Append one explicit LIVE supersession assertion per claimant. Each assertion carries an exact
+ `supersedes` edge to the earlier same-source Observation and a non-collapsing support edge to the
+ later source Observation.
+6. Project and append exact LIVE dependency impact for both historical Observations, including
+ affected Brief claims, unaffected resources, and preserved historical artifact identities.
+7. Derive the two configured downward-revision Shifts and routed Signals.
+8. Append a corrected LIVE Case, four-citation Reality Brief, and family-aware per-claim status
+ projection. The Brief must visibly distinguish admitted records, dated divergence, later
+ revisions, bounded inference, and unknowns.
+
+## Acceptance boundaries
+
+- The new Domain Pack is JSON-only, inert, and additive. No existing pack or fixture is modified.
+- The store contains LIVE records only: PREPARED count must remain exactly zero.
+- Every source capture and exact replay performs one adapter/transport call total per URI.
+- NASA and ESA remain separate derived source families; each same-source supersession collapses to
+ the earlier record in its own family and never manufactures corroboration.
+- The historical Case, Brief, and status projection retain exact identity after corrections arrive
+ and reopen byte-identically.
+- Both impact projections are durable, additive, exact-replayable, and report dependency rather
+ than falsehood.
+- No Decision, Outcome, delivery, publication, persuasion, monitor, schedule, or external action is
+ created.
+
+## Negative vectors
+
+- a supersession edge naming the other claimant's record fails closed;
+- a supersession target omitted from the authorized closure fails closed;
+- a closure containing future material fails closed;
+- an asserted `derived_from` edge is not accepted as a supersession cause;
+- same-lineage before/after records cannot satisfy the two-family `corroborated` status;
+- malformed URI, title, date, estimate, target date, redirect, credential use, private address, or
+ capture-time order fails at the connector boundary.
+
+## Verification before publication work
+
+Run focused pack, adapter, journey, negative, replay, PREPARED/LIVE separation, full domain,
+release-contract, connector, lint, format, sdist, and wheel-payload gates. Do not commit, push,
+publish, tag, or open a pull request until all local verification is complete.
diff --git a/domain_packs/tests/test_world_intelligence_p2d_live_conflict_correction.py b/domain_packs/tests/test_world_intelligence_p2d_live_conflict_correction.py
new file mode 100644
index 0000000..bb14f0a
--- /dev/null
+++ b/domain_packs/tests/test_world_intelligence_p2d_live_conflict_correction.py
@@ -0,0 +1,63 @@
+from __future__ import annotations
+
+import json
+from pathlib import Path
+
+import pytest
+
+from scripts.p2d_live_conflict_correction import run_acceptance
+
+REPO_ROOT = Path(__file__).resolve().parents[2]
+EXPECTED_PATH = (
+ REPO_ROOT / "domain_packs" / "world_intelligence_planetary_defense" / "conformance" / "p2d_live_expected.json"
+)
+
+
+@pytest.mark.asyncio
+async def test_live_conflict_correction_supersession_reaches_status_aware_brief() -> None:
+ result = await run_acceptance()
+ expected = json.loads(EXPECTED_PATH.read_text(encoding="utf-8"))
+
+ assert result["pack"] | {} == {
+ **expected["pack"],
+ "json_only": True,
+ }
+ assert result["source"]["lineages"] == expected["source"]["lineages"]
+ assert result["source"]["probabilities"] == expected["source"]["probabilities"]
+ assert result["source"]["stable_entity_ref"] is True
+ assert result["source"]["adapter_capture_calls"] == {"NASA": 2, "ESA": 2}
+ assert set(result["source"]["transport_calls"].values()) == {1}
+ assert result["source"]["network_access"] is False
+
+ for key, value in expected["historical"].items():
+ assert result["historical"][key] == value
+ assert result["historical"]["shift_type"] == "official_estimate_divergence"
+ assert result["historical"]["signal_type"] == ("planetary_defense_estimate_divergence")
+ assert result["historical"]["status_replay_exact"] is True
+
+ for key, value in expected["correction"].items():
+ assert result["correction"][key] == value
+ assert result["correction"]["impact_replay_exact"] is True
+ assert result["correction"]["impact_is_dependency_not_falsehood"] is True
+ assert all(item["rejected"] for item in result["correction"]["negative_vectors"].values())
+
+ for key, value in expected["corrected"].items():
+ assert result["corrected"][key] == value
+ assert result["corrected"]["shift_types"] == ["official_estimate_downward_revision"]
+ assert result["corrected"]["signal_types"] == ["planetary_defense_estimate_revision"]
+ assert result["corrected"]["status_replay_exact"] is True
+ assert result["corrected"]["same_lineage_supersessions_collapse"] is True
+ assert result["corrected"]["corroborated_claim_family_count"] == 2
+
+ assert result["historical_integrity"] == {
+ "brief_id_unchanged": True,
+ "brief_precedes_corrections": True,
+ "brief_reopened_identically": True,
+ "historical_artifact_rewritten": False,
+ }
+ assert result["separation"] == {
+ **expected["separation"],
+ "prepared_material_reused": False,
+ "autonomous_publication": False,
+ "external_action": False,
+ }
diff --git a/domain_packs/tests/test_world_intelligence_planetary_defense_pack.py b/domain_packs/tests/test_world_intelligence_planetary_defense_pack.py
new file mode 100644
index 0000000..07a828f
--- /dev/null
+++ b/domain_packs/tests/test_world_intelligence_planetary_defense_pack.py
@@ -0,0 +1,38 @@
+from __future__ import annotations
+
+import json
+from pathlib import Path
+
+from scripts.p2d_live_conflict_correction import compile_planetary_defense_pack
+
+REPO_ROOT = Path(__file__).resolve().parents[2]
+PACK_ROOT = REPO_ROOT / "domain_packs" / "world_intelligence_planetary_defense"
+
+
+def test_planetary_defense_pack_is_inert_json_only_and_exactly_pinned() -> None:
+ pack = compile_planetary_defense_pack()
+ expected = json.loads((PACK_ROOT / "conformance" / "p2d_live_expected.json").read_text(encoding="utf-8"))["pack"]
+
+ assert pack.compiled_pack_id == expected["compiled_pack_id"]
+ assert pack.pack_digest == expected["pack_digest"]
+ assert len(pack.modules) == expected["module_count"]
+ assert all(path.suffix == ".json" for path in PACK_ROOT.rglob("*") if path.is_file())
+ assert not tuple(PACK_ROOT.rglob("*.py"))
+
+
+def test_planetary_defense_pack_declares_conflict_revision_status_and_no_action() -> None:
+ pack = compile_planetary_defense_pack()
+ contracts = {module.contract for module in pack.modules}
+ manifest = json.loads((PACK_ROOT / "manifest.json").read_text(encoding="utf-8"))
+
+ assert contracts == {
+ "ace.intelligence.detection/v1alpha2",
+ "ace.intelligence.epistemic-status/v1alpha2",
+ "ace.intelligence.ontology/v1alpha1",
+ "ace.intelligence.personas/v1alpha1",
+ "ace.intelligence.source-mapping/v1alpha1",
+ "ace.intelligence.synthesis/v1alpha2",
+ }
+ assert {item["authority"] for item in manifest["authority_requests"]} == {"source_read"}
+ assert "action" not in json.dumps(manifest).lower()
+ assert "delivery" not in json.dumps(manifest).lower()
diff --git a/domain_packs/world_intelligence_planetary_defense/conformance/p2d_live_conflict_correction_input.json b/domain_packs/world_intelligence_planetary_defense/conformance/p2d_live_conflict_correction_input.json
new file mode 100644
index 0000000..f6fccad
--- /dev/null
+++ b/domain_packs/world_intelligence_planetary_defense/conformance/p2d_live_conflict_correction_input.json
@@ -0,0 +1,163 @@
+{
+ "contract": "ace.world-intelligence.p2d-live-conflict-correction-input/v1alpha1",
+ "fixture_id": "planetary_defense_2024_yr4_live_revision",
+ "fixture_version": "0.1.0",
+ "product_id": "product:world-planetary-defense",
+ "actor_ref": "actor:world-planetary-defense-researcher",
+ "activation_key": "world_intelligence_planetary_defense_live",
+ "entity_ref": "entity:planetary-defense/2024-yr4-earth-impact-2032",
+ "entity_type_id": "planetary_defense_risk_estimate",
+ "subject_binding_id": "published_planetary_defense_estimate",
+ "authentication": {
+ "receipt_ref": "authentication_receipt:world-planetary-defense-p2d",
+ "receipt_digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "authenticated_at": "2026-08-11T17:50:00Z",
+ "expires_at": "2026-08-11T20:30:00Z"
+ },
+ "activation": {
+ "overlay_id": "world_planetary_defense_p2d_conformance",
+ "overlay_version": "0.1.0",
+ "approval_receipt_ref": "approval_receipt:world-planetary-defense-p2d",
+ "compilation_receipt_ref": "compilation_receipt:world-planetary-defense-p2d",
+ "conformance_receipt_ref": "conformance_receipt:world-planetary-defense-p2d",
+ "occurred_at": "2026-08-11T17:55:00Z",
+ "committed_at": "2026-08-11T17:56:00Z"
+ },
+ "claimants": [
+ {
+ "claimant_org": "NASA",
+ "source_type_ref": "nasa_planetary_defense_publication",
+ "capability_requirement_id": "nasa_planetary_defense_snapshot",
+ "authority_request_id": "read_nasa_planetary_defense_publication",
+ "configuration_ref": "config:nasa-planetary-defense-2024-yr4",
+ "configuration_digest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+ "grant_ref": "authority_grant:world-nasa-planetary-defense-read",
+ "grant_hash": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+ "artifact_digest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
+ },
+ {
+ "claimant_org": "ESA",
+ "source_type_ref": "esa_planetary_defence_publication",
+ "capability_requirement_id": "esa_planetary_defence_snapshot",
+ "authority_request_id": "read_esa_planetary_defence_publication",
+ "configuration_ref": "config:esa-planetary-defence-2024-yr4",
+ "configuration_digest": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+ "grant_ref": "authority_grant:world-esa-planetary-defence-read",
+ "grant_hash": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "artifact_digest": "sha256:1111111111111111111111111111111111111111111111111111111111111111"
+ }
+ ],
+ "sources": [
+ {
+ "source_key": "esa_initial",
+ "claimant_org": "ESA",
+ "mapping_id": "esa_2024_yr4_2025_02_06",
+ "source_definition_ref": "source_definition:esa-2024-yr4-2025-02-06",
+ "idempotency_key": "live-source:planetary-defense:esa:2025-02-06",
+ "requested_at": "2026-08-11T18:00:00Z",
+ "capture_started_at": "2026-08-11T18:00:01Z",
+ "observed_at": "2026-08-11T18:00:02Z",
+ "captured_at": "2026-08-11T18:00:03Z",
+ "rechecked_at": "2026-08-11T18:00:04Z",
+ "admitted_at": "2026-08-11T18:00:05Z",
+ "requested_uri": "https://blogs.esa.int/rocketscience/2025/02/06/2024-yr4-flyby-geometry-or-1-8-of-what/comment-page-1/",
+ "locator": "css:article",
+ "media_type": "text/html",
+ "response_body": "
2024 YR4 flyby geometry, or 1.8% of What?
The risk of 2024 YR4 impacting Earth on 22 December 2032 is 1.8% and the numerical value is expected to evolve as additional observations are reported.