From 7295172f1e19fa24a4e6dbb23f3d4085bcc545ea Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 27 Sep 2026 17:20:43 +0200 Subject: [PATCH] Close local review loose ends and record blocked workplan gates Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a0e241-8285-7a63-8c0c-51c9cb824dc3 --- SCOPE.md | 6 +- history/2026-09-27-workplan-closeout.md | 42 +++++++ reference/README.md | 24 ++++ reference/releases.json | 10 ++ research/evolution/EvolutionReport.md | 4 +- research/evolution/README.md | 6 +- research/evolution/profiles.json | 116 +++++++++++------ research/plan/ResearchProgram.md | 6 +- research/reviews/M2-CoverageReview.md | 118 ++++++++++++++++++ research/reviews/ReviewDateReconciliation.md | 38 ++++++ scripts/reference_preview.py | 74 +++++++---- scripts/research_evolution.py | 7 +- templates/PatternUseReceipt.yaml | 6 +- tests/test_reference_preview.py | 52 +++++++- tests/test_research_evolution.py | 3 + .../FEP-WP-0002-seed-language-validation.md | 13 +- workplans/FEP-WP-0003-contrasting-schools.md | 20 ++- workplans/FEP-WP-0004-reference-surface.md | 16 ++- workplans/FEP-WP-0006-language-evolution.md | 13 ++ .../FEP-WP-0008-use-driven-improvement.md | 31 ++++- 20 files changed, 510 insertions(+), 95 deletions(-) create mode 100644 history/2026-09-27-workplan-closeout.md create mode 100644 reference/README.md create mode 100644 reference/releases.json create mode 100644 research/reviews/M2-CoverageReview.md create mode 100644 research/reviews/ReviewDateReconciliation.md diff --git a/SCOPE.md b/SCOPE.md index 755b53c..9e87365 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -81,7 +81,7 @@ for current counts and evidence limits; [REVIEW.md](REVIEW.md) preserves the ini [WP-0002](workplans/FEP-WP-0002-seed-language-validation.md) owns seed evidence, connected-corpus validation and M1. [WP-0003](workplans/FEP-WP-0003-contrasting-schools.md) owns contrasting streams, broader walkthroughs, ontology decisions and M2. -[WP-0004](workplans/FEP-WP-0004-reference-surface.md) is proposed follow-up for graph, +[WP-0004](workplans/FEP-WP-0004-reference-surface.md) is blocked follow-up for graph, held-out retrieval and real-repository applicability, subject to its recorded gates. [WP-0006](workplans/FEP-WP-0006-language-evolution.md) owns ongoing learning visibility, review dates and comparable-cycle measurement. Actionable work stays in workplans; @@ -101,7 +101,9 @@ The user-directed [WP-0008](workplans/FEP-WP-0008-use-driven-improvement.md) con qualified reference use to evidence-bearing consumer receipts and bounded autonomous improvement. It owns discovery, instrumentation and execution integration; monthly human review owns operating-policy decisions. The capability entry is prepared; -hosted registration, automatic collection and unattended execution remain unverified. +automatic collection and three activity-core reporting schedules are operational. +Hosted consumer integration and admitted pattern-editing execution remain blocked; +there are no enrolled consumers yet. This operational loop can improve draft guidance without claiming M1/M2/M3 or independent-human validation. See the [operating design](docs/ReuseAndImprovementLoop.md). diff --git a/history/2026-09-27-workplan-closeout.md b/history/2026-09-27-workplan-closeout.md new file mode 100644 index 0000000..35e2029 --- /dev/null +++ b/history/2026-09-27-workplan-closeout.md @@ -0,0 +1,42 @@ +# Workplan closeout audit — 2026-09-27 + +User requested implementation of finishable local loose ends, no unnecessary new +work records, blocked states for blocked plans, then commit and sync. All eight +repository workplans were assessed; no new task or workplan was created. Historical +progress sections remain historical; the final closeout section gives current state. + +| Workplan | Result | Completed here / remaining acceptance | +| --- | --- | --- | +| FEP-WP-0001 | finished, unchanged | All bootstrap tasks already done | +| FEP-WP-0002 | blocked | T03 waits for independent usefulness and validated seed-case evidence; existing M1 review is revise/defer | +| FEP-WP-0003 | blocked | T03 complete: full M2 editorial/ontology review, all seventeen candidates and ten cases. T02 waits on M1; T01 source/reproduction work and T04 real storage/receiver investigation remain unfinished | +| FEP-WP-0004 | blocked | T01 waits on M1; T02/T03 wait on M2. Preview output cannot replace canonical/held-out/empirical acceptance | +| FEP-WP-0005 | finished, unchanged | Bench setup already delivered; adapter regression checks passed | +| FEP-WP-0006 | active | T03 review-date reconciliation complete; comparable-window assessment still needs useful prospective cycles under a shared protocol | +| FEP-WP-0007 | finished, unchanged | Published 0.1 preview preserved byte-for-byte | +| FEP-WP-0008 | blocked | T01 frozen-release isolation complete; hosted consumer integration, producer hook, real linked outcomes and admitted executor remain required | + +Local implementation adds a version/current registry and validates old publications +from their pinned Git objects, separately from live research validation. Regression +checks cover legitimate new research, stale live profiles and tampered publication +inputs. Fourteen unknown substantive-review dates now have original-artifact +provenance; the three existing dates are corroborated. Validation requires scoped +provenance and rejects dates later than their metadata assessment. Historical +baseline and published version are unchanged. + +The [M2 review](../research/reviews/M2-CoverageReview.md) closes delivery of the +editorial assessment with an explicit revise/defer result; it does not close M2. +The [date reconciliation](../research/reviews/ReviewDateReconciliation.md) adds no +learning cycle or fabricated effort. Six incomparable prospective groups cannot +satisfy the three-comparable-cycle trigger. + +Activity-core reporting and collection are operational with three enabled schedules; +no consumer is enrolled and no pattern-edit executor is admitted. Existing external +owners remain ACTIVITY-WP-0041 T03, GLAS-WP-0012 and HFACT-WP-0001. The October 1 +monthly reporting obligation remains, including empty/blocked evidence if unchanged. +No schedule, external deployment or sibling repository was changed by this audit. + +Verification: schema tests, bench adapter tests and synthetic bench plan; reference +and evolution tests; reference/evolution/classification consistency checks; changed +Markdown links and whitespace. The plan command makes no provider calls. These +checks validate repository contracts, not independent usefulness or live execution. diff --git a/reference/README.md b/reference/README.md new file mode 100644 index 0000000..76241ac --- /dev/null +++ b/reference/README.md @@ -0,0 +1,24 @@ +# Published reference versions + +[releases.json](releases.json) selects the current qualified preview (`0.1`) and pins +its packaging commit and manifest digest. Consumers record that version, commit and +digest in their use receipt. Candidate prose and other corpus inputs are resolved at +the manifest's `corpus_revision`; packaging documents and evidence locators are +resolved at the packaging revision. Relative links viewed on a moving branch can +show newer research: use a checkout or commit-specific source URL for a pinned read. + +Run `python3 scripts/reference_preview.py --check --version 0.1` to validate a +published version, or `make reference-check` for the current pointer. The local Git +object database must contain both pinned revisions; a shallow clone must fetch that +history first. Missing objects fail validation rather than substituting live files. + +`make evolution-check classification-check` separately validates current research. +A legitimate candidate/profile revision must pass those checks but must neither +rewrite nor invalidate the older export. Published manifest, development cases and +release documents are checked against their original packaging commit. Generated +outputs must match the pinned inputs. The registry is a reviewed publication index, +not a signature or an independent trust root; changing a release pin requires review. + +A future publication gets a new directory and registry entry. Move `current` only +once that publication is verified. The frozen preview remains a research hypothesis +catalog, not canonical admission or a held-out retrieval evaluation. diff --git a/reference/releases.json b/reference/releases.json new file mode 100644 index 0000000..aaf47bf --- /dev/null +++ b/reference/releases.json @@ -0,0 +1,10 @@ +{ + "schema_version": 1, + "current": "0.1", + "releases": { + "0.1": { + "packaging_revision": "53bb65e7a6eb1a2fa933e5b41dfa5a0e7409d14d", + "manifest_sha256": "d7f60ac04817820b805265d1d747cfbb8d2269b7bd6244cd9d3e8d2fd44ef0b8" + } + } +} diff --git a/research/evolution/EvolutionReport.md b/research/evolution/EvolutionReport.md index 53f510c..46d6951 100644 --- a/research/evolution/EvolutionReport.md +++ b/research/evolution/EvolutionReport.md @@ -22,7 +22,7 @@ Independent human profile reviews: 0/17. Full-contract independent-use counts un ## Change since baseline -Baseline baseline-2026-09-26; source revision `f273a190f0e08b8cfe0bb7260d0e7d889f1c090a`. Added: 0; removed: 0; shared candidates with changed content: 3; changed evidence/review assessments: 3; maturity transitions: 0. +Baseline baseline-2026-09-26; source revision `f273a190f0e08b8cfe0bb7260d0e7d889f1c090a`. Added: 0; removed: 0; shared candidates with changed content: 3; changed evidence/review assessments: 17; maturity transitions: 0. The shared cohort is compared separately from additions. Changed text or evidence counts are not learning gains. @@ -111,7 +111,7 @@ One bounded question counts at most one consequential outcome. Corroboration and Profile hashes and local references passed validation when this report was generated. That checks traceability, not source truth or external URL freshness. -Profiles with unknown last substantive review date: 14. Assessment dates record this metadata review, not a new substantive validation. No age-based freshness claim is available for those profiles. +Profiles with unknown last substantive review date: 0. Assessment dates record this metadata review, not a new substantive validation. Recorded substantive dates identify scoped author-model reviews, not renewed empirical or external-source freshness. Coherence metrics (ambiguous selections, unjustified relations and overlap resolved): not measured. Conflict Copy / Explicit Reconciliation overlap remains an explicit open question. diff --git a/research/evolution/README.md b/research/evolution/README.md index 64bb2e2..7afcd9f 100644 --- a/research/evolution/README.md +++ b/research/evolution/README.md @@ -36,6 +36,10 @@ The baseline is an author-model metadata assessment; no independent human review implied. `assessed_at` does not reset `last_substantive_review_date`: the latter is unknown until the evidence review's date and scope have been reconciled. Open limits include counterexamples and contexts still untested. Supersession is explicit. +Current profiles require `substantive_review_ref` and `substantive_review_scope` for +a known substantive date. The [reconciliation](../reviews/ReviewDateReconciliation.md) +records original evidence-review dates; a synthesis or metadata refresh does not +renew them. Historical snapshots retain their original schema-v1 assessments. ## Closing a bounded cycle @@ -73,7 +77,7 @@ Snapshot creation pins committed candidate content and refuses to overwrite a fi | Dimension | Observation to collect | Current limit | | --- | --- | --- | | Applicability | Reviewed decisions and failure contexts across the ten validation cases | Four synthetic/provisional walkthroughs; six planned | -| Trustworthiness | Scoped evidence, independent full-contract uses, unresolved contradictions, provenance and review age | Independent recurrence and substantive-review ages unassessed | +| Trustworthiness | Scoped evidence, independent full-contract uses, unresolved contradictions, provenance and review age | Independent recurrence unassessed; dated evidence-review provenance reconciled | | Usefulness | Constraint misses, unsupported recommendations, decision quality and time against equivalent prose | Frozen small model-reviewed pilot; human gate open | | Coherence | Ambiguous selections, redundant candidates and unjustified relations found/resolved in reviews | No measured baseline; reconciliation/copy overlap remains open | | Maintainability | Reference checks, overdue review obligations, remaining gaps and effort per revision | Local links/hash checks automated; age/backlog estimates not yet measured | diff --git a/research/evolution/profiles.json b/research/evolution/profiles.json index 53e117f..13535f6 100644 --- a/research/evolution/profiles.json +++ b/research/evolution/profiles.json @@ -26,11 +26,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "Authorized retention and export are separate decisions.", @@ -62,11 +64,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "No executed storage crash or backup test.", @@ -92,11 +96,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "Atomic supersession and retry contract proposed, not storage-tested." @@ -127,11 +133,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "Atomic resolution/provenance UI not executed.", @@ -175,11 +183,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "No native-unload, crash, multiple-tab or access-revocation guarantee.", @@ -217,11 +227,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "Distributed atomicity and complete frontend recurrence remain unverified.", @@ -271,11 +283,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "No production server deduplication or complete retention-window guarantee.", @@ -301,11 +315,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/M1-SeedReview.md", + "substantive_review_scope": "Editorial review of the connected core; M1 revise/defer." }, "gaps": [ "Read-your-write and acceptance/refresh distinction still proposed.", @@ -338,19 +354,19 @@ "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationHistoryExperiment.md", - "scope": "NH01–NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate." + "scope": "NH01\u2013NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate." }, { "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationOwnershipExperiment.md", - "scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." + "scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." }, { "kind": "static-code", "family": "Zulip", "ref": "research/reviews/ZulipNavigationSourceStudy.md", - "scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." + "scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." } ], "independent_full_contract_uses": null, @@ -359,7 +375,9 @@ "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": "2026-09-27" + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/ZulipNavigationSourceStudy.md", + "substantive_review_scope": "Static navigation contrast; partial mechanisms, not independent full-contract use." }, "gaps": [ "Independent application recurrence and human/AT validation remain unverified.", @@ -393,25 +411,25 @@ "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationHistoryExperiment.md", - "scope": "NH01–NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate." + "scope": "NH01\u2013NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate." }, { "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationFocusExperiment.md", - "scope": "NF01–NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech." + "scope": "NF01\u2013NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech." }, { "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationOwnershipExperiment.md", - "scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." + "scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." }, { "kind": "static-code", "family": "Zulip", "ref": "research/reviews/ZulipNavigationSourceStudy.md", - "scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." + "scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." } ], "independent_full_contract_uses": null, @@ -420,7 +438,9 @@ "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": "2026-09-27" + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/ZulipNavigationSourceStudy.md", + "substantive_review_scope": "Static navigation contrast; partial mechanisms, not independent full-contract use." }, "gaps": [ "Independent application recurrence and human/AT validation remain unverified.", @@ -447,11 +467,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/PatternBreadthExpansion.md", + "substantive_review_scope": "Source normalization, decision probes and counterexamples." }, "gaps": [ "No executed model/view integration or independently reviewed full-contract use." @@ -476,11 +498,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/PatternBreadthExpansion.md", + "substantive_review_scope": "Source normalization, decision probes and counterexamples." }, "gaps": [ "Snapshot coherence and changed-locale cache test still planned." @@ -511,11 +535,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/FeatureDeploymentBoundaries.md", + "substantive_review_scope": "Static feature/import versus release-boundary assessment." }, "gaps": [ "Build/import enforcement not executed.", @@ -541,11 +567,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/PatternBreadthExpansion.md", + "substantive_review_scope": "Source normalization, decision probes and counterexamples." }, "gaps": [ "No executed island fixture, performance comparison or complete recurrence study." @@ -576,11 +604,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/BoundaryRecoveryExperiment.md", + "substantive_review_scope": "Authored runtime fixture and failure-class interpretation." }, "gaps": [ "Synthetic host, not full application recurrence.", @@ -619,19 +649,19 @@ "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationFocusExperiment.md", - "scope": "NF01–NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech." + "scope": "NF01\u2013NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech." }, { "kind": "runtime", "family": "htmx in authored public-catalog fixture", "ref": "research/reviews/NavigationOwnershipExperiment.md", - "scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." + "scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter." }, { "kind": "static-code", "family": "Zulip", "ref": "research/reviews/ZulipNavigationSourceStudy.md", - "scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." + "scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence." } ], "independent_full_contract_uses": null, @@ -640,7 +670,9 @@ "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": "2026-09-27" + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/ZulipNavigationSourceStudy.md", + "substantive_review_scope": "Static navigation contrast; partial mechanisms, not independent full-contract use." }, "gaps": [ "One implementation family; repeated trials are not independent uses.", @@ -686,11 +718,13 @@ ], "independent_full_contract_uses": null, "review": { - "assessed_at": "2026-09-26", + "assessed_at": "2026-09-27", "reviewer": "Codex", "role": "author-model", "independent_human": false, - "last_substantive_review_date": null + "last_substantive_review_date": "2026-09-26", + "substantive_review_ref": "research/reviews/ActivationConflictsAndReload.md", + "substantive_review_scope": "Authored activation/reload experiment and guarantee limits." }, "gaps": [ "No upstream deployment or real team/release-independence validation.", diff --git a/research/plan/ResearchProgram.md b/research/plan/ResearchProgram.md index 1fe1566..a7f4fc4 100644 --- a/research/plan/ResearchProgram.md +++ b/research/plan/ResearchProgram.md @@ -332,9 +332,9 @@ Workplan files own execution status. This table defines intended outcomes. | Phase | Work record | Deliverable and exit criterion | | --- | --- | --- | | M0 — Scaffold | FEP-WP-0001, finished | Intent, repository structure and State Hub integration exist. | -| M1 — Seed investigation | [FEP-WP-0002](../../workplans/FEP-WP-0002-seed-language-validation.md), active | Reconciled schema; first source case and local-first contrast; 6–10 connected draft patterns; two completed case walkthroughs with evidence and counterexamples. | -| M2 — Broaden and challenge | [FEP-WP-0003](../../workplans/FEP-WP-0003-contrasting-schools.md), active (bounded exploration; M1 open) | Evidence from all six streams; coverage matrix for all ten application types; revise, merge or reject candidates; complete at least four further contrasting cases. | -| M3 — Retrieval and empirical use | [FEP-WP-0004](../../workplans/FEP-WP-0004-reference-surface.md), proposed | Validated metadata and graph export; held-out retrieval cases; at least two real repository studies tied to revisions; publish limitations. | +| M1 — Seed investigation | [FEP-WP-0002](../../workplans/FEP-WP-0002-seed-language-validation.md), blocked (independent evidence) | Reconciled schema; first source case and local-first contrast; 6–10 connected draft patterns; two completed case walkthroughs with evidence and counterexamples. | +| M2 — Broaden and challenge | [FEP-WP-0003](../../workplans/FEP-WP-0003-contrasting-schools.md), blocked (M1 open; bounded exploration permitted) | Evidence from all six streams; coverage matrix for all ten application types; revise, merge or reject candidates; complete at least four further contrasting cases. | +| M3 — Retrieval and empirical use | [FEP-WP-0004](../../workplans/FEP-WP-0004-reference-surface.md), blocked (M1/M2 prerequisites) | Validated metadata and graph export; held-out retrieval cases; at least two real repository studies tied to revisions; publish limitations. | M1 does not require a large catalog. Six to ten patterns is a working scope cap, not a maturity score. Expand toward the original 20–30 candidate ambition only diff --git a/research/reviews/M2-CoverageReview.md b/research/reviews/M2-CoverageReview.md new file mode 100644 index 0000000..cea6dfe --- /dev/null +++ b/research/reviews/M2-CoverageReview.md @@ -0,0 +1,118 @@ +# M2 coverage and ontology review + +Reviewed 2026-09-27 by Codex, author-model, under FEP-WP-0003 T03. +**M2 result: revise/defer; not passed.** This completes the current editorial review, +not the evidence gate. It assesses all seventeen candidates and all ten case briefs +against the [research program](../plan/ResearchProgram.md). No new application tests, +independent review, source retrieval or prospective learning cycle was performed. + +## Gate assessment + +| M2 criterion | Assessment | Basis and remaining owner | +| --- | --- | --- | +| M1 prerequisite | blocked | [M1 review](M1-SeedReview.md) is revise/defer; WP-0002 T03 retains independent usefulness, validated seed cases and quality limits | +| Evidence from all six streams | partial | Documentary coverage exists in A–F; mechanism tests and source inspections have unequal scope. Full-contract independent uses remain unassessed; WP-0003 T01 | +| Coverage matrix for ten application types | delivered, with gaps | Matrix below distinguishes prepared reasoning from validated coverage; planned cases have no completion credit | +| Candidate and relation dispositions | delivered, provisional | Seventeen dispositions below; conditional relations remain proposals, no canonical admission | +| Four further completed contrasting cases | unmet | VC-03/06 provisional; VC-04/05 planned. WP-0003 T02 retains completion after M1 | + +## Six-stream evidence assessment + +The [coverage inventory](NavigationCoverage.md), [breadth review](PatternBreadthExpansion.md) +and [current profiles](../evolution/profiles.json) provide the detailed locators. +Counts of files, documents, browser rows or repeated trials do not count independent uses. + +| Stream | Available evidence | Missing coverage / decision | +| --- | --- | --- | +| A — historical GUI architecture | Fowler documentary contrast, Presentation Model normalization and synthetic probes | Retain view/model separation as a hypothesis; no executed independent whole-contract presentation use | +| B — web navigation and hypermedia | htmx history/cache, focus and completion-ownership fixtures; pinned Zulip navigation source contrast | Authored fixture and static application paths are distinct; offline availability, auxiliary continuations, lifecycle and independent accessible use remain unresolved | +| C — rendering and execution | Astro/SvelteKit documentary mechanisms; authority/projection comparison separates placement from acceptance | Selective activation is plausible; no island performance comparison or broad streaming/resumability validation | +| D — state authority and synchronization | Transactional/local-first sources, Zulip acceptance/projection source study, Matrix SDK with synthetic receiver | Client mechanisms do not establish real receiver deduplication, durable commit/restart or backup. WP-0003 T04 retains those tests | +| E — composition and organization | Pinned feature-sliced and microfrontend example inspection; native-module activation/rollback and conflict/reload fixtures | Source organization, artifact publication and session transition differ; no independent team/deployment or distributed-store guarantee | +| F — quality patterns | React failure-class fixture, Radix dismissal/focus experiments, navigation focus contrast | DOM observations do not validate assistive-technology speech, human usability, privacy/security boundaries or general performance | + +The latest [acceptance/projection study](ZulipAcceptanceProjection.md) retains +response/event ordering and reopened-edit ownership as unknown. Its proposed next +reproduction remains WP-0003 T01; this review does not infer a defect from callbacks. + +## Application coverage matrix + +States agree with [context.json](../evolution/context.json). “Partial” below means +relevant reasoning exists, not that the case has passed the required walkthrough. + +| Case | State / evidence | Unresolved coverage | +| --- | --- | --- | +| VC-01 transactional administration | Partial: [synthetic draft](../walkthroughs/VC01-TransactionalAdministration.md), core recovery candidates | Independent decision usefulness, actual write/receipt semantics, keyboard recovery | +| VC-02 offline field notes | Partial: [synthetic draft](../walkthroughs/VC02-OfflineFieldNotes.md), local commit/propagation/conflict sequence | Real storage restart/commit, receiver identity lifetime, device-loss backup and retention scope | +| VC-03 content publication | Partial: [provisional walkthrough](../walkthroughs/VC03-ContentPublication.md), navigation/history/focus fixtures | Offline-reading branch, interrupted enhancement, independent human/AT review | +| VC-04 collaborative editor | Unresolved: [brief](../plan/ValidationCases.md) only | Durable changes versus presence, reconnect/undo and authorization changes; no completed trace | +| VC-05 real-time dashboard | Unresolved: [brief](../plan/ValidationCases.md) only | Subscription lifetime, staleness and bounded overload; no completed trace | +| VC-06 microfrontend estate | Partial: [provisional walkthrough](../walkthroughs/VC06-MicrofrontendEstate.md), feature release fixtures | Real operational independence, retention/support policy and independent case review | +| VC-07 storefront | Unresolved: [brief](../plan/ValidationCases.md); catalog navigation and transactional hypotheses are leads | No integrated cart/price/authoritative-checkout decision trace | +| VC-08 SaaS workspace | Unresolved: [brief](../plan/ValidationCases.md); presentation/derived-state hypotheses are leads | No integrated dense-interaction/long-session case or coherence test | +| VC-09 local-first personal tool | Partial conceptual overlap with VC-02; [brief](../plan/ValidationCases.md) remains planned | Privacy, optional synchronization and backup/restore have no dedicated completed case | +| VC-10 mobile web | Unresolved: [brief](../plan/ValidationCases.md); persistence/reload hypotheses are leads | Constrained-memory startup, interrupted sessions and mobile recovery lack a dedicated completed case | + +## Candidate dispositions and counterexamples + +“Retain” means retain a qualified draft hypothesis. No candidate has sufficient new +evidence here for promotion, merge or deletion. Rejecting a universal claim is not +rejecting the useful conditional pattern. No relation is made mandatory merely to +connect the graph. The [preview ontology review](PreviewOntology-0.1.md) supplies the +core separation rationale; the breadth and runtime reviews above supply extensions. + +| Candidate | Disposition | Distinction / counterexample that constrains the language | +| --- | --- | --- | +| CAND-0001 Conflict Copy | Retain separately from reconciliation | Preserving divergent intent need not include a user resolution workflow; authorized retention and privacy still constrain preservation | +| CAND-0002 Local Commit Boundary | Retain | Locally accepted durable intent differs from editable draft and remote acceptance; memory-only feedback is a counterexample to durability | +| CAND-0003 Pending Synchronization | Retain | Locally accepted work awaiting replication differs from a remote write of unknown outcome; network retry alone does not make the record durable | +| CAND-0004 Explicit Reconciliation | Retain separately from copy | A bounded conflict can be resolved without keeping a permanent copy; automatic convergence can remove the need for explicit user reconciliation | +| CAND-0005 Local Draft State | Retain | Mutable user intent differs from accepted records and presentation state; a refresh must not silently erase newer edits | +| CAND-0006 Version-Checked Mutation | Retain | Base-version preconditions prevent stale intent application; an idempotency key alone does not prove valid ancestry | +| CAND-0007 Mutation Outcome Tracking | Retain | Lost acknowledgement leaves outcome unknown; cancelling UI or creating a fresh operation identity can duplicate accepted work | +| CAND-0008 Invalidate and Reproject | Retain | Read refresh is distinct from mutation acceptance; failed refresh does not prove rejected write or authorize draft rollback | +| CAND-0009 URL-addressable State | Retain | Address reconstruction differs from content availability and authorization; client fragments do not imply server dereferenceability | +| CAND-0010 Progressive Enhancement | Retain | Essential task continuity differs from URL changes or selective hydration; a no-script link that loses the essential action does not satisfy the contract | +| CAND-0011 Presentation Model | Retain | Presentation decisions differ from domain authority and editable intent; a wrapper with no independent decisions does not justify an extra model | +| CAND-0012 Derived State | Retain | Computed results differ from independently editable state; incomplete inputs or stale memoization invalidate a derived result | +| CAND-0013 Vertical Feature Slice | Retain separately from independent release | Capability-oriented modules can share one build; import grouping is not evidence of autonomous deployment | +| CAND-0014 Islands of Interactivity | Retain | Selective execution differs from task fallback, fault containment and security isolation; islands alone guarantee none of those | +| CAND-0015 Failure Boundary | Retain | Specified render containment differs from request/handler failures and remote compensation; a failed fallback may itself escape | +| CAND-0016 Focus Return | Retain narrow scope | Temporary interaction return differs from non-modal route continuation; removed invokers and nested ownership need explicit targets/policy | +| CAND-0017 Independent Feature Boundary | Retain separately from source organization | Artifact release, activation binding and session lifetime differ; changing an import map does not update an already-bound session | + +## Relations and quality constraints + +Retain the conditional relations in the frozen 0.1 manifest as historical proposals; +no inverse or transitive inference is authorized. The current language must preserve +these decisions when a later export is considered: + +- Reject unconditional `requires` between Conflict Copy and Explicit Reconciliation. + Preservation and resolution answer different questions; neither universally requires + the other's particular mechanism. +- Keep local acceptance, remote outcome and read projection separate. Pending + Propagation and Mutation Outcome Tracking may compose, but neither establishes the + other's preconditions. Version-Checked Mutation and operation identity solve different risks. +- Keep feature organization, activation and session transition separate. Do not merge + Vertical Feature Slice with Independent Feature Boundary or infer release autonomy. +- Keep modal return separate from route completion ownership. Reuse shared concerns + without broadening Focus Return into every navigation policy. +- Preserve cross-cutting obligations: authorized retention, explicit backup scope, + receipt/deduplication windows, stale-ancestry handling, newer-draft preservation, + keyboard recovery and fallback ownership. Existing tests qualify mechanisms only; + they do not confer security, accessibility, crash-safety or performance certification. + +These are editorial dispositions of existing distinctions, not new empirical findings. +The canonical responsibility vocabulary stays provisional; classification coverage +must not be presented as maturity or proof that the seed inventory is complete. + +## Existing work retains the gaps + +No new task or workplan is opened. [WP-0003 T01/T02/T04](../../workplans/FEP-WP-0003-contrasting-schools.md) +retain stream evidence, contrasting case completion and real storage/receiver validation. +[WP-0002 T03](../../workplans/FEP-WP-0002-seed-language-validation.md) retains the M1 +independent-usefulness gate. [WP-0004](../../workplans/FEP-WP-0004-reference-surface.md) +retains gated canonical export and held-out/real-repository evaluation. T03's review +artifact is complete with an explicit defer result; M2 may be reassessed only when +those existing evidence obligations change. No prospective trend or human validation +is inferred from completing this editorial review. diff --git a/research/reviews/ReviewDateReconciliation.md b/research/reviews/ReviewDateReconciliation.md new file mode 100644 index 0000000..216cde9 --- /dev/null +++ b/research/reviews/ReviewDateReconciliation.md @@ -0,0 +1,38 @@ +# Substantive review date reconciliation + +Reconciled 2026-09-27 by Codex under FEP-WP-0006 T03. Dates below come from +original dated review artifacts, not the date of this metadata edit. An editorial +contract review is substantive but does not renew runtime evidence, external source +freshness, independent recurrence or human usefulness. All roles remain author-model, +all candidates hypotheses, and independent full-contract use counts unknown. + +| Candidate | Recorded review date | Original artifact | Scope | +| --- | --- | --- | --- | +| CAND-0001 — Conflict Copy | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0002 — Local Commit Boundary | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0003 — Pending Synchronization | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0004 — Explicit Reconciliation | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0005 — Local Draft State | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0006 — Version-Checked Mutation | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0007 — Mutation Outcome Tracking | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0008 — Invalidate and Reproject | 2026-09-27 | [M1-SeedReview](M1-SeedReview.md) | Editorial review of the connected core; M1 revise/defer. | +| CAND-0009 — URL-addressable State | 2026-09-27 | [ZulipNavigationSourceStudy](ZulipNavigationSourceStudy.md) | Static navigation contrast; partial mechanisms, not independent full-contract use. | +| CAND-0010 — Progressive Enhancement | 2026-09-27 | [ZulipNavigationSourceStudy](ZulipNavigationSourceStudy.md) | Static navigation contrast; partial mechanisms, not independent full-contract use. | +| CAND-0011 — Presentation Model | 2026-09-26 | [PatternBreadthExpansion](PatternBreadthExpansion.md) | Source normalization, decision probes and counterexamples. | +| CAND-0012 — Derived State | 2026-09-26 | [PatternBreadthExpansion](PatternBreadthExpansion.md) | Source normalization, decision probes and counterexamples. | +| CAND-0013 — Vertical Feature Slice | 2026-09-26 | [FeatureDeploymentBoundaries](FeatureDeploymentBoundaries.md) | Static feature/import versus release-boundary assessment. | +| CAND-0014 — Islands of Interactivity | 2026-09-26 | [PatternBreadthExpansion](PatternBreadthExpansion.md) | Source normalization, decision probes and counterexamples. | +| CAND-0015 — Failure Boundary | 2026-09-26 | [BoundaryRecoveryExperiment](BoundaryRecoveryExperiment.md) | Authored runtime fixture and failure-class interpretation. | +| CAND-0016 — Focus Return | 2026-09-27 | [ZulipNavigationSourceStudy](ZulipNavigationSourceStudy.md) | Static navigation contrast; partial mechanisms, not independent full-contract use. | +| CAND-0017 — Independent Feature Boundary | 2026-09-26 | [ActivationConflictsAndReload](ActivationConflictsAndReload.md) | Authored activation/reload experiment and guarantee limits. | + +Fourteen formerly unknown dates now have traceable provenance; the three existing +September 27 dates are corroborated. The September 26 baseline and 0.1 release +remain unchanged historical records. Current profiles carry a separate metadata +assessment date, substantive review reference and scope. Missing references or dates +later than their metadata assessment are rejected by the current-profile validator. + +This reconciliation is not a prospective investigation, adds no learning cycle and +estimates no historical effort. LEARN-0011–0016 remain six distinct comparison groups; +none supplies three comparable cycles. The remaining comparable-window review stays +in [FEP-WP-0006 T03](../../workplans/FEP-WP-0006-language-evolution.md). diff --git a/scripts/reference_preview.py b/scripts/reference_preview.py index bff442f..fcb5a54 100644 --- a/scripts/reference_preview.py +++ b/scripts/reference_preview.py @@ -3,14 +3,13 @@ import argparse import hashlib import json -from pathlib import Path +from pathlib import Path, PurePosixPath import re import subprocess from classification_coverage import section_values, RESPONSIBILITIES ROOT = Path(__file__).resolve().parents[1] -BASE = 'reference/0.1/' def require(condition, message): @@ -18,21 +17,46 @@ def require(condition, message): raise ValueError(message) -def locator(root, value): - require(isinstance(value, str) and bool(value), 'Empty reference') - path = (root / value).resolve() - require(path.is_relative_to(root.resolve()) and path.is_file(), 'Invalid reference: ' + value) - return path +def git_blob(root, revision, path): + require(isinstance(revision, str) and re.fullmatch(r'[0-9a-f]{40}', revision), 'Full pinned revision required') + require(isinstance(path, str) and path and not PurePosixPath(path).is_absolute() + and all(part not in {'.', '..', ''} for part in path.split('/')) + and '\\' not in path and ':' not in path, 'Invalid reference: ' + str(path)) + try: + return subprocess.check_output(['git', 'show', revision + ':' + path], cwd=root, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessError as exc: + raise ValueError('Missing pinned reference: ' + path) from exc -def build(root=ROOT): - manifest = json.loads((root / BASE / 'manifest.json').read_text()) +def release(root, version=None): + registry = json.loads((root / 'reference/releases.json').read_text()) + require(registry.get('schema_version') == 1, 'Unsupported release registry') + version = version or registry['current'] + require(isinstance(version, str) and re.fullmatch(r'[0-9]+\.[0-9]+', version), 'Invalid reference version') + require(version in registry['releases'], 'Unknown reference version') + pin = registry['releases'][version] + base = 'reference/' + version + '/' + manifest_bytes = git_blob(root, pin['packaging_revision'], base + 'manifest.json') + require(hashlib.sha256(manifest_bytes).hexdigest() == pin['manifest_sha256'], 'Release manifest digest mismatch') + require((root / base / 'manifest.json').read_bytes() == manifest_bytes, 'Published manifest changed') + for name in ('development-cases.json', 'README.md', 'ReleaseNotes.md', 'ReleaseReview.md'): + require((root / base / name).read_bytes() == git_blob(root, pin['packaging_revision'], base + name), 'Published artifact changed: ' + name) + manifest = json.loads(manifest_bytes) + require(manifest['version'] == version, 'Release version mismatch') + return base, pin, manifest + + +def build(root=ROOT, version=None): + base, pin, manifest = release(root, version) + corpus = manifest['corpus_revision'] + read_corpus = lambda path: git_blob(root, corpus, path) + read_package = lambda path: git_blob(root, pin['packaging_revision'], path) for path, digest in manifest['inputs'].items(): - require(hashlib.sha256(locator(root, path).read_bytes()).hexdigest() == digest, 'Stale input: ' + path) - profiles = json.loads((root / 'research/evolution/profiles.json').read_text())['profiles'] - classifications = json.loads((root / 'research/catalog/ClassificationCoverage.json').read_text())['candidates'] + require(hashlib.sha256(read_corpus(path)).hexdigest() == digest, 'Stale pinned input: ' + path) + profiles = json.loads(read_corpus('research/evolution/profiles.json'))['profiles'] + classifications = json.loads(read_corpus('research/catalog/ClassificationCoverage.json'))['candidates'] classes = {r['path']: r for r in classifications} - vocab = (root / 'canon/vocabulary.yaml').read_text() + vocab = read_corpus('canon/vocabulary.yaml').decode() ids = [p['id'] for p in profiles] selected = manifest['core'] + manifest['extensions'] require(len(ids) == len(set(ids)) and all(re.fullmatch(r'CAND-\d{4}', x) for x in ids), 'Invalid candidate identities') @@ -40,10 +64,8 @@ def build(root=ROOT): require(len(classes) == len(classifications) == len(profiles), 'Invalid classification coverage') records = [] for p in profiles: - raw = locator(root, p['path']).read_bytes() + raw = read_corpus(p['path']) require(hashlib.sha256(raw).hexdigest() == p['sha256'], 'Stale candidate: ' + p['id']) - pinned = subprocess.check_output(['git', 'show', manifest['corpus_revision'] + ':' + p['path']], cwd=root) - require(raw == pinned, 'Candidate differs from pinned revision: ' + p['id']) front = raw.decode().split('---')[1] c = classes[p['path']] require(c['sha256'] == p['sha256'] and c['title'] == p['title'], 'Stale classification') @@ -61,7 +83,7 @@ def build(root=ROOT): for labels in c['forces'].values(): require(set(labels) <= set(section_values(vocab, 'forces')), 'Invalid force') for e in p['evidence']: - locator(root, e['ref']) + read_package(e['ref']) require(e['kind'] and e['scope'], 'Missing evidence qualification') require(p['evidence'] or p['independent_full_contract_uses'] is None, 'Missing evidence/unknown') records.append(record) @@ -71,20 +93,20 @@ def build(root=ROOT): require(edge['status'] == 'proposed' and all(edge[k].strip() for k in ('condition', 'rationale', 'unknown', 'evidence_kind')), 'Unqualified relation') require(edge['evidence_refs'], 'Missing relation evidence') for ref in edge['evidence_refs']: - locator(root, ref) + read_package(ref) for ref in manifest['entrypoints'].values(): - locator(root, ref) + read_package(ref) for task in manifest['open_work']: - require(task['id'] in locator(root, task['path']).read_text(), 'Missing residual task') - cases = json.loads((root / BASE / 'development-cases.json').read_text())['cases'] + require(task['id'] in read_package(task['path']).decode(), 'Missing residual task') + cases = json.loads(read_package(base + 'development-cases.json'))['cases'] require(len(cases) >= 6 and len({c['id'] for c in cases}) == len(cases), 'Invalid development cases') for case in cases: require(case['entrypoint'] in manifest['entrypoints'] and set(case['expected_candidates']) <= set(ids), 'Invalid development reference') require(all(case[k].strip() for k in ('query', 'reviewed_answer', 'prohibited_claim', 'boundary')), 'Incomplete development case') - index = dict(schema_version=1, version='0.1', status='research-preview', corpus_revision=manifest['corpus_revision'], + index = dict(schema_version=1, version=manifest['version'], status='research-preview', corpus_revision=manifest['corpus_revision'], candidates=records, relations=manifest['relations'], entrypoints=manifest['entrypoints'], relation_semantics='Conditional proposals only; no inverse or transitive inference.') - catalog = ['# Candidate reference — 0.1', '', 'All records are draft hypotheses. Classification is provisional; linked candidate prose contains context, alternatives and consequences. Evidence locators describe partial support, not full-contract recurrence.', ''] + catalog = ['# Candidate reference — ' + manifest['version'], '', 'All records are draft hypotheses. Classification is provisional; linked candidate prose contains context, alternatives and consequences. Evidence locators describe partial support, not full-contract recurrence.', ''] for subset in ('core', 'extensions'): catalog += ['## ' + subset.title(), '', '| Candidate / decision | Families; scales | Evidence limits |', '| --- | --- | --- |'] for p in records: @@ -102,9 +124,11 @@ def build(root=ROOT): def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--check', action='store_true') + parser.add_argument('--version', help='Immutable published version; default is reference/releases.json current') args = parser.parse_args() - for name, content in build().items(): - path = ROOT / BASE / name + base, _, _ = release(ROOT, args.version) + for name, content in build(version=args.version).items(): + path = ROOT / base / name if args.check: require(path.is_file() and path.read_text() == content, 'Stale export: ' + name) else: diff --git a/scripts/research_evolution.py b/scripts/research_evolution.py index 3aee605..200ecde 100644 --- a/scripts/research_evolution.py +++ b/scripts/research_evolution.py @@ -53,7 +53,10 @@ def validate(data, root=ROOT): require(not p['review']['independent_human'] or p['review']['role'] == 'human', 'Model review cannot be human validation') date.fromisoformat(p['review']['assessed_at']) if p['review']['last_substantive_review_date'] is not None: - date.fromisoformat(p['review']['last_substantive_review_date']) + review = p['review'] + require(date.fromisoformat(review['last_substantive_review_date']) <= date.fromisoformat(review['assessed_at']), 'Review date exceeds assessment') + require(review.get('substantive_review_ref') and review.get('substantive_review_scope', '').strip(), 'Substantive review needs provenance and scope') + ref_check(root, review['substantive_review_ref']) require(p['independent_full_contract_uses'] is None or type(p['independent_full_contract_uses']) is int and p['independent_full_contract_uses'] >= 0, 'Invalid independent-use count') require(set(p['superseded_by']) <= set(ids) - {p['id']}, 'Unknown/self successor') for e in p['evidence']: @@ -164,7 +167,7 @@ def render(data, baseline=None): lines += ['## Coherence and maintainability', '', 'Profile hashes and local references passed validation when this report was generated. That checks traceability, not source truth or external URL freshness.', '', f'Profiles with unknown last substantive review date: {sum(p["review"]["last_substantive_review_date"] is None for p in profiles)}. ' - 'Assessment dates record this metadata review, not a new substantive validation. No age-based freshness claim is available for those profiles.', '', + 'Assessment dates record this metadata review, not a new substantive validation. Recorded substantive dates identify scoped author-model reviews, not renewed empirical or external-source freshness.', '', 'Coherence metrics (ambiguous selections, unjustified relations and overlap resolved): not measured. Conflict Copy / Explicit Reconciliation overlap remains an explicit open question.', '', 'Review backlog and evidence gaps remain in ' + ', '.join(link(r) for r in context['open_work']) + '.', '', '## Pattern profiles', ''] diff --git a/templates/PatternUseReceipt.yaml b/templates/PatternUseReceipt.yaml index 4d9457b..3839090 100644 --- a/templates/PatternUseReceipt.yaml +++ b/templates/PatternUseReceipt.yaml @@ -1,5 +1,7 @@ -# Draft contract for FEP-WP-0008-T02; not an enabled collector or real-use evidence. -# The implementation must turn this into a strict versioned schema and validate it. +# Producer template for FEP-WP-0008-T02; placeholders are not valid use evidence. +# Executable schema-v1 event validation/collection: activity-core +# src/activity_core/context_resolvers/frontend_patterns.py (validate_event). +# Consumer closeout integration and real-use acceptance remain open in T02. # Consumer produces immutable events; collector supplies independently verified origin. schema_version: 1 use_id: "::" diff --git a/tests/test_reference_preview.py b/tests/test_reference_preview.py index 499bc8e..44d5372 100644 --- a/tests/test_reference_preview.py +++ b/tests/test_reference_preview.py @@ -1,4 +1,5 @@ """Reject broken preview contracts before publishing generated references.""" +import hashlib import importlib.util import json from pathlib import Path @@ -48,16 +49,18 @@ def test_duplicate_identity(copy): preview.build(copy) -def test_stale_candidate(copy): +def test_live_candidate_change_does_not_break_frozen_preview(copy): with (copy / 'research/candidates/ConflictCopy.md').open('a') as f: f.write('\nChanged contract.\n') - with pytest.raises(ValueError, match='Stale candidate'): - preview.build(copy) + assert preview.build(copy) == preview.build(ROOT) + import research_evolution as evolution + with pytest.raises(ValueError, match='Stale profile'): + evolution.validate(evolution.load(copy), copy) def test_escaping_reference(copy): mutate(copy, lambda m: m['entrypoints'].update(start='/etc/passwd')) - with pytest.raises(ValueError, match='Invalid reference'): + with pytest.raises(ValueError, match='Published manifest changed'): preview.build(copy) @@ -68,3 +71,44 @@ def test_missing_metadata(copy): path.write_text(json.dumps(data)) with pytest.raises((ValueError, KeyError)): preview.build(copy) + + +def test_legitimate_new_research_remains_separate_from_old_release(copy): + import research_evolution as evolution + candidate = copy / 'research/candidates/ConflictCopy.md' + candidate.write_text(candidate.read_text() + '\nNew research clarification.\n') + digest = hashlib.sha256(candidate.read_bytes()).hexdigest() + profiles = copy / 'research/evolution/profiles.json' + data = json.loads(profiles.read_text()) + data['profiles'][0]['sha256'] = digest + profiles.write_text(json.dumps(data)) + classes = copy / 'research/catalog/ClassificationCoverage.json' + data = json.loads(classes.read_text()) + next(c for c in data['candidates'] if c['path'] == 'research/candidates/ConflictCopy.md')['sha256'] = digest + classes.write_text(json.dumps(data)) + evolution.validate(evolution.load(copy), copy) + assert preview.build(copy, '0.1') == preview.build(ROOT, '0.1') + + +def test_unknown_version_and_forged_release_pin(copy): + with pytest.raises(ValueError, match='Unknown'): + preview.build(copy, '9.9') + path = copy / 'reference/releases.json' + data = json.loads(path.read_text()) + data['releases']['0.1']['manifest_sha256'] = '0' * 64 + path.write_text(json.dumps(data)) + with pytest.raises(ValueError, match='digest mismatch'): + preview.build(copy) + + +def test_published_cases_cannot_be_rewritten(copy): + path = copy / 'reference/0.1/development-cases.json' + path.write_text('{}') + with pytest.raises(ValueError, match='Published artifact changed'): + preview.build(copy) + + +@pytest.mark.parametrize('path', ['/etc/passwd', '../README.md', 'research/../README.md', 'research//README.md']) +def test_git_blob_rejects_escaping_paths(path): + with pytest.raises(ValueError, match='Invalid reference'): + preview.git_blob(ROOT, '0' * 40, path) diff --git a/tests/test_research_evolution.py b/tests/test_research_evolution.py index faf7db5..ed8b175 100644 --- a/tests/test_research_evolution.py +++ b/tests/test_research_evolution.py @@ -26,6 +26,9 @@ def test_current_records_and_report_are_consistent(data): @pytest.mark.parametrize('mutation,match', [ + (lambda d: d['profiles']['profiles'][0]['review'].update(last_substantive_review_date='2099-01-01'), 'Review date exceeds'), + (lambda d: d['profiles']['profiles'][0]['review'].update(substantive_review_ref=None), 'needs provenance'), + (lambda d: d['profiles']['profiles'][0]['review'].update(substantive_review_scope=''), 'needs provenance'), (lambda d: d['profiles']['profiles'][0].update(sha256='0'*64), 'Stale profile'), (lambda d: d['profiles']['profiles'].pop(), 'inventory mismatch'), (lambda d: d['profiles']['profiles'][1].update(id='CAND-0001'), 'Duplicate candidate'), diff --git a/workplans/FEP-WP-0002-seed-language-validation.md b/workplans/FEP-WP-0002-seed-language-validation.md index 27f377f..1fc625b 100644 --- a/workplans/FEP-WP-0002-seed-language-validation.md +++ b/workplans/FEP-WP-0002-seed-language-validation.md @@ -4,7 +4,7 @@ type: workplan title: "Validate the seed frontend pattern language" domain: infotech repo: frontend-patterns -status: active +status: blocked quality_dor: DoR-Ok quality_dor_at: "2026-09-24" quality_dor_by: codex @@ -61,7 +61,7 @@ counterexamples. Reconcile README maturity claims with the evidence. ```task id: FEP-WP-0002-T03 -status: progress +status: wait priority: medium state_hub_task_id: "54940b04-1d0f-5bff-98d4-be290eca8048" ``` @@ -347,3 +347,12 @@ obligation is declared satisfied merely by transfer. Workplan remains active. The eight-record editorial core is suitable for a qualified research preview; M1 remains revise/defer and T03 progress. WP-0007 packages it without canonical admission, independent-human claims or fresh held-out evaluation. + +## Closeout audit — 2026-09-27 + +Workplan blocked; T03 waits on the independent usefulness/validated-case evidence +identified in [M1-SeedReview](../research/reviews/M1-SeedReview.md). The connected +core, two synthetic walkthroughs and review are delivered, but the gate is revise/defer. +Reopen when independent evidence and the outstanding quality/recovery assumptions +can be assessed; a metadata edit or another author-model review cannot supply it. +Storage/receiver mechanism work already belongs to WP-0003 T04. No new task. diff --git a/workplans/FEP-WP-0003-contrasting-schools.md b/workplans/FEP-WP-0003-contrasting-schools.md index 0f1d902..045d8b5 100644 --- a/workplans/FEP-WP-0003-contrasting-schools.md +++ b/workplans/FEP-WP-0003-contrasting-schools.md @@ -4,7 +4,7 @@ type: workplan title: "Challenge the language across architectural schools" domain: infotech repo: frontend-patterns -status: active +status: blocked owner: codex topic_slug: canon created: "2026-09-24" @@ -34,7 +34,7 @@ Build a source coverage matrix for streams A–F in ResearchProgram.md. Complete ```task id: FEP-WP-0003-T02 -status: todo +status: wait priority: high state_hub_task_id: "05de53b6-1771-5137-9602-bf614cb1bf0a" ``` @@ -45,7 +45,7 @@ After the M1 review, complete VC-03 through VC-06 using the walkthrough template ```task id: FEP-WP-0003-T03 -status: todo +status: done priority: medium state_hub_task_id: "2b7252c1-c453-5050-96fb-d86a3f3df0f0" ``` @@ -330,3 +330,17 @@ infrastructure if feasible within a new budget. Existing auxiliary-navigation re stays open, local navigation fixture stays paused, and WP-0003 T04 retains storage/ receiver validation. WP-0006 T03 retains review dates/comparable-window work; this sixth prospective group supplies no learning trend. Human validation and M1/M2/M3 stay open. + +## Closeout audit — 2026-09-27 + +T03 done: [M2-CoverageReview](../research/reviews/M2-CoverageReview.md) records all +seventeen dispositions, conditional relations, quality limits, six-stream evidence +and ten-case coverage. Result: revise/defer, not M2 acceptance. All unresolved work +stays in existing T01/T02/T04, WP-0002 T03 and WP-0004; no new task or workplan. + +Workplan blocked because T02's M1 prerequisite remains unmet. T02 is wait until +WP-0002's evidence gate is satisfied; then complete VC-03–06 and review VC-07–10. +T01 remains progress for useful bounded source/reproduction questions; T04 remains +todo for a preregistered concrete storage/real-receiver investigation. These are +unfinished research, not falsely declared external blockers or completed by this +editorial review. Bounded exploratory work retains its existing authorization. diff --git a/workplans/FEP-WP-0004-reference-surface.md b/workplans/FEP-WP-0004-reference-surface.md index 9322feb..0ace8e0 100644 --- a/workplans/FEP-WP-0004-reference-surface.md +++ b/workplans/FEP-WP-0004-reference-surface.md @@ -4,7 +4,7 @@ type: workplan title: "Evaluate retrieval and real repository applicability" domain: infotech repo: frontend-patterns -status: proposed +status: blocked owner: codex topic_slug: canon created: "2026-09-24" @@ -22,7 +22,7 @@ Individual task descriptions identify any work that can start earlier. ```task id: FEP-WP-0004-T01 -status: todo +status: wait priority: high state_hub_task_id: "4fec98f6-fee2-52fc-a01c-f490c79ee0f8" ``` @@ -33,7 +33,7 @@ After the schema and seed examples pass M1, implement the smallest validator/exp ```task id: FEP-WP-0004-T02 -status: todo +status: wait priority: medium state_hub_task_id: "4bdd4c53-fcdb-5dfd-9a37-ebc3fee4d445" ``` @@ -44,7 +44,7 @@ After M2, freeze a corpus revision and evaluate at least six unseen prompts foll ```task id: FEP-WP-0004-T03 -status: todo +status: wait priority: medium state_hub_task_id: "ab66848b-1045-54dd-9711-52c5560faafa" ``` @@ -59,3 +59,11 @@ before M1/M2. It is distinct from this workplan's canonical export and held-out claims; it does not rename consumed feedback into unseen evaluation cases. This plan remains proposed with its original task gates. Routine reuse must not await those claims or require a human survey; preserve evidence provenance and honest unknowns. + +## Closeout audit — 2026-09-27 + +Workplan blocked. T01 waits for the schema/seed M1 acceptance; T02 and T03 wait for +M2 under the phase prerequisite. The M1 and M2 reviews both say revise/defer. Reopen +each task only on the recorded prerequisite evidence. Existing preview validation +and development cases are useful outputs of WP-0007/WP-0008, not canonical export, +held-out evaluation or two complete real-repository applicability studies. diff --git a/workplans/FEP-WP-0006-language-evolution.md b/workplans/FEP-WP-0006-language-evolution.md index 2a3c3ea..c627296 100644 --- a/workplans/FEP-WP-0006-language-evolution.md +++ b/workplans/FEP-WP-0006-language-evolution.md @@ -176,3 +176,16 @@ infrastructure if feasible within a new budget. Existing auxiliary-navigation re stays open, local navigation fixture stays paused, and WP-0003 T04 retains storage/ receiver validation. WP-0006 T03 retains review dates/comparable-window work; this sixth prospective group supplies no learning trend. Human validation and M1/M2/M3 stay open. + +## Closeout audit — 2026-09-27 + +T03 review-date reconciliation is complete: [dated provenance report](../research/reviews/ReviewDateReconciliation.md) +resolves fourteen unknown dates and corroborates the three known dates from original +artifacts. Current-profile validation requires review provenance/scope and prevents +a date later than its assessment. Historical baseline and 0.1 release are unchanged. + +T03 remains progress, workplan active: LEARN-0011–0016 belong to six different +comparison groups, none with three comparable cycles. The returns review needs useful +further prospective research under the existing task; do not manufacture repetitions +or pool incompatible protocols to close it. There is no external blocker on that +research and no claim that a metadata reconciliation is a new learning cycle. diff --git a/workplans/FEP-WP-0008-use-driven-improvement.md b/workplans/FEP-WP-0008-use-driven-improvement.md index e3af417..3b5e23e 100644 --- a/workplans/FEP-WP-0008-use-driven-improvement.md +++ b/workplans/FEP-WP-0008-use-driven-improvement.md @@ -4,7 +4,7 @@ type: workplan title: "Close the ecosystem reuse and improvement loop" domain: infotech repo: frontend-patterns -status: active +status: blocked lane: blue owner: codex topic_slug: canon @@ -30,7 +30,7 @@ the user's instruction. This is not a request for another up-front approval roun ```task id: FEP-WP-0008-T01 -status: progress +status: wait priority: high lane: blue state_hub_task_id: "453fc06b-be70-5913-a816-161cabe9a0a1" @@ -61,7 +61,7 @@ in this design session; hosted registration and consumer integration remain open ```task id: FEP-WP-0008-T02 -status: progress +status: wait priority: high lane: blue state_hub_task_id: "49be8a8e-eaaf-5f1c-b4cd-f0c4dbac9823" @@ -88,7 +88,7 @@ refresh after 14 days and remain unknown after 30; no manual survey dependency. ```task id: FEP-WP-0008-T03 -status: progress +status: wait priority: high lane: blue state_hub_task_id: "f823587c-727d-515a-974d-401719420ce5" @@ -179,3 +179,26 @@ sync remains off; authenticated receipt/identity and failed-health rollback proo remain in ACTIVITY-WP-0041-T03. Digest-aware registry retention is tracked by RPF-WP-0048-T03; current baseline tags are protected. Reporting is operational; consumer enrollment and admitted pattern-editing execution remain unfinished. + +## Closeout audit — 2026-09-27 + +Local frozen-publication prerequisite in T01 is complete: [release registry](../reference/releases.json), +explicit version selection and Git-pinned corpus/package reads isolate old exports +from legitimate current-research edits. Regression tests exercise current research +changing independently, stale live profiles and altered published artifacts. + +Workplan blocked; T01/T02/T03 wait on their end-to-end dependencies. T01 needs hosted +discovery and common-template-owner integration into an actual eligible frontend task, +including its first pinned decision note. T02 needs the producer closeout hook and +real use plus linked outcome; activity-core owns the existing executable event validator +and deterministic collector. The roster is still empty. Do not invent a demo consumer +or copy its fixtures into the real stream. Reopen these tasks when an eligible actual +consumer and the template integration are available. + +T03 needs an admitted, budget-enforced pattern-edit executor (GLAS-WP-0012 / +HFACT-WP-0001), authenticated standing release/rollback proof (ACTIVITY-WP-0041 T03), +and a real unassisted cycle with monthly packet. Reporting and collection are already +operational; their three schedules remain enabled. The first monthly packet remains +due October 1; missing consumer/executor evidence must be reported as such. This audit +does not disable schedules or conflate the reporting worker with mutation authority. +Existing owner work records retain all dependencies; no replacement workplan is opened.