From d8d3a22b541034e4156c8b488636b5a84a1b6092 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 4 Oct 2026 03:02:53 +0200 Subject: [PATCH 1/2] Audit prospective comparison readiness and retain effort gaps Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a1045b-933d-7aa1-b2db-104557487a79 --- WORK-RECORDS.md | 2 +- research/evolution/ComparisonWindows.json | 199 ++++++++++++++++++++ research/evolution/EvolutionReport.md | 76 +++++--- research/evolution/README.md | 18 ++ research/evolution/context.json | 5 +- scripts/research_evolution.py | 79 ++++++-- templates/LearningCycle.md | 4 + tests/test_research_evolution.py | 74 +++++++- workplans/FEP-WP-0006-language-evolution.md | 36 +++- 9 files changed, 439 insertions(+), 54 deletions(-) create mode 100644 research/evolution/ComparisonWindows.json diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index ecdf416..b2b6cce 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -13,7 +13,7 @@ | workplan | FEP-WP-0003 | backlog | — | workplans/FEP-WP-0003-contrasting-schools.md | | workplan | FEP-WP-0004 | backlog | — | workplans/FEP-WP-0004-reference-surface.md | | workplan | FEP-WP-0005 | finished | — | workplans/FEP-WP-0005-research-bench-setup.md | -| workplan | FEP-WP-0006 | backlog | — | workplans/FEP-WP-0006-language-evolution.md | +| workplan | FEP-WP-0006 | blocked | — | workplans/FEP-WP-0006-language-evolution.md | | workplan | FEP-WP-0007 | finished | — | workplans/FEP-WP-0007-language-v01-preview.md | | workplan | FEP-WP-0008 | blocked | — | workplans/FEP-WP-0008-use-driven-improvement.md | | workplan | FEP-WP-0009 | backlog | — | workplans/FEP-WP-0009-m1-independent-validation.md | diff --git a/research/evolution/ComparisonWindows.json b/research/evolution/ComparisonWindows.json new file mode 100644 index 0000000..2290854 --- /dev/null +++ b/research/evolution/ComparisonWindows.json @@ -0,0 +1,199 @@ +{ + "schema_version": 1, + "basis": "Declared prospective groups; manually review shared stream, evidence tier, question granularity, evaluation and effort accounting before comparing returns.", + "review_trigger_cycles": 3, + "limits": [ + "Group labels and cycle counts do not establish protocol comparability or a learning trend.", + "Unknown or zero research time prevents effort comparison of the complete declared window; never estimate missing time or silently omit its cycle.", + "A qualitative review may retain cycles with unknown effort; corroboration and inconclusive results remain visible.", + "Readiness is a review trigger, not statistical evidence, a plateau declaration or a maturity judgment." + ], + "windows": [ + { + "stream": "B", + "comparison_group": "B-independent-navigation-source-v1", + "cycle_ids": [ + "LEARN-0014", + "LEARN-0017" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-zulip-navigation.md", + "research/evolution/cycles/2026-09-27-zulip-target-lookup.md" + ], + "cycles_until_review_trigger": 1, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0014" + ], + "unknown_effort_cycle_ids": [ + "LEARN-0017" + ], + "zero_effort_cycle_ids": [], + "effort_complete": false, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 1, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 1 + } + }, + { + "stream": "B", + "comparison_group": "B-navigation-mechanism-v1", + "cycle_ids": [ + "LEARN-0011" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-navigation.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0011" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 1, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 0 + } + }, + { + "stream": "D", + "comparison_group": "D-sqlite-git-recovery-v1", + "cycle_ids": [ + "LEARN-0018" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-28-storage-receiver.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0018" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 1, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 0 + } + }, + { + "stream": "F", + "comparison_group": "F-navigation-focus-v1", + "cycle_ids": [ + "LEARN-0012" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-navigation-focus.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0012" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 1, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 0 + } + }, + { + "stream": "F", + "comparison_group": "F-navigation-ownership-v1", + "cycle_ids": [ + "LEARN-0013" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-navigation-ownership.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0013" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 0, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 1 + } + }, + { + "stream": "cross-stream", + "comparison_group": "CD-acceptance-projection-static-v1", + "cycle_ids": [ + "LEARN-0016" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-zulip-acceptance.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0016" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 1, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 0 + } + }, + { + "stream": "cross-stream", + "comparison_group": "CD-authority-projection-documentary-v1", + "cycle_ids": [ + "LEARN-0015" + ], + "protocol_refs": [ + "research/evolution/cycles/2026-09-27-authority-projection.md" + ], + "cycles_until_review_trigger": 2, + "qualitative_review_due": false, + "positive_effort_cycle_ids": [ + "LEARN-0015" + ], + "unknown_effort_cycle_ids": [], + "zero_effort_cycle_ids": [], + "effort_complete": true, + "effort_comparison_ready": false, + "outcomes": { + "corroboration": 0, + "inconclusive": 0, + "merge": 0, + "rejection": 0, + "revision": 1 + } + } + ] +} diff --git a/research/evolution/EvolutionReport.md b/research/evolution/EvolutionReport.md index 5c2541b..c8621f4 100644 --- a/research/evolution/EvolutionReport.md +++ b/research/evolution/EvolutionReport.md @@ -59,62 +59,78 @@ Ten selected retrospective outcomes (not a historical census), followed by prosp Cycles with recorded research effort: 7/18. Unknown effort is neither zero nor estimated from commits, tokens or assertion counts. +### Comparison readiness + +Declared groups require a review of shared evidence tier, question granularity, evaluation and effort accounting. A matching label is not proof of comparability. [Machine-readable window audit](../../research/evolution/ComparisonWindows.json). + +| Stream / declared group | Cycles | Positive effort | Unknown / zero effort | Qualitative review trigger | Complete-window effort comparison | +| --- | ---: | ---: | ---: | --- | --- | +| B / B-independent-navigation-source-v1 | 2 | 1 | 1 / 0 | pending | not ready | +| B / B-navigation-mechanism-v1 | 1 | 1 | 0 / 0 | pending | not ready | +| D / D-sqlite-git-recovery-v1 | 1 | 1 | 0 / 0 | pending | not ready | +| F / F-navigation-focus-v1 | 1 | 1 | 0 / 0 | pending | not ready | +| F / F-navigation-ownership-v1 | 1 | 1 | 0 / 0 | pending | not ready | +| cross-stream / CD-acceptance-projection-static-v1 | 1 | 1 | 0 / 0 | pending | not ready | +| cross-stream / CD-authority-projection-documentary-v1 | 1 | 1 | 0 / 0 | pending | not ready | + +Unknown or zero effort is not dropped to create a favorable window. Qualitative review can retain those cycles, but effort comparisons need an explicitly reviewed window with measured positive research time. No trend or plateau is inferred. + ### Stream B / B-independent-navigation-source-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0014 | revision | 6.345 | 9.46 | -| LEARN-0017 | corroboration | unknown | unknown | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0014 | [protocol](../../research/evolution/cycles/2026-09-27-zulip-navigation.md) | revision | 6.345 | 9.46 | +| LEARN-0017 | [protocol](../../research/evolution/cycles/2026-09-27-zulip-target-lookup.md) | corroboration | unknown | unknown | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream B / B-navigation-mechanism-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0011 | corroboration | 6.177 | 0.00 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0011 | [protocol](../../research/evolution/cycles/2026-09-27-navigation.md) | corroboration | 6.177 | 0.00 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream D / D-sqlite-git-recovery-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0018 | corroboration | 4.123 | 0.00 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0018 | [protocol](../../research/evolution/cycles/2026-09-28-storage-receiver.md) | corroboration | 4.123 | 0.00 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream F / F-navigation-focus-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0012 | corroboration | 5.138 | 0.00 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0012 | [protocol](../../research/evolution/cycles/2026-09-27-navigation-focus.md) | corroboration | 5.138 | 0.00 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream F / F-navigation-ownership-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0013 | revision | 13.918 | 4.31 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0013 | [protocol](../../research/evolution/cycles/2026-09-27-navigation-ownership.md) | revision | 13.918 | 4.31 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream cross-stream / CD-acceptance-projection-static-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0016 | corroboration | 4.182 | 0.00 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0016 | [protocol](../../research/evolution/cycles/2026-09-27-zulip-acceptance.md) | corroboration | 4.182 | 0.00 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ### Stream cross-stream / CD-authority-projection-documentary-v1 -| Cycle | Outcome | Research minutes | Consequential outcome/hour | -| --- | --- | ---: | ---: | -| LEARN-0015 | revision | 3.128 | 19.18 | +| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour | +| --- | --- | --- | ---: | ---: | +| LEARN-0015 | [protocol](../../research/evolution/cycles/2026-09-27-authority-projection.md) | revision | 3.128 | 19.18 | -One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment. +One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three declared cycles: qualitative review trigger pending; no trend assessment. ## Coherence and maintainability @@ -124,7 +140,7 @@ Profiles with unknown last substantive review date: 0. Assessment dates record t 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 [FEP-WP-0002-seed-language-validation](../../workplans/FEP-WP-0002-seed-language-validation.md), [FEP-WP-0003-contrasting-schools](../../workplans/FEP-WP-0003-contrasting-schools.md), [FEP-WP-0006-language-evolution](../../workplans/FEP-WP-0006-language-evolution.md). +Review backlog and evidence gaps remain in [FEP-WP-0009-m1-independent-validation](../../workplans/FEP-WP-0009-m1-independent-validation.md), [FEP-WP-0003-contrasting-schools](../../workplans/FEP-WP-0003-contrasting-schools.md), [FEP-WP-0006-language-evolution](../../workplans/FEP-WP-0006-language-evolution.md), [FEP-WP-0008-use-driven-improvement](../../workplans/FEP-WP-0008-use-driven-improvement.md). ## Pattern profiles diff --git a/research/evolution/README.md b/research/evolution/README.md index 7afcd9f..ac8d63b 100644 --- a/research/evolution/README.md +++ b/research/evolution/README.md @@ -66,6 +66,9 @@ renew them. Historical snapshots retain their original schema-v1 assessments. undermine their scope. Never promote automatically from metric thresholds. Commands: `make evolution-report`, `make evolution-check`, `make evolution-test`. +Generation writes both EvolutionReport.md and the machine-readable +[ComparisonWindows.json](ComparisonWindows.json); checking rejects stale output +in either artifact. The check rejects stale candidate hashes, missing references, inventory drift, invalid provenance, unknown identities, corrupted baseline candidate hashes and stale generated output. It does not @@ -112,6 +115,21 @@ baseline or the selected retrospective entries. Prefer more independent validati when beliefs stabilize; broaden when new contexts expose missing decisions; repair structure when ambiguity prevents use. Low novelty alone is not a stopping rule. +The window audit groups prospective entries by declared stream and comparison-group +label, orders them by date/identity, and retains links to every registered protocol. +Its three-cycle qualitative review trigger does not verify comparability: review +evidence tier, question granularity, evaluation and accounting against those protocols +first. Retrospective entries never join a window, even if later assigned effort or +a matching label. Outcomes include corroboration and inconclusive work. + +The audit distinguishes positive research time, unknown time and recorded zero time. +Unknown or zero effort permits qualitative discussion with limits but prevents +effort comparison of the complete declared window. Do not silently discard those +cycles or reconstruct their time from commits. A narrower window needs an explicit +review explaining its boundary and retained exclusions. Readiness does not calculate +a trend, declare a plateau or complete WP-0006 T03; that task needs an evidence-bearing +review of useful comparable research, not a generated count. + Keep both the unchanged candidate cohort and additions/removals visible when comparing snapshots. A growing inventory must not hide weakening evidence for old claims. Learning continues after milestones; finite workplans carry the next bounded diff --git a/research/evolution/context.json b/research/evolution/context.json index aa7e362..be8c46e 100644 --- a/research/evolution/context.json +++ b/research/evolution/context.json @@ -64,8 +64,9 @@ "adjudicated_unsupported_claim_count": null }, "open_work": [ - "workplans/FEP-WP-0002-seed-language-validation.md", + "workplans/FEP-WP-0009-m1-independent-validation.md", "workplans/FEP-WP-0003-contrasting-schools.md", - "workplans/FEP-WP-0006-language-evolution.md" + "workplans/FEP-WP-0006-language-evolution.md", + "workplans/FEP-WP-0008-use-driven-improvement.md" ] } diff --git a/scripts/research_evolution.py b/scripts/research_evolution.py index 200ecde..42b6745 100644 --- a/scripts/research_evolution.py +++ b/scripts/research_evolution.py @@ -105,6 +105,49 @@ def cell(value): return str(value).replace('|', '\\|').replace('\n', ' ') +def comparison_windows(data): + """Audit declared prospective groups; labels do not prove comparability.""" + groups = defaultdict(list) + for event in data['ledger']['events']: + if event['recording'] == 'prospective': + groups[(event['stream'], event['comparison_group'])].append(event) + windows = [] + for (stream, group), entries in sorted(groups.items()): + entries = sorted(entries, key=lambda e: (e['date'], e['id'])) + unknown = [e['id'] for e in entries if e['effort']['research_minutes'] is None] + zero = [e['id'] for e in entries if e['effort']['research_minutes'] == 0] + measured = [e['id'] for e in entries + if e['effort']['research_minutes'] is not None and e['effort']['research_minutes'] > 0] + due = len(entries) >= 3 + windows.append({ + 'stream': stream, + 'comparison_group': group, + 'cycle_ids': [e['id'] for e in entries], + 'protocol_refs': list(dict.fromkeys(e['protocol_ref'] for e in entries)), + 'cycles_until_review_trigger': max(0, 3 - len(entries)), + 'qualitative_review_due': due, + 'positive_effort_cycle_ids': measured, + 'unknown_effort_cycle_ids': unknown, + 'zero_effort_cycle_ids': zero, + 'effort_complete': not unknown and not zero, + 'effort_comparison_ready': due and not unknown and not zero, + 'outcomes': {kind: sum(e['disposition'] == kind for e in entries) + for kind in sorted(DISPOSITIONS)}, + }) + return { + 'schema_version': 1, + 'basis': 'Declared prospective groups; manually review shared stream, evidence tier, question granularity, evaluation and effort accounting before comparing returns.', + 'review_trigger_cycles': 3, + 'limits': [ + 'Group labels and cycle counts do not establish protocol comparability or a learning trend.', + 'Unknown or zero research time prevents effort comparison of the complete declared window; never estimate missing time or silently omit its cycle.', + 'A qualitative review may retain cycles with unknown effort; corroboration and inconclusive results remain visible.', + 'Readiness is a review trigger, not statistical evidence, a plateau declaration or a maturity judgment.', + ], + 'windows': windows, + } + + def render(data, baseline=None): profiles = data['profiles']['profiles'] events = data['ledger']['events'] @@ -147,23 +190,32 @@ def render(data, baseline=None): lines += [f'| {k} | {counts[k]} |' for k in sorted(DISPOSITIONS)] lines += ['', f'Cycles with recorded research effort: {sum(e["effort"]["research_minutes"] is not None for e in events)}/{len(events)}. ' 'Unknown effort is neither zero nor estimated from commits, tokens or assertion counts.', ''] - groups = defaultdict(list) - for e in events: - if e['recording'] == 'prospective': - groups[(e['stream'], e['comparison_group'])].append(e) - if not groups: + audit = comparison_windows(data) + if not audit['windows']: lines += ['No prospective comparison windows yet. Learning rate and diminishing returns: **not measurable from this baseline**.', ''] - for (stream, group), entries in sorted(groups.items()): - entries = sorted(entries, key=lambda e: (e['date'], e['id'])) - lines += [f'### Stream {stream} / {cell(group)}', '', - '| Cycle | Outcome | Research minutes | Consequential outcome/hour |', '| --- | --- | ---: | ---: |'] + else: + lines += ['### Comparison readiness', '', + 'Declared groups require a review of shared evidence tier, question granularity, evaluation and effort accounting. A matching label is not proof of comparability. ' + + link('research/evolution/ComparisonWindows.json', 'Machine-readable window audit') + '.', '', + '| Stream / declared group | Cycles | Positive effort | Unknown / zero effort | Qualitative review trigger | Complete-window effort comparison |', + '| --- | ---: | ---: | ---: | --- | --- |'] + for window in audit['windows']: + lines.append(f'| {window["stream"]} / {cell(window["comparison_group"])} | {len(window["cycle_ids"])} | ' + f'{len(window["positive_effort_cycle_ids"])} | {len(window["unknown_effort_cycle_ids"])} / {len(window["zero_effort_cycle_ids"])} | ' + f'{"due" if window["qualitative_review_due"] else "pending"} | {"ready for protocol review" if window["effort_comparison_ready"] else "not ready"} |') + lines += ['', 'Unknown or zero effort is not dropped to create a favorable window. Qualitative review can retain those cycles, but effort comparisons need an explicitly reviewed window with measured positive research time. No trend or plateau is inferred.', ''] + by_id = {e['id']: e for e in events} + for window in audit['windows']: + entries = [by_id[ident] for ident in window['cycle_ids']] + lines += [f'### Stream {window["stream"]} / {cell(window["comparison_group"])}', '', + '| Cycle | Protocol | Outcome | Research minutes | Consequential outcome/hour |', '| --- | --- | --- | ---: | ---: |'] for e in entries: minutes = e['effort']['research_minutes'] consequential = e['disposition'] in {'revision', 'rejection', 'merge'} rate = f'{60/minutes:.2f}' if consequential and minutes else ('0.00' if minutes else 'unknown') - lines.append(f'| {e["id"]} | {e["disposition"]} | {minutes if minutes is not None else "unknown"} | {rate} |') + lines.append(f'| {e["id"]} | {link(e["protocol_ref"], "protocol")} | {e["disposition"]} | {minutes if minutes is not None else "unknown"} | {rate} |') lines += ['', 'One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. ' - + ('Fewer than three comparable cycles: no trend assessment.' if len(entries) < 3 else 'At least three cycles: eligible for a qualitative review of returns; this does not demonstrate a plateau.'), ''] + + ('Fewer than three declared cycles: qualitative review trigger pending; no trend assessment.' if not window['qualitative_review_due'] else 'At least three declared cycles: qualitative review trigger reached, subject to protocol comparability review; this does not demonstrate a plateau.'), ''] 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)}. ' @@ -228,12 +280,17 @@ def main(): validate_snapshot(baseline) output = render(data, baseline) path = ROOT / DATA / 'EvolutionReport.md' + audit_path = ROOT / DATA / 'ComparisonWindows.json' + audit_output = json.dumps(comparison_windows(data), indent=2, ensure_ascii=False) + '\n' if args.command == 'check': require(path.read_text() == output, 'Stale report: run make evolution-report') + require(audit_path.read_text() == audit_output, 'Stale comparison windows: run make evolution-report') print('Evolution records and generated report are consistent.') else: path.write_text(output) + audit_path.write_text(audit_output) print(path.relative_to(ROOT)) + print(audit_path.relative_to(ROOT)) except (ValueError, KeyError, OSError) as exc: parser.exit(1, f'Evolution validation failed: {exc}\n') diff --git a/templates/LearningCycle.md b/templates/LearningCycle.md index 60de69b..b4c0233 100644 --- a/templates/LearningCycle.md +++ b/templates/LearningCycle.md @@ -6,6 +6,8 @@ Status: planned; register before execution. One bounded question per cycle. - Stream (A–F or cross-stream): - Comparison group and shared protocol (question size, evidence tier, evaluation, and effort accounting must match; use a new group when they change): +- Prior cycle/protocol references and why this question is useful (a group label or + reaching the three-cycle review trigger is not justification): - Question and affected CAND identities: - Previous belief and expected decision: - Observation that would contradict the belief: @@ -22,6 +24,8 @@ Status: planned; register before execution. One bounded question per cycle. - Remaining uncertainty and live workplan/task: - Superseded ledger entries, if any: - Active research minutes / execution minutes (unknown if not measured): +- Accounting gaps or recorded zero time and their effect on comparison (retain the + cycle; never reconstruct missing effort or silently remove it from a window): - Reported tokens / cost USD, with receipts (unknown if not measured): - Reviewer name, role and independence: diff --git a/tests/test_research_evolution.py b/tests/test_research_evolution.py index ed8b175..a2d9c59 100644 --- a/tests/test_research_evolution.py +++ b/tests/test_research_evolution.py @@ -4,6 +4,7 @@ import importlib.util import json from pathlib import Path import subprocess +import sys import pytest @@ -23,6 +24,7 @@ def test_current_records_and_report_are_consistent(data): baseline = json.loads((ROOT / evolution.DATA / 'snapshots/baseline-2026-09-26.json').read_text()) evolution.validate_snapshot(baseline) assert evolution.render(data, baseline) == (ROOT / evolution.DATA / 'EvolutionReport.md').read_text() + assert evolution.comparison_windows(data) == json.loads((ROOT / evolution.DATA / 'ComparisonWindows.json').read_text()) @pytest.mark.parametrize('mutation,match', [ @@ -73,14 +75,76 @@ def test_rates_separate_corroboration_unknown_effort_and_streams(data): events[3]['stream'] = 'F' evolution.validate(data) report = evolution.render(data) - assert '| LEARN-0001 | revision | 30 | 2.00 |' in report - assert '| LEARN-0002 | corroboration | 30 | 0.00 |' in report - assert '| LEARN-0003 | revision | unknown | unknown |' in report + assert '| revision | 30 | 2.00 |' in report + assert '| corroboration | 30 | 0.00 |' in report + assert '| revision | unknown | unknown |' in report assert '### Stream F / controlled-mechanism' in report - assert 'Fewer than three comparable cycles' in report + assert 'Fewer than three declared cycles' in report assert 'does not demonstrate a plateau' in report events[0]['effort']['research_minutes'] = 0 - assert '| LEARN-0001 | revision | 0 | unknown |' in evolution.render(data) + assert '| revision | 0 | unknown |' in evolution.render(data) + + +@pytest.mark.parametrize('minutes', [None, 0]) +def test_three_declared_cycles_trigger_review_without_fabricating_effort(data, minutes): + entries = deepcopy(data['ledger']['events'][:3]) + for entry in entries: + entry.update(recording='prospective', comparison_group='test-window', stream='B', protocol_ref='templates/LearningCycle.md') + entry['effort']['research_minutes'] = 10 + entries[1]['effort']['research_minutes'] = minutes + entries[1]['disposition'] = 'inconclusive' + data['ledger']['events'] = entries + window, = evolution.comparison_windows(data)['windows'] + assert window['qualitative_review_due'] + assert window['cycles_until_review_trigger'] == 0 + assert not window['effort_complete'] + assert not window['effort_comparison_ready'] + assert window['positive_effort_cycle_ids'] == ['LEARN-0001', 'LEARN-0003'] + assert window['unknown_effort_cycle_ids'] == (['LEARN-0002'] if minutes is None else []) + assert window['zero_effort_cycle_ids'] == (['LEARN-0002'] if minutes == 0 else []) + assert window['outcomes']['inconclusive'] == 1 + # One more measured cycle cannot silently drop the intervening effort gap. + extra = deepcopy(entries[0]) + extra['id'] = 'LEARN-0004' + data['ledger']['events'].append(extra) + assert not evolution.comparison_windows(data)['windows'][0]['effort_comparison_ready'] + entries[1]['effort']['research_minutes'] = 10 + assert evolution.comparison_windows(data)['windows'][0]['effort_comparison_ready'] + assert 'subject to protocol comparability review' in evolution.render(data) + + +def test_window_audit_retains_order_protocols_and_stream_separation(data): + entries = deepcopy(data['ledger']['events'][:4]) + for entry in entries[:3]: + entry.update(recording='prospective', comparison_group='same-label', stream='B', protocol_ref='templates/LearningCycle.md') + entry['effort']['research_minutes'] = 10 + entries[1]['protocol_ref'] = 'research/evolution/cycles/2026-09-27-navigation.md' + entries[2]['stream'] = 'F' + entries[3]['comparison_group'] = 'same-label' # Retrospective data stays excluded. + entries[3]['effort']['research_minutes'] = 10 + data['ledger']['events'] = list(reversed(entries)) + audit = evolution.comparison_windows(data) + b, f = audit['windows'] + assert b['cycle_ids'] == ['LEARN-0001', 'LEARN-0002'] + assert b['protocol_refs'] == ['templates/LearningCycle.md', 'research/evolution/cycles/2026-09-27-navigation.md'] + assert b['cycles_until_review_trigger'] == 1 + assert b['effort_complete'] and not b['effort_comparison_ready'] + assert f['cycle_ids'] == ['LEARN-0003'] + assert not f['qualitative_review_due'] + + +def test_check_rejects_stale_window_audit(tmp_path, monkeypatch, capsys): + for ref in ['EvolutionReport.md', 'ComparisonWindows.json', 'snapshots/baseline-2026-09-26.json']: + path = tmp_path / evolution.DATA / ref + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes((ROOT / evolution.DATA / ref).read_bytes()) + (tmp_path / evolution.DATA / 'ComparisonWindows.json').write_text('{}\n') + monkeypatch.setattr(evolution, 'ROOT', tmp_path) + monkeypatch.setattr(sys, 'argv', ['research_evolution.py', 'check']) + with pytest.raises(SystemExit) as exc: + evolution.main() + assert exc.value.code == 1 + assert 'Stale comparison windows' in capsys.readouterr().err def test_snapshot_delta_does_not_count_additions_as_maturity_changes(data): diff --git a/workplans/FEP-WP-0006-language-evolution.md b/workplans/FEP-WP-0006-language-evolution.md index 4b1177f..fcd1a64 100644 --- a/workplans/FEP-WP-0006-language-evolution.md +++ b/workplans/FEP-WP-0006-language-evolution.md @@ -4,11 +4,11 @@ type: workplan title: "Make ongoing language learning observable" domain: infotech repo: frontend-patterns -status: backlog +status: blocked owner: codex topic_slug: canon created: "2026-09-26" -updated: "2026-10-03" +updated: "2026-10-04" state_hub_workstream_id: "528d24c1-c2c4-5914-a065-992b0dd877c8" --- @@ -16,7 +16,7 @@ state_hub_workstream_id: "528d24c1-c2c4-5914-a065-992b0dd877c8" User-approved baseline, learning ledger and generated evolution report. Finite investigations support an ongoing language; no composite maturity score or automatic -promotion. M1/M2 and independent human validation remain open in WP-0002/WP-0003. +promotion. M1/M2 and independent human validation remain open in WP-0009/WP-0003. ## Establish the versioned evidence baseline @@ -50,8 +50,7 @@ experiment receipts. Intent/protocol/program now describe continuous learning. ```task id: FEP-WP-0006-T03 status: wait -depends_on: [FEP-WP-0003-T01] -blocking_reason: "Registers a bounded cycle before FEP-WP-0003-T01's next investigation." +blocking_reason: "Needs useful comparable prospective evidence and an explicit protocol/returns review from WP-0003 or consumer-led WP-0008; largest declared group has two cycles, one with unknown effort." priority: medium state_hub_task_id: "2c5c4bae-a0a9-54bf-ac86-49b2803fdd8c" ``` @@ -220,3 +219,30 @@ when useful research under existing WP-0003 T01 or consumer-led WP-0008 supplies comparable window with honest effort accounting. Do not restart the paused navigation fixture or manufacture repeated studies merely to close T03. No new task/workplan; no diminishing-returns, independent-human or maturity claim. + +## Resumed measurement audit — 2026-10-04 + +The user explicitly resumed this workplan from backlog. Reviewed the current ledger, +registered cycle protocols and reporting implementation. T01/T02 and substantive +review-date reconciliation remain complete. Eight prospective cycles occupy seven +declared groups; B-independent-navigation-source-v1 has LEARN-0014/0017, with +LEARN-0017's effort honestly unknown. No complete three-cycle window exists. + +Implemented a deterministic [window audit](../research/evolution/ComparisonWindows.json) +alongside the evolution report: ordered cycle IDs, protocol references, outcome +counts, positive/unknown/zero effort, qualitative review triggers and complete-window +effort readiness. A matching group label no longer appears to establish comparability. +Three declared entries trigger protocol review; missing effort still permits scoped +qualitative review but cannot silently produce an effort comparison. Regression cases +cover unknown/zero time, nonconsequential outcomes, mixed streams, retrospective +exclusion, ordering and stale generated audit rejection. The cycle template now asks +why a follow-up is useful and requires accounting gaps to stay visible. + +This is measurement infrastructure, not a new empirical learning cycle; no ledger +outcome, candidate freshness, maturity or missing historical time is invented. Updated +the report's open-work references to the live M1 owner WP-0009 and consumer-led WP-0008. +Removed the stale exclusive dependency on parked WP-0003 T01: either owner can supply +useful comparable evidence under its existing scope. No downstream research gate is +waived. T03 remains wait and the resumed workplan is blocked on that evidence; the +paused navigation fixture stays paused. Existing work records retain the next useful +research and returns review; no replacement backlog is created. From 07f1f373744986a22bc4f18710de94534f40343d Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 4 Oct 2026 03:03:18 +0200 Subject: [PATCH 2/2] Record WP-0006 comparison-readiness review boundary Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a1045b-933d-7aa1-b2db-104557487a79 --- ...eview-2026-10-04-comparison-readiness.json | 1531 +++++++++++++++++ workplans/FEP-WP-0006-language-evolution.md | 7 + 2 files changed, 1538 insertions(+) create mode 100644 research/evolution/snapshots/review-2026-10-04-comparison-readiness.json diff --git a/research/evolution/snapshots/review-2026-10-04-comparison-readiness.json b/research/evolution/snapshots/review-2026-10-04-comparison-readiness.json new file mode 100644 index 0000000..b700ad4 --- /dev/null +++ b/research/evolution/snapshots/review-2026-10-04-comparison-readiness.json @@ -0,0 +1,1531 @@ +{ + "schema_version": 1, + "id": "review-2026-10-04-comparison-readiness", + "source_revision": "d8d3a22b541034e4156c8b488636b5a84a1b6092", + "assessment": { + "profiles": { + "schema_version": 1, + "assessed_at": "2026-09-28", + "profiles": [ + { + "id": "CAND-0001", + "path": "research/candidates/ConflictCopy.md", + "title": "Conflict Copy", + "sha256": "24f250d89ac17d96df287d67c275b5320b48c8356b57ae126a6c941e92a1c6e9", + "status": "draft", + "maturity": "hypothesis", + "decision": "Preserve competing versions instead of silently losing one.", + "evidence": [ + { + "kind": "documentary", + "family": "Joplin", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Documented detected-note conflict copy." + }, + { + "kind": "documentary", + "family": "Obsidian", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Optional conflict-file mode, not default behavior." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Complete contract recurrence and fault-tested deployed behavior remain unverified." + ], + "superseded_by": [] + }, + { + "id": "CAND-0002", + "path": "research/candidates/LocalCommitBoundary.md", + "title": "Local Commit Boundary", + "sha256": "22165fc2979e8f4d8859b34417cb71e7b5ec7a8440ad045aee2383d499648013", + "status": "draft", + "maturity": "hypothesis", + "decision": "Define when a local change is durably accepted.", + "evidence": [ + { + "kind": "documentary", + "family": "Ink & Switch", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Local-first motivation." + }, + { + "kind": "documentary", + "family": "Joplin", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Local storage and synchronization architecture." + }, + { + "kind": "runtime", + "family": "authored SQLite / Git recovery fixture", + "ref": "research/reviews/StorageReceiverRecovery.md", + "scope": "SQLite WAL/FULL: pre-commit process kill rolls back; post-commit kill preserves document and outbox. No power-loss/backup proof." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-28", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-28", + "substantive_review_ref": "research/reviews/StorageReceiverRecovery.md", + "substantive_review_scope": "SQLite WAL/FULL: pre-commit process kill rolls back; post-commit kill preserves document and outbox. No power-loss/backup proof." + }, + "gaps": [ + "Process-kill recovery observed in SQLite fixture; power-loss, device-loss backup and full frontend contract remain unverified.", + "Local acceptance is not off-device recovery." + ], + "superseded_by": [] + }, + { + "id": "CAND-0003", + "path": "research/candidates/PendingSynchronization.md", + "title": "Pending Synchronization", + "sha256": "9c5cb0f4ea4e6f4406ce55513ca2c252172427a49d8280ae1a9c713f1d11b070", + "status": "draft", + "maturity": "hypothesis", + "decision": "Keep accepted local intent visible until synchronization resolves.", + "evidence": [ + { + "kind": "documentary", + "family": "Joplin", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Per-item synchronization metadata." + }, + { + "kind": "runtime", + "family": "authored SQLite / Git recovery fixture", + "ref": "research/reviews/StorageReceiverRecovery.md", + "scope": "SQLite atomic supersession/restart plus Git identity replay after lost local acknowledgement; one authored integration, no frontend recurrence." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-28", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-28", + "substantive_review_ref": "research/reviews/StorageReceiverRecovery.md", + "substantive_review_scope": "SQLite atomic supersession/restart plus Git identity replay after lost local acknowledgement; one authored integration, no frontend recurrence." + }, + "gaps": [ + "Atomic supersession observed in SQLite fixture; concurrent in-flight supersession, UI states and general receiver retention remain unverified." + ], + "superseded_by": [] + }, + { + "id": "CAND-0004", + "path": "research/candidates/ExplicitReconciliation.md", + "title": "Explicit Reconciliation", + "sha256": "d48a40aab7417b8b8f8406094c84b9e90d0ca8c2f94d6e616d0b80499dc04959", + "status": "draft", + "maturity": "hypothesis", + "decision": "Resolve divergent content while retaining provenance.", + "evidence": [ + { + "kind": "documentary", + "family": "Joplin", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Documented manual conflict resolution." + }, + { + "kind": "documentary", + "family": "Obsidian", + "ref": "research/reviews/LocalFirstEvidenceExpansion.md", + "scope": "Conflict comparison workflow." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Overlap with Conflict Copy remains an open merge question." + ], + "superseded_by": [] + }, + { + "id": "CAND-0005", + "path": "research/candidates/LocalDraftState.md", + "title": "Local Draft State", + "sha256": "8e5f427975c76083c80b895bc68b7130b249be5129c2854f3df11cc374b4b240", + "status": "draft", + "maturity": "hypothesis", + "decision": "Separate unfinished intent from refreshed authoritative data.", + "evidence": [ + { + "kind": "documentary", + "family": "Kubernetes / GitLab / React Router", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Rejection and pending-input mechanisms motivate recovery." + }, + { + "kind": "static-code", + "family": "Zulip", + "ref": "research/reviews/FrontendRecoveryImplementations.md", + "scope": "Pinned composer draft storage; partial lifecycle." + }, + { + "kind": "static-code", + "family": "Element / Matrix", + "ref": "research/reviews/FrontendRecoveryImplementations.md", + "scope": "Pinned composer draft restoration; partial lifecycle." + }, + { + "kind": "runtime", + "family": "authored release fixture", + "ref": "research/reviews/ActivationConflictsAndReload.md", + "scope": "Same-tab preservation/refusal/discard and post-navigation schema check." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Full base/draft/current merge contract is not verified in deployed frontends." + ], + "superseded_by": [] + }, + { + "id": "CAND-0006", + "path": "research/candidates/VersionCheckedMutation.md", + "title": "Version-Checked Mutation", + "sha256": "6a3335ae2fa1de51c95dcbfa8d766d988a3f7a9604fb608b8a0bcf9a10b64198", + "status": "draft", + "maturity": "hypothesis", + "decision": "Reject an operation whose observed base is stale.", + "evidence": [ + { + "kind": "documentary", + "family": "Kubernetes", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Conditional PUT; precise version mechanism." + }, + { + "kind": "documentary", + "family": "GitLab", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Optional last_commit_id; different failure surface." + }, + { + "kind": "runtime", + "family": "authored release fixture", + "ref": "research/reviews/ActivationConflictsAndReload.md", + "scope": "Related conditional activation-map mechanism in one process, not the full frontend pattern." + }, + { + "kind": "runtime", + "family": "authored SQLite / Git recovery fixture", + "ref": "research/reviews/StorageReceiverRecovery.md", + "scope": "Actual Git receive-pack rejects a forced divergent branch update; related ancestry mechanism, not exact-version frontend semantics." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-28", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-28", + "substantive_review_ref": "research/reviews/StorageReceiverRecovery.md", + "substantive_review_scope": "Actual Git receive-pack rejects a forced divergent branch update; related ancestry mechanism, not exact-version frontend semantics." + }, + "gaps": [ + "Distributed atomicity and complete frontend recurrence remain unverified.", + "Refetch does not authorize overwriting conflicting intent." + ], + "superseded_by": [] + }, + { + "id": "CAND-0007", + "path": "research/candidates/MutationOutcomeTracking.md", + "title": "Mutation Outcome Tracking", + "sha256": "e04cb835fd054bfaf88616375bd0262deffb2801ea04105be92543bfa9582179", + "status": "draft", + "maturity": "hypothesis", + "decision": "Retain operation identity when transport outcome is uncertain.", + "evidence": [ + { + "kind": "documentary", + "family": "Stripe", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Idempotency mechanism." + }, + { + "kind": "documentary", + "family": "React Router", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Cancellation does not imply server rollback." + }, + { + "kind": "static-code", + "family": "Zulip", + "ref": "research/reviews/FrontendRecoveryImplementations.md", + "scope": "Pinned send/recovery state." + }, + { + "kind": "static-code", + "family": "Element / Matrix", + "ref": "research/reviews/FrontendRecoveryImplementations.md", + "scope": "Pinned client and SDK transaction/echo paths." + }, + { + "kind": "runtime", + "family": "Element / Matrix", + "ref": "research/reviews/MatrixRecoveryExperiment.md", + "scope": "Real SDK with synthetic transport: lost acknowledgement, identity reuse and authoritative echo." + }, + { + "kind": "runtime", + "family": "authored SQLite / Git recovery fixture", + "ref": "research/reviews/StorageReceiverRecovery.md", + "scope": "Actual Git same-commit replay is a no-op, reachable identity survives GC, fresh identity repeats intent; no arbitrary operation ledger." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-28", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-28", + "substantive_review_ref": "research/reviews/StorageReceiverRecovery.md", + "substantive_review_scope": "Actual Git same-commit replay is a no-op, reachable identity survives GC, fresh identity repeats intent; no arbitrary operation ledger." + }, + "gaps": [ + "No production server deduplication or complete retention-window guarantee.", + "Cancelling local UI is not remote compensation." + ], + "superseded_by": [] + }, + { + "id": "CAND-0008", + "path": "research/candidates/InvalidateAndReproject.md", + "title": "Invalidate and Reproject", + "sha256": "47c405adbc3caac2383768ed3d30b6a2e7ff1f44f4954c340049e78944227844", + "status": "draft", + "maturity": "hypothesis", + "decision": "Refresh a projection after mutation without equating acceptance and visibility.", + "evidence": [ + { + "kind": "documentary", + "family": "React Router", + "ref": "research/reviews/TransactionalEvidenceExpansion.md", + "scope": "Concurrency and pending-state guidance." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "No independent deployed full-contract observation." + ], + "superseded_by": [] + }, + { + "id": "CAND-0009", + "path": "research/candidates/URLAddressableState.md", + "title": "URL-addressable State", + "sha256": "07d524c3c0dd080bd42ff5dd79a36e6ecd2a8654f07ece880b483477f7ca4497", + "status": "draft", + "maturity": "hypothesis", + "decision": "Make a navigable state reconstructible from its URL.", + "evidence": [ + { + "kind": "documentary", + "family": "htmx", + "ref": "research/reviews/NavigationRenderingEvidence.md", + "scope": "History behavior and history-cache misses." + }, + { + "kind": "documentary", + "family": "Web platform", + "ref": "research/reviews/NavigationRenderingEvidence.md", + "scope": "pushState changes history, not server dereferenceability." + }, + { + "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." + }, + { + "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." + }, + { + "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." + }, + { + "kind": "static-code", + "family": "Zulip", + "ref": "research/reviews/ZulipTargetLookupCallPath.md", + "scope": "ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/ZulipTargetLookupCallPath.md", + "substantive_review_scope": "Traced call-path corroboration of the previously flagged auxiliary-callback gap; still author-model, no application execution." + }, + "gaps": [ + "Independent application recurrence and human/AT validation remain unverified.", + "Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open.", + "Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified." + ], + "superseded_by": [] + }, + { + "id": "CAND-0010", + "path": "research/candidates/ProgressiveEnhancement.md", + "title": "Progressive Enhancement", + "sha256": "1dc3885ef896b9a7cb61af11fa8893484eb1e13454207326abc7250d5ca4382b", + "status": "draft", + "maturity": "hypothesis", + "decision": "Keep essential actions usable when enhancement is unavailable.", + "evidence": [ + { + "kind": "documentary", + "family": "htmx", + "ref": "research/reviews/NavigationRenderingEvidence.md", + "scope": "Boosted links and forms." + }, + { + "kind": "documentary", + "family": "SvelteKit", + "ref": "research/reviews/NavigationRenderingEvidence.md", + "scope": "Form actions and rendering/page options." + }, + { + "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." + }, + { + "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." + }, + { + "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." + }, + { + "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." + }, + { + "kind": "static-code", + "family": "Zulip", + "ref": "research/reviews/ZulipTargetLookupCallPath.md", + "scope": "ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/ZulipTargetLookupCallPath.md", + "substantive_review_scope": "Traced call-path corroboration of the previously flagged auxiliary-callback gap; still author-model, no application execution." + }, + "gaps": [ + "Independent application recurrence and human/AT validation remain unverified.", + "Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open.", + "Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified." + ], + "superseded_by": [] + }, + { + "id": "CAND-0011", + "path": "research/candidates/PresentationModel.md", + "title": "Presentation Model", + "sha256": "5ff03b5799b0a9e5ec6b54b21034720d89dbc8ffde7c4cdcf71616cdf57baf49", + "status": "draft", + "maturity": "hypothesis", + "decision": "Separate presentation decisions from view mechanisms.", + "evidence": [ + { + "kind": "documentary", + "family": "Fowler", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Named pattern and illustrative model/view discussion." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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." + ], + "superseded_by": [] + }, + { + "id": "CAND-0012", + "path": "research/candidates/DerivedState.md", + "title": "Derived State", + "sha256": "9f29b9f1296a52b83f08dfd97437c4dc16e4949ddac1ff3b3830e3fc9831bd4f", + "status": "draft", + "maturity": "hypothesis", + "decision": "Compute a result from explicit authoritative inputs.", + "evidence": [ + { + "kind": "documentary", + "family": "Redux", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Selector guidance, not a requirement for a global store." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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." + ], + "superseded_by": [] + }, + { + "id": "CAND-0013", + "path": "research/candidates/VerticalFeatureSlice.md", + "title": "Vertical Feature Slice", + "sha256": "d6b332b9c104a079bd4b72512b8ddd1a889199b2e2e531753c411688053e647a", + "status": "draft", + "maturity": "hypothesis", + "decision": "Group a capability across UI, state and behavior with explicit interfaces.", + "evidence": [ + { + "kind": "documentary", + "family": "Feature-Sliced Design", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Layer/slice and public-interface guidance." + }, + { + "kind": "static-code", + "family": "Feature-Sliced Design", + "ref": "research/reviews/FeatureDeploymentBoundaries.md", + "scope": "Pinned todo-app interfaces coexist with one application build." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Feature organization does not establish independent activation." + ], + "superseded_by": [] + }, + { + "id": "CAND-0014", + "path": "research/candidates/IslandsOfInteractivity.md", + "title": "Islands of Interactivity", + "sha256": "821a1497da10c02ae11fa6f56cb8e205a4f32c40b39770ab8ca3f907561a260a", + "status": "draft", + "maturity": "hypothesis", + "decision": "Activate selected interactive regions within a document.", + "evidence": [ + { + "kind": "documentary", + "family": "Astro", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Client-island mechanism and execution placement." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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." + ], + "superseded_by": [] + }, + { + "id": "CAND-0015", + "path": "research/candidates/FailureBoundary.md", + "title": "Failure Boundary", + "sha256": "a6e76ed17a92baade683d5df96fa8ecd066c593661e6a14983a86d046e7d9c2c", + "status": "draft", + "maturity": "hypothesis", + "decision": "Contain specified failure classes while preserving useful neighboring work.", + "evidence": [ + { + "kind": "documentary", + "family": "React", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Error boundary scope and exclusions." + }, + { + "kind": "runtime", + "family": "React", + "ref": "research/reviews/BoundaryRecoveryExperiment.md", + "scope": "Real package in authored host: render/event/request distinction and fallback escalation." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Boundary cannot imply containment for all asynchronous failures." + ], + "superseded_by": [] + }, + { + "id": "CAND-0016", + "path": "research/candidates/FocusReturn.md", + "title": "Focus Return", + "sha256": "9149c2f563eafcfec983a9285949225840d97804568309bd16bbb1eb6b3dde77", + "status": "draft", + "maturity": "hypothesis", + "decision": "Restore meaningful focus after a temporary interaction ends.", + "evidence": [ + { + "kind": "documentary", + "family": "WAI-ARIA APG", + "ref": "research/reviews/PatternBreadthExpansion.md", + "scope": "Dialog focus obligations." + }, + { + "kind": "static-code", + "family": "Radix", + "ref": "research/reviews/NestedDismissalIsolation.md", + "scope": "Pinned layer/listener ownership implementation." + }, + { + "kind": "runtime", + "family": "Radix", + "ref": "research/reviews/NestedOwnershipRouting.md", + "scope": "Authored fixture: raw 20/24 versus routed 24/24; browser/build limits retained." + }, + { + "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." + }, + { + "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." + }, + { + "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." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Animated exits and competing owners remain untested; no production repair claim.", + "Route ownership is a contrast, not independent modal recurrence; AT speech and broader history/lifecycle cases remain unverified.", + "Zulip auxiliary target/anchor callbacks, deferred editing focus and search callback wiring remain unverified; static guards do not prove whole-application ownership." + ], + "superseded_by": [] + }, + { + "id": "CAND-0017", + "path": "research/candidates/IndependentFeatureBoundary.md", + "title": "Independent Feature Boundary", + "sha256": "60b78725ed4036681675d4c68244fc25aea6e0dffb09d54a7108e3fcbf527b4f", + "status": "draft", + "maturity": "hypothesis", + "decision": "Separate feature release, activation and session transition contracts.", + "evidence": [ + { + "kind": "documentary", + "family": "single-spa / webpack", + "ref": "research/reviews/FeatureDeploymentBoundaries.md", + "scope": "Mechanism documentation, not deployed independence proof." + }, + { + "kind": "static-code", + "family": "react-microfrontends examples", + "ref": "research/reviews/FeatureDeploymentBoundaries.md", + "scope": "Root config/navbar are one example family with shared startup gating." + }, + { + "kind": "runtime", + "family": "authored release fixture", + "ref": "research/reviews/FeatureReleaseExperiment.md", + "scope": "Publication/activation/rollback across fresh, loaded and lazy sessions." + }, + { + "kind": "runtime", + "family": "authored release fixture", + "ref": "research/reviews/ActivationConflictsAndReload.md", + "scope": "Conditional activation updates and safe reload policies, including negative controls." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "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.", + "Distributed atomicity, retention authorization and native-unload/crash behavior remain open." + ], + "superseded_by": [] + }, + { + "id": "CAND-0018", + "path": "research/candidates/CapabilityContractBoundary.md", + "title": "Capability Contract Boundary", + "sha256": "a678f88e9b53d7273e29e3aea2d23f2297055253dcf4518444d3089fa6da4331", + "status": "draft", + "maturity": "hypothesis", + "decision": "Declare a UI capability's semantic surface separately from its runtime-isolation mechanism.", + "evidence": [ + { + "kind": "documentary", + "family": "Web Components", + "ref": "research/reviews/CapabilityContractSources.md", + "scope": "CC01: Custom Elements observedAttributes/lifecycle callback mechanism, narrower than a full semantic contract." + }, + { + "kind": "documentary", + "family": "webpack", + "ref": "research/reviews/CapabilityContractSources.md", + "scope": "CC02: Module Federation expose/consume module and share-scope dependency-negotiation mechanism, one layer below any UI-facing contract." + } + ], + "independent_full_contract_uses": null, + "review": { + "assessed_at": "2026-09-27", + "reviewer": "Codex", + "role": "author-model", + "independent_human": false, + "last_substantive_review_date": "2026-09-27", + "substantive_review_ref": "research/reviews/CapabilityContractSources.md", + "substantive_review_scope": "Two real substrate specs read directly; the prompting AI-chat transcript is not evidence." + }, + "gaps": [ + "No known use of an explicit capability contract, as distinct from its substrate mechanisms, has been located.", + "Enforcement, versioning and compatibility checking are unverified; a contract with no tooling is only documentation.", + "Only one family per substrate mechanism inspected; no independent recurrence." + ], + "superseded_by": [] + } + ] + }, + "ledger": { + "schema_version": 1, + "coverage": "Ten selected retrospective outcomes (not a historical census), followed by prospectively registered bounded cycles. Retrospective effort remains unknown.", + "events": [ + { + "id": "LEARN-0001", + "date": "2026-09-25", + "recording": "retrospective", + "stream": "D", + "comparison_group": null, + "question": "What do pinned recovery implementations establish?", + "previous_belief": "Documentary motivation did not locate draft/outcome mechanisms in frontend code.", + "conclusion": "Zulip and Element locate partial draft/outcome mechanisms; complete pattern recurrence is still unknown.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0005", + "CAND-0007" + ], + "evidence": [ + "research/reviews/FrontendRecoveryImplementations.md" + ], + "remaining_uncertainty": [ + "Deployed full lifecycle remains unverified." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0002", + "date": "2026-09-25", + "recording": "retrospective", + "stream": "D", + "comparison_group": null, + "question": "Does cancellation or a transport error settle mutation outcome?", + "previous_belief": "Recovery identity and authoritative echo required executable checks.", + "conclusion": "Synthetic transport with the real Matrix SDK distinguishes replay identity, duplicate commits and authoritative echo.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0007" + ], + "evidence": [ + "research/reviews/MatrixRecoveryExperiment.md" + ], + "remaining_uncertainty": [ + "No real server deduplication guarantee." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0003", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "cross-stream", + "comparison_group": null, + "question": "Does naming patterns improve the frozen pilot decisions?", + "previous_belief": "Initial editorial scores were 21/24 named and 19/24 prose.", + "conclusion": "Submitted model review adjudication yields 18/24 in each condition; this does not establish equivalence or a presentation benefit.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0005", + "CAND-0007", + "CAND-0001", + "CAND-0002" + ], + "evidence": [ + "research/evaluations/language-pilot-01/submitted-review-01/adjudication.md" + ], + "remaining_uncertainty": [ + "Independent human validation pending.", + "Historical effort unknown; this entry does not allocate whole-pilot telemetry." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0004", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "D", + "comparison_group": null, + "question": "Which recovery recommendations overstate their guarantees?", + "previous_belief": "Shared guidance left retention/export policy, cancellation and local backup boundaries insufficiently explicit.", + "conclusion": "Guidance now separates authorization, remote compensation, atomic supersession and off-device backup.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0001", + "CAND-0002", + "CAND-0003", + "CAND-0005", + "CAND-0007" + ], + "evidence": [ + "research/reviews/SharedGuidanceRevision.md" + ], + "remaining_uncertainty": [ + "Editorial correction is not new production evidence." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0005", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "B", + "comparison_group": null, + "question": "What does URL/history and enhancement documentation actually promise?", + "previous_belief": "Navigation and rendering seeds lacked explicit dereferenceability and fallback distinctions.", + "conclusion": "Developed two hypotheses separating address-bar updates from direct loads, and HTML delivery from usable no-script actions.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0009", + "CAND-0010" + ], + "evidence": [ + "research/reviews/NavigationRenderingEvidence.md" + ], + "remaining_uncertainty": [ + "Navigation/history/cache runtime checks remain pending." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0006", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "F", + "comparison_group": null, + "question": "Why can immediate nested dismissal close the outer task?", + "previous_belief": "The first fixture exposed a timing failure with unresolved ownership.", + "conclusion": "Trace locates stale Escape listener ownership despite inner registration/focus; a guard can lose input.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0016", + "CAND-0015" + ], + "evidence": [ + "research/reviews/BoundaryRecoveryExperiment.md", + "research/reviews/NestedDismissalIsolation.md" + ], + "remaining_uncertainty": [ + "Readiness waits are not a public product repair." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0007", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "F", + "comparison_group": null, + "question": "Can event-time ownership route dismissal without a settling delay?", + "previous_belief": "Isolation supplied a mechanism but no lifecycle-safe candidate routing experiment.", + "conclusion": "Controlled fixture routed 24/24 versus raw 20/24; initial measurement error and corrected results retained.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0016" + ], + "evidence": [ + "research/reviews/NestedOwnershipRouting.md" + ], + "remaining_uncertainty": [ + "Animated exit and competing-owner coverage remain open." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0008", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "E", + "comparison_group": null, + "question": "Are feature organization and independent activation the same boundary?", + "previous_belief": "The feature-slice hypothesis needed a source-layout/release contrast.", + "conclusion": "Pinned examples distinguish organizational slicing from activation contracts; added Independent Feature Boundary.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0013", + "CAND-0017" + ], + "evidence": [ + "research/reviews/FeatureDeploymentBoundaries.md" + ], + "remaining_uncertainty": [ + "Shared startup dependencies still couple nominally separate features." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0009", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "E", + "comparison_group": null, + "question": "Does publication or rollback update every session?", + "previous_belief": "Static source review could not establish loaded/lazy-session behavior.", + "conclusion": "Native-module experiment distinguishes publication, activation and already-bound sessions; artifact retirement breaks old lazy sessions.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0017" + ], + "evidence": [ + "research/reviews/FeatureReleaseExperiment.md" + ], + "remaining_uncertainty": [ + "No CDN or upstream deployment validation." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0010", + "date": "2026-09-26", + "recording": "retrospective", + "stream": "E", + "comparison_group": null, + "question": "How do stale activation writers and unfinished drafts constrain updates?", + "previous_belief": "Release experiment left activation conflicts and reload policy unexecuted.", + "conclusion": "Conditional replacement rejects stale writers; explicit reload policies preserve or refuse transition, with schema recheck after navigation.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0017", + "CAND-0005", + "CAND-0006" + ], + "evidence": [ + "research/reviews/ActivationConflictsAndReload.md" + ], + "remaining_uncertainty": [ + "One-process atomicity; no native unload, crash or real remote-outcome coverage." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0011", + "date": "2026-09-27", + "recording": "prospective", + "stream": "B", + "comparison_group": "B-navigation-mechanism-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-navigation.md", + "question": "Can a public route preserve selection and complete-document availability across native/enhanced entry, history and HTTP caching?", + "previous_belief": "Native href/GET contracts plus representation-aware routing and cache selection should satisfy this narrow obligation; documentary support lacked runtime checks.", + "conclusion": "Corroborated in pinned htmx fixture: native and history paths work; missing Vary reproduces fragment-as-document reuse in both browsers. Existing obligations stand; no new pattern or promotion.", + "disposition": "corroboration", + "affected_patterns": [ + "CAND-0009", + "CAND-0010" + ], + "evidence": [ + "research/reviews/NavigationHistoryExperiment.md", + "research/experiments/navigation-history/result.json", + "research/evolution/cycles/2026-09-27-navigation-effort.json" + ], + "remaining_uncertainty": [ + "One authored application, no independent recurrence or usefulness gain.", + "Accessibility, delayed scripts, interrupted transport, real intermediaries and offline availability remain open." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 6.177, + "execution_minutes": 1.021, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0012", + "date": "2026-09-27", + "recording": "prospective", + "stream": "F", + "comparison_group": "F-navigation-focus-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-navigation-focus.md", + "question": "Does enhanced route replacement need explicit continuation and feedback policy that respects changed focus ownership?", + "previous_belief": "Native controls alone do not establish enhanced focus/feedback semantics; delayed responses should respect focus moved to another surviving task. Modal return is not automatically route continuation.", + "conclusion": "Corroborated in 22 cases: raw same-ID link focus survives but this fragment contract leaves stale title and silent failure; authored heading/status policy works and preserves newer search focus. No AT speech or universal heading policy established.", + "disposition": "corroboration", + "affected_patterns": [ + "CAND-0010", + "CAND-0016" + ], + "evidence": [ + "research/reviews/NavigationFocusExperiment.md", + "research/experiments/navigation-history/focus-result.json", + "research/evolution/cycles/2026-09-27-navigation-focus-effort.json" + ], + "remaining_uncertainty": [ + "Author-model DOM evidence, no human/AT validation or independent recurrence.", + "Delayed history focus, competing requests, delayed scripts and interrupted enhancement remain open." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 5.138, + "execution_minutes": 0.525, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0013", + "date": "2026-09-27", + "recording": "prospective", + "stream": "F", + "comparison_group": "F-navigation-ownership-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-navigation-ownership.md", + "question": "Can obsolete history/navigation completions affect newer intent, and does separating completion ownership from focus ownership prevent it?", + "previous_belief": "The single-response continuation policy preserved newer search focus but left competing history/success/error completions unresolved; focus-at-swap alone might not be sufficient.", + "conclusion": "Revise operational guidance: validate navigation ownership before content/URL/title/feedback effects, including stale errors and newer failure, independently of focus permission. Prior policy misses obligations in 12/12 adversarial rows; authored guard meets 12/12. Pause fixture work for independent source contrast.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0009", + "CAND-0010", + "CAND-0016" + ], + "evidence": [ + "research/reviews/NavigationOwnershipExperiment.md", + "research/reviews/NavigationThreadReview.md", + "research/experiments/navigation-history/ownership-result.json", + "research/evolution/cycles/2026-09-27-navigation-ownership-effort.json" + ], + "remaining_uncertainty": [ + "One authored htmx family and author-model review, not production recurrence or AT validation.", + "History adapter is pinned implementation-dependent; pending-state, multiple-miss and lifecycle limits remain open.", + "Three distinct protocols are not a comparable diminishing-returns window." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 13.918, + "execution_minutes": 1.238, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0014", + "date": "2026-09-27", + "recording": "prospective", + "stream": "B", + "comparison_group": "B-independent-navigation-source-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-zulip-navigation.md", + "question": "Where does independently developed Zulip scope navigation/search result and focus applicability, and where does our model fail to establish a guarantee?", + "previous_belief": "The authored navigation generation guard protected current-view and focus effects, but independent application recurrence and alternative ownership/cache policies were unverified.", + "conclusion": "Revise guidance toward per-effect applicability: pinned Zulip preserves noncurrent cache data while guarding main selected-view continuations by list identity. Make client-fragment addressability explicit without inferring no-script enhancement. Shared feedback, auxiliary callbacks and deferred focus limit the inference.", + "disposition": "revision", + "affected_patterns": [ + "CAND-0009", + "CAND-0010", + "CAND-0016" + ], + "evidence": [ + "research/reviews/ZulipNavigationSourceStudy.md", + "research/reviews/ZulipNavigationSources.json", + "research/evolution/cycles/2026-09-27-zulip-navigation-effort.json" + ], + "remaining_uncertainty": [ + "Static targeted ranges in twelve files, no Zulip runtime/upstream test execution or independent human/AT review.", + "Auxiliary lookup/anchor continuations, deferred focus and callback wiring need a bounded follow-up before any race claim.", + "One Zulip family supplies partial mechanisms, not full-contract recurrence or a no-script guarantee." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 6.345, + "execution_minutes": 0.289, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0015", + "date": "2026-09-27", + "recording": "prospective", + "stream": "cross-stream", + "comparison_group": "CD-authority-projection-documentary-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-authority-projection.md", + "question": "Do the six authority/projection seeds denote reusable patterns or a mixture of scoped acceptance, projection placement and delivery choices?", + "previous_belief": "Authority is scoped and acknowledgement levels differ, but six seed names lack developed contracts and their projection/delivery relationships are not explicitly compared.", + "conclusion": "Revise the research decision aid to separate scoped acceptance, projection computation and delivery timing with compatibility constraints. Six seed dispositions and two synthetic traces; retain all seeds, zero new drafts or candidate maturity changes.", + "disposition": "revision", + "affected_patterns": [], + "evidence": [ + "research/reviews/AuthorityProjectionComparison.md", + "research/evolution/cycles/2026-09-27-authority-projection-effort.json" + ], + "remaining_uncertainty": [ + "Six living primary documents across four families, not independent full-contract implementations; exact revisions unknown.", + "Synthetic VC-01/02 reasoning is not execution or demonstrated usefulness; authority/merge/storage and phase-specific recovery contracts still need application evidence.", + "Existing candidate profiles unchanged; five prospective groups are not a comparable learning trend." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 3.128, + "execution_minutes": 0.033, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0016", + "date": "2026-09-27", + "recording": "prospective", + "stream": "cross-stream", + "comparison_group": "CD-acceptance-projection-static-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-zulip-acceptance.md", + "question": "Does the six-question authority/projection aid distinguish local editable content, remote shared acceptance and subsequent projection in a pinned application?", + "previous_belief": "Scoped acceptance, projection location and delivery schedule are separate questions with compatibility constraints; a local display need not establish shared acceptance.", + "conclusion": "Corroborated in pinned Zulip content editing: conditional local Markdown echo precedes remote validation; locked optional content checks and server rendering precede save/event scheduling; HTTP and event application are distinct paths. Same displayed object can carry tentative content. No candidate or maturity change.", + "disposition": "corroboration", + "affected_patterns": [], + "evidence": [ + "research/reviews/ZulipAcceptanceProjection.md", + "research/reviews/ZulipAcceptanceSources.json", + "research/evolution/cycles/2026-09-27-zulip-acceptance-effort.json" + ], + "remaining_uncertainty": [ + "Ten selected source/test files from one existing Zulip family, no application/database/upstream test execution or full-contract recurrence.", + "Response/event ordering, lost response after acceptance and current-edit ownership need preregistered reproduction; no defect or safe-replay claim.", + "Six prospective groups are not a comparable trend; original human and milestone gates remain open." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 4.182, + "execution_minutes": 0.102, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0017", + "date": "2026-09-27", + "recording": "prospective", + "stream": "B", + "comparison_group": "B-independent-navigation-source-v1", + "protocol_ref": "research/evolution/cycles/2026-09-27-zulip-target-lookup.md", + "question": "Do Zulip's target-message lookup and anchor-navigation fetch continuation guard against a stale navigation that occurred while the request was in flight, the way the main narrow-fetch continuation (ZN02) does?", + "previous_belief": "ZN07 located both callbacks and noted no visible captured-current-list guard, but did not trace their callers or check test coverage.", + "conclusion": "Traced both continuations to their concrete completion points: process_result calls opts.cont unconditionally, and neither the target-lookup channel.get nor load_messages_around_anchor supplies opts.msg_list, so neither participates in the opt-in list-identity guard that message_fetch.ts implements for other callers. No located test exercises a stale-navigation scenario for either path.", + "disposition": "corroboration", + "affected_patterns": [ + "CAND-0009", + "CAND-0010" + ], + "evidence": [ + "research/reviews/ZulipTargetLookupCallPath.md", + "research/reviews/ZulipTargetLookupSources.json", + "research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json" + ], + "remaining_uncertainty": [ + "Static source trace only; no application, database or upstream test executed, and no race actually reproduced.", + "show() performs its own state reset on entry, so a stale re-entry's externally observable effect is unverified without execution.", + "Second cycle in comparison group B-independent-navigation-source-v1; still short of three comparable cycles, and the workplan's rule against manufacturing cycles to reach that count still applies." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": null, + "execution_minutes": null, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + }, + { + "id": "LEARN-0018", + "date": "2026-09-28", + "recording": "prospective", + "stream": "D", + "comparison_group": "D-sqlite-git-recovery-v1", + "protocol_ref": "research/evolution/cycles/2026-09-28-storage-receiver.md", + "question": "Which process-recovery obligations can SQLite plus actual Git receive-pack satisfy, and where does object identity fail to supply an operation receipt?", + "previous_belief": "Atomic local intent/outbox updates and stable receiver identity support recovery within explicit transaction, ancestry and retention boundaries.", + "conclusion": "Nine checks corroborate atomic SQLite process recovery, Git replay and server ancestry refusal; split-transaction and fresh-identity negative controls retain the limits. One authored integration, not a full frontend use.", + "disposition": "corroboration", + "affected_patterns": [ + "CAND-0002", + "CAND-0003", + "CAND-0006", + "CAND-0007" + ], + "evidence": [ + "research/reviews/StorageReceiverRecovery.md", + "research/experiments/storage-receiver/result.json", + "research/evolution/cycles/2026-09-28-storage-receiver-effort.json" + ], + "remaining_uncertainty": [ + "Power-loss, device-loss backup, remote durability and arbitrary operation-ID retention remain unverified.", + "No full frontend contract, independent human validation or M1/M2/M3 acceptance.", + "New runtime group is not comparable with static studies; no learning trend." + ], + "reviewer": { + "name": "Codex", + "role": "author-model", + "independent_human": false + }, + "effort": { + "research_minutes": 4.123, + "execution_minutes": 0.014, + "reported_tokens": null, + "cost_usd": null + }, + "supersedes": [] + } + ] + }, + "context": { + "schema_version": 1, + "cases": [ + { + "id": "VC-01", + "state": "synthetic draft", + "ref": "research/walkthroughs/VC01-TransactionalAdministration.md" + }, + { + "id": "VC-02", + "state": "synthetic draft", + "ref": "research/walkthroughs/VC02-OfflineFieldNotes.md" + }, + { + "id": "VC-03", + "state": "provisional", + "ref": "research/walkthroughs/VC03-ContentPublication.md" + }, + { + "id": "VC-04", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + }, + { + "id": "VC-05", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + }, + { + "id": "VC-06", + "state": "provisional", + "ref": "research/walkthroughs/VC06-MicrofrontendEstate.md" + }, + { + "id": "VC-07", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + }, + { + "id": "VC-08", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + }, + { + "id": "VC-09", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + }, + { + "id": "VC-10", + "state": "planned", + "ref": "research/plan/ValidationCases.md" + } + ], + "usefulness": { + "named_score": 18, + "prose_score": 18, + "denominator": 24, + "independent_human": false, + "decision_time_minutes": null, + "ref": "research/evaluations/language-pilot-01/submitted-review-01/adjudication.md", + "limit": "One frozen development pilot with submitted model review; six matched briefs. Equal aggregate scores do not establish equivalence. Stable anchors are consumed development cases, not fresh held-out tasks.", + "initial_unsupported_claims_each": 2, + "adjudicated_unsupported_claim_count": null + }, + "open_work": [ + "workplans/FEP-WP-0009-m1-independent-validation.md", + "workplans/FEP-WP-0003-contrasting-schools.md", + "workplans/FEP-WP-0006-language-evolution.md", + "workplans/FEP-WP-0008-use-driven-improvement.md" + ] + } + } +} diff --git a/workplans/FEP-WP-0006-language-evolution.md b/workplans/FEP-WP-0006-language-evolution.md index fcd1a64..bfb8cf1 100644 --- a/workplans/FEP-WP-0006-language-evolution.md +++ b/workplans/FEP-WP-0006-language-evolution.md @@ -246,3 +246,10 @@ useful comparable evidence under its existing scope. No downstream research gate waived. T03 remains wait and the resumed workplan is blocked on that evidence; the paused navigation fixture stays paused. Existing work records retain the next useful research and returns review; no replacement backlog is created. + +Validation: 73 evolution/schema/bench/reference tests passed, synthetic bench plan +generated without provider execution, evolution/classification/reference checks and +local links/whitespace passed. [Review snapshot](../research/evolution/snapshots/review-2026-10-04-comparison-readiness.json) +pins the committed assessment at implementation revision `d8d3a22`; it is a +measurement-review boundary, not an additional empirical cycle. The original +baseline and all previous snapshots are unchanged.