diff --git a/AGENTS.md b/AGENTS.md index 67837d1fa..82e594adf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -99,6 +99,7 @@ A skipped security, GPU, browser, TLS, or statistical test is not passing eviden ## Documentation and research - Update `docs/doctoring.md` when a standard or research claim affects design. +- Refreshing the volatile product-gap baseline requires paginated live PR and issue counts, full exact heads, and the matching `CHANGELOG.md` inventory line; run its documentation contracts before publication. A local browser policy that blocks loopback or file rendering is not visual evidence—inspect the GitHub-rendered exact head after push instead. - Use primary specifications, official documentation, or peer-reviewed/primary papers. - Format references in APA 7th style. - Update an ADR for binding architectural changes. @@ -131,6 +132,7 @@ A release requires all current-head checks, complete coverage and docs, updated - When updating a delivery checkpoint, separate a verified predecessor from a newer pending head. A passing coverage summary does not validate a fixture that ignores peer errors; preserve the failing reproduction and the repaired wire-level assertions in the evidence trail. - A live-inventory contract must update its dated baseline, `CHANGELOG.md`, and full exact SHA together. Use `scripts/ci/collect_live_merge_evidence.sh` for reusable head/base evidence; do not infer current state from an abbreviated SHA or a historical inventory line. +- A regression that verifies a dated baseline cut must select that named cut, not assume it remains the latest heading after a newer live cut is added; run the full Python repository contract suite after changing cut markers. - Keep the delivery baseline decision-sized: GitHub truncates large Markdown code blocks. Link the canonical executable evidence collector instead of copying it into the rendered baseline, and keep its contract test pointed at that executable source. - Add concise, reproducible lessons here as work establishes them. Keep transient heads, job IDs and incident snapshots in PR evidence, not permanent instructions; never record secret values. diff --git a/CHANGELOG.md b/CHANGELOG.md index 23635db9a..84b262257 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to OriginWeave are documented in this file. The format follo ## [Unreleased] +- Recorded #298/#305's repaired reduced-motion command contract while keeping + its Draft-only checks and missing Chromium runtime evidence explicit. + +- Repaired the dated product-gap checkpoint contract so historical verification + remains bounded after a newer live cut is added. + - Replaced the truncated inline merge-evidence command copy with its canonical executable collector and kept the collector's exact-head contract under test. - Recorded #255 exact-head hosted success and #293's narrow standard-BiDi capability, typed command planning, dated-TR provenance pin, and explicit viewport/DPR cleanup intent, preserving exact-head visual, rustdoc-view, transport, and real-browser evidence gaps. @@ -30,7 +36,8 @@ All notable changes to OriginWeave are documented in this file. The format follo - Recorded the verified pointer-reply connection repair and recovery tests, keeping pending hosted checks, remaining authority gaps and browser acceptance separate. - Recorded the published text-entry connection safeguards and their test evidence, separating queued hosted checks and remaining pointer/status repairs from released browser behavior. - Separate the current maintenance queue and source lineage from preserved historical observations, and record the text-entry session and pending-request safeguards without claiming released browser behavior. -- Current delivery inventory: 126 open pull requests (12 ready, 114 draft); 14 open non-PR issues. Observed 2026-09-08; source acceptance remains revision-specific. +- Current delivery inventory: 131 open pull requests (14 ready, 117 draft); 14 open non-PR issues. Observed 2026-09-09; source acceptance remains revision-specific. +- Clarified that the active presentation-evidence harness is implemented while its failed browser run does not establish product runtime or release acceptance. - Corrected historical checkpoint labels and made the current inventory check reject stale counts; recorded verified text-input parent adoption without claiming browser execution. - Recorded the executed session-isolation repair and its verified adoption, separating complete local checks and PR visual inspection from pending hosted checks and unreleased browser acceptance. - Recorded the current click safeguards, restored regression coverage and completed PR visual inspection, keeping the separately owned parent repair and queued hosted checks distinct from delivery. diff --git a/CLAUDE.md b/CLAUDE.md index 1c762e5ca..e7644487c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,5 +12,7 @@ Additional constraints: - Do not add hostname reconnect, proxy-environment inheritance, dangerous certificate-verifier hooks, Common Name fallback, TLS 0-RTT, key logging, or secret extraction to a production TLS path. - Keep changes bounded to one product gap and preserve modular crate boundaries. - Never claim a test, benchmark, browser integration, TLS identity, GPU execution, release, or merge succeeded without current exact-head evidence. +- For volatile gap-baseline refreshes, bind the dated inventory, full PR heads, and `CHANGELOG.md` line to the same live observation; if local rendering is blocked, visually inspect the GitHub-rendered exact head after push. - When refreshing live delivery evidence, update the dated baseline, `CHANGELOG.md`, and full exact SHA atomically; use `scripts/ci/collect_live_merge_evidence.sh` rather than an abbreviated SHA or historical count. +- Date-bound baseline tests must locate their named checkpoint rather than assuming it remains the newest cut; run the complete Python contract suite after changing checkpoint markers. - Keep rendered delivery evidence concise: link the canonical collector rather than embedding its long shell body, because GitHub truncates oversized code blocks. diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index f1b462277..c4a87e6c7 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -6,7 +6,45 @@ This is a dated delivery baseline, not a substitute for the PRD, TRD, roadmap, a This volatile section is refreshed from live GitHub state and is authoritative only for the exact observations recorded here. The dated snapshot below remains historical evidence and is not promoted to current acceptance evidence. Live GitHub PR/base/head/check APIs are authoritative over PR bodies and prior maintenance prose; a body that still names an older head is stale evidence, not merge evidence. -### Latest verified cut: 2026-09-08 +### Latest verified cut: 2026-09-09 + +#### Presentation identity and controlled-browser evidence + +At `2026-09-09T08:49:58Z`, the live inventory was **131 open pull requests: +14 Ready/non-draft and 117 Draft; 14 open non-PR issues**. Protected `main` +remains `87c4daa1830bac5a5228b6036752ad5633232085`; no GitHub Release exists. +Ruleset `18156473` still requires one counted approval and seven central required +workflows. Queued reviewer evidence is non-passing: discard queued, skipped, +cancelled, absent, predecessor, synthetic, status-only, and model-only evidence. + +Issue #292 remains the buyer-visible presentation-identity gap. Draft #293 is +at exact head `6855e2578ae94279cc9ab4a14527b016e8c049ee` on Ready #229 +`024f63690cf05cfe6f0d4a430f0e18ea8fd2c4d6`. Its reusable lifecycle deliberately +does not apply reduced motion without a complete restore or disposable-context +owner. Thus command planning cannot be presented as full profile application. +Draft successor #298 is at exact head +`d01f45c2c8ac7b0fc4dbc3d3ada60238732cdf8c` on that #293 head. Its non-force +merge of #305 repaired an older source contract so it now asserts both that +ReducedMotion remains a discoverable protocol capability and that the reusable +planner exposes no media-mutation command. This removes an API/documentation +contradiction only; #298's Draft checks are skipped and it does not establish +live Chromium transport, page observation, cleanup, protected-main shipment, +or release acceptance. +An active controlled evidence harness is implemented, but it does not establish a +product Browser Session adapter: its exact browser lane failed 0/3 at session +creation before navigation, so application, page-observed post-conditions, cleanup +acceptance, and release remain unproven. Issue #212 owns the sandbox-helper contract; +the product branch must consume it rather than copy or weaken workflow behavior. + +#### Transport-closure verification and test-integrity repair + +The current queue also leaves Ready #287 at +`3975daf48e01a5e9d1cf9fb104a3be1aa03b0402` with exact-head native and central +checks queued. Its prior CodeQL dispatch outcome was an absent central verdict, +not a classifier-source finding. No release, protected-main shipment, or approval +is inferred from local work, a child merge, or queued checks. + +### Previous verified cut: 2026-09-08 #### Published intent acknowledgment verification diff --git a/tests/test_documentation_active_pr_evidence_contract.py b/tests/test_documentation_active_pr_evidence_contract.py index f319c48a3..a0d2ff3d0 100644 --- a/tests/test_documentation_active_pr_evidence_contract.py +++ b/tests/test_documentation_active_pr_evidence_contract.py @@ -88,19 +88,12 @@ def test_baseline_refresh_changelog_matches_the_live_snapshot(self) -> None: refresh_lines = [line for line in added.splitlines() if line.startswith(refresh_prefix)] self.assertEqual(1, len(refresh_lines)) refresh_line = refresh_lines[0] - self.assertIn("on 2026-09-05", refresh_line) latest_cut = bounded_section( self.baseline, - "### Latest verified cut: 2026-09-08", - "### Historical verified cut: 2026-09-07", + "### Latest verified cut: 2026-09-09", + "### Previous verified cut: 2026-09-08", ) - current = bounded_section( - latest_cut, - "#### Transport-closure verification and test-integrity repair", - "### Historical verified cut: 2026-09-07", - ) if "### Historical verified cut: 2026-09-07" in latest_cut else latest_cut.split( - "#### Transport-closure verification and test-integrity repair", 1 - )[1] + current = latest_cut queue_counts = re.findall( r"\*\*(\d+) open pull requests: (\d+) Ready/non-draft and (\d+) Draft; " r"(\d+) open non-PR issues\*\*", @@ -115,9 +108,7 @@ def test_baseline_refresh_changelog_matches_the_live_snapshot(self) -> None: self.assertEqual(1, len(inventory_lines)) self.assertIn(f"{total} open pull requests ({ready} ready, {draft} draft)", inventory_lines[0]) self.assertIn(f"{issues} open non-PR issues", inventory_lines[0]) - self.assertIn("024f63690cf05cfe6f0d4a430f0e18ea8fd2c4d6", refresh_line) - self.assertIn("3a651967c421f77088fe25e86a63faae295390b3", refresh_line) - self.assertIn("01038ba71fb276426cc67f90a91a3c431e194db5", refresh_line) + self.assertIn("Observed 2026-09-09", inventory_lines[0]) self.assertIn( "Revalidated the active ruleset inventory at 7 required workflows", changed, @@ -135,13 +126,13 @@ def test_latest_inventory_drift_cannot_be_hidden_by_historical_counts(self) -> N """Changing only the newest count must invalidate an unchanged changelog.""" latest = bounded_section( self.baseline, - "### Latest verified cut: 2026-09-08", - "### Historical verified cut: 2026-09-07", + "### Latest verified cut: 2026-09-09", + "### Previous verified cut: 2026-09-08", ) - self.assertIn("126 open pull requests", latest) + self.assertIn("131 open pull requests", latest) mutated_latest = latest.replace( - "126 open pull requests", - "127 open pull requests", + "131 open pull requests", + "132 open pull requests", 1, ) self.assertNotEqual(latest, mutated_latest) diff --git a/tests/test_live_gap_evidence_integrity_contract.py b/tests/test_live_gap_evidence_integrity_contract.py index fe5ba4b02..998be0669 100644 --- a/tests/test_live_gap_evidence_integrity_contract.py +++ b/tests/test_live_gap_evidence_integrity_contract.py @@ -33,14 +33,14 @@ def setUpClass(cls) -> None: cls.evidence = EVIDENCE_SCRIPT.read_text(encoding="utf-8") cls.latest = bounded( cls.baseline, - "### Latest verified cut: 2026-09-08", - "### Historical verified cut: 2026-09-07", + "### Latest verified cut: 2026-09-09", + "### Previous verified cut: 2026-09-08", ) - def test_latest_inventory_and_changelog_use_the_september_8_cut(self) -> None: + def test_latest_inventory_and_changelog_use_the_september_9_cut(self) -> None: marker = ( - "126 open pull requests: 12 Ready/non-draft and " - "114 Draft; 14 open non-PR issues" + "131 open pull requests: 14 Ready/non-draft and " + "117 Draft; 14 open non-PR issues" ) self.assertIn(marker, " ".join(self.latest.split())) inventory = [ @@ -49,14 +49,28 @@ def test_latest_inventory_and_changelog_use_the_september_8_cut(self) -> None: if line.startswith("- Current delivery inventory:") ] self.assertEqual(1, len(inventory)) - self.assertIn("126 open pull requests (12 ready, 114 draft)", inventory[0]) + self.assertIn("131 open pull requests (14 ready, 117 draft)", inventory[0]) self.assertIn("14 open non-PR issues", inventory[0]) - self.assertIn("Observed 2026-09-08", inventory[0]) + self.assertIn("Observed 2026-09-09", inventory[0]) def test_presentation_snapshot_uses_full_exact_sha(self) -> None: - full_sha = "0c077445d73640a6299ea4d379faa4b0ab0226c2" + full_sha = "6855e2578ae94279cc9ab4a14527b016e8c049ee" self.assertIn(full_sha, self.latest) - self.assertNotIn("to exact head\n`0c077445`", self.latest) + self.assertNotIn("to exact head\n`6855e257`", self.latest) + + def test_active_presentation_harness_is_not_described_as_unimplemented(self) -> None: + normalized = " ".join(self.latest.split()) + self.assertIn("active controlled evidence harness is implemented", normalized) + self.assertIn("failed 0/3 at session creation before navigation", normalized) + self.assertIn("product Browser Session adapter", normalized) + + def test_presentation_successor_records_its_repaired_contract_boundary(self) -> None: + """Keep the active child repair distinct from browser-runtime acceptance.""" + normalized = " ".join(self.latest.split()) + self.assertIn("Draft successor #298", normalized) + self.assertIn("d01f45c2c8ac7b0fc4dbc3d3ada60238732cdf8c", normalized) + self.assertIn("#305", normalized) + self.assertIn("does not establish live Chromium transport", normalized) def test_documented_current_evidence_collector_is_executable(self) -> None: current_evidence = self.baseline.split("## Evidence commands", 1)[1] diff --git a/tests/test_product_completion_gap_contract.py b/tests/test_product_completion_gap_contract.py index 2485d3f3b..970c9c189 100644 --- a/tests/test_product_completion_gap_contract.py +++ b/tests/test_product_completion_gap_contract.py @@ -70,8 +70,8 @@ def test_close_code_checkpoint_does_not_claim_hosted_acceptance(self) -> None: def test_closure_checkpoint_separates_verified_and_pending_heads(self) -> None: current = bounded_section( BASELINE.read_text(encoding="utf-8"), - "### Latest verified cut: 2026-09-08", - "### Historical verified cut: 2026-09-07", + "### Previous verified cut: 2026-09-08", + "## Observed snapshot: 2026-08-29", ) for marker in ( "d126242c7198c447d0fab7983d529441340fd1c9",