Conversation
…BP-25 promotion candidate Amara's 4th ferry (PR #221 absorb) Determinize-stage item: document "live-state-before-policy" as an explicit rule. The decision-proxy-evidence schema (PR #222) already has the `live_state_checks:` field that enforces it per-record; this PR adds the explicit principle section + candidates the rule for BP-25 promotion. What landed: 1. docs/decision-proxy-evidence/README.md — new section "Live-state-before-policy" covering: - Why the rule exists (Amara's HB-004 commit-sample showing same-day propose-from-symptoms → policy-stance → empirical- correction) - How the schema enforces it (live_state_checks: required for settings-change and branch-shaping task classes; examples from DP-001 worked record) - Scope (settings / branch-shaping / authority claims / roadmap assumptions) - What's excluded (pure reads, mechanical fixes) - BP-NN promotion candidacy note 2. docs/BACKLOG.md — new P2 row candidating BP-25 promotion via ADR. Aarav's call per BP-NN-promotion-cadence FACTORY-HYGIENE row. Rule text candidate provided; owner mapped to Aarav + Kenji + Rune; effort S. Not a unilateral promotion — just the candidate row. Promotion requires Aarav ADR drafting. Amara's Determinize-stage progress: 1/5 (this PR). ✓ Live-state-before-policy schema-enforcement + BP candidate Remaining: - Memory reference-existence lint (S) - Memory duplicate-title lint enforcement (partial via #220/AceHack#12) - Generated CURRENT-*.md views (L) - Memory reconciliation algorithm (L) Per Aaron Otto-72: "don't wait on me approved, mark down your decisions". This PR acts under standing authority (Otto-67 full GitHub grant); BP-25 consideration is logged as BACKLOG candidate for Aarav's promotion call. Frontier UI (future, Otto-63) will be Aaron's batch-review surface. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9468e4bba0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| Kenji integrates; Rune readability. **Source of truth:** | ||
| `docs/aurora/2026-04-23-amara-memory-drift-alignment- | ||
| claude-to-memories-drift.md` (PR #221 absorb) + | ||
| `docs/decision-proxy-evidence/README.md` (PR #222 + this | ||
| PR's addendum). |
There was a problem hiding this comment.
Add required DP record for this backlog-shaping change
This new backlog entry changes planned intent, but the listed "Source of truth" does not include a docs/decision-proxy-evidence/DP-*.yaml record for this decision. docs/decision-proxy-evidence/README.md says backlog-shaping actions should be logged via an evidence record before durable action, so landing this row without that record breaks the audit trail the workflow depends on and makes authority/provenance harder to verify later.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
Documents the “live-state-before-policy” principle behind live_state_checks: in the decision-proxy evidence schema, and adds a BACKLOG item to consider promoting the rule into docs/AGENT-BEST-PRACTICES.md as BP-25.
Changes:
- Adds a new section to
docs/decision-proxy-evidence/README.mdexplaining scope/why/enforcement for live-state-before-policy. - Adds a P2 BACKLOG row proposing BP-25 promotion candidacy for the rule.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| docs/decision-proxy-evidence/README.md | Adds an explanatory section for the live-state-before-policy rule behind live_state_checks:. |
| docs/BACKLOG.md | Adds a P2 item to queue BP-25 promotion consideration and outlines next steps. |
| field in `docs/decision-proxy-evidence/` records (documented | ||
| in the `README.md` "Live-state-before-policy" section | ||
| after PR <this>). BP-NN promotion is Aarav's call per the |
| after PR <this>). BP-NN promotion is Aarav's call per the | ||
| BP-NN-promotion-cadence FACTORY-HYGIENE row; this row | ||
| queues the promotion consideration. Rule text candidate: |
| check change, merge policy change, or branch-rule change | ||
| unless the current live state has been queried in the same | ||
| work unit."* **Scope:** draft ADR under | ||
| `docs/DECISIONS/YYYY-MM-DD-bp-25-live-state-before-policy.md` |
| `docs/aurora/2026-04-23-amara-memory-drift-alignment- | ||
| claude-to-memories-drift.md` (PR #221 absorb) + |
…59 (Amara Determinize action) (#225) Amara's 4th ferry (PR #221 absorb) Determinize-stage item: prevent the retrieval-drift class where prose cites paths that don't resolve. Her commit samples show repeated cleanup passes for memory paths that didn't exist; this is the third leg of memory-index hygiene. Three-leg memory-index hygiene now complete: 1. row #58 (PR #220 merged) — every memory/*.md change updates MEMORY.md in same commit/PR 2. AceHack PR #12 (pending Aaron merge) — MEMORY.md has no duplicate link targets 3. row #59 (this PR) — every MEMORY.md link target resolves to an actual file under memory/ New artifacts: - tools/hygiene/audit-memory-references.sh Parses `](foo.md)` link targets, resolves each against base dir (default memory/), fails (exit 2 under --enforce) on any broken reference. Supports --file PATH + --base DIR for custom use. - .github/workflows/memory-reference-existence-lint.yml Safe-pattern compliant per FACTORY-HYGIENE row #43 (SHA-pinned checkout, minimum permissions, concurrency group, runs-on pinned, no user-authored context). Triggers on PRs/pushes touching memory/** or the audit tool / workflow itself. - FACTORY-HYGIENE row #59 documenting cadence / owner / scope / classification (prevention-bearing — blocks merge before broken refs land). First-run baseline captured in commit: - In-repo memory/MEMORY.md: 44 refs all resolve (clean) - Per-user MEMORY.md: 391 refs all resolve (clean) Both clean confirms that PR #220's memory-index-integrity CI has been keeping the substrate in good shape. This lint closes the third-leg gap before drift regresses. Amara Determinize-stage progress: 2/5 (with this PR). ✓ Live-state-before-policy (PR #224) ✓ Memory reference-existence lint (this PR) Remaining: - Memory duplicate-title lint (partial via AceHack PR #12) - Generated CURRENT-*.md views (L) - Memory reconciliation algorithm (L) Per Aaron Otto-72 standing directive: acting under Otto-67 full-GitHub authority, decisions logged in PR body + memory, Frontier UI is the future batch-review surface. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…rows (Amara Govern-stage 1/2) Amara's 4th ferry (PR #221 absorb) named populating docs/CONTRIBUTOR-CONFLICTS.md as the Govern-stage action: the schema has existed since PR #166 but the Resolved table was empty despite multiple session-observed contributor-level disagreements that closed with evidence. Backfills three genuine contributor-level conflicts observed this session (narrow scope — not maintainer-directives, which are out-of-scope per the schema's contributor-level disagreement definition): - CC-001: Copilot (PR reviewer) vs Aaron on no-name-attribution rule scope (history-file exemption). Resolved in Aaron's favor via Otto-52 clarification; policy BACKLOG row filed in PR #210. - CC-002: Amara (4th ferry) vs Otto (pre-Otto-67 pattern) on Stabilize-vs-keep-opening-new-frames. Resolved in Amara's favor; Otto pivoted at Otto-68 to execute her roadmap; 3/3 Stabilize + 3/5 Determinize landed via PRs #222/#223/#224/#225/#226. - CC-003: Codex (PR reviewer) vs Otto (initial framing) on citing-absent-artifacts. Resolved in Codex's favor via fix commits 29872af/1c7f97d on PRs #207/#208; pattern now discipline (distinguish merged-on-main from proposed-in-PR-open). All three rows follow the schema's 8-column layout and include the full Resolution-so-far / Scope / Source cells the schema requires. No retroactive Aaron→human-maintainer sweep of prior rows; schema's rule 1 (resolutions are additive) honored. This is 1/2 of Amara's Govern-stage work. 2/2 is the authority-envelope + escalation-path ADR (deferred, M-effort). Part of Amara's 4-stage remediation roadmap (Stabilize → Determinize → Govern → Assure). Otto-75 tick.
…rows (Amara Govern 1/2) (#227) * govern: CONTRIBUTOR-CONFLICTS backfill — 3 resolved session-observed rows (Amara Govern-stage 1/2) Amara's 4th ferry (PR #221 absorb) named populating docs/CONTRIBUTOR-CONFLICTS.md as the Govern-stage action: the schema has existed since PR #166 but the Resolved table was empty despite multiple session-observed contributor-level disagreements that closed with evidence. Backfills three genuine contributor-level conflicts observed this session (narrow scope — not maintainer-directives, which are out-of-scope per the schema's contributor-level disagreement definition): - CC-001: Copilot (PR reviewer) vs Aaron on no-name-attribution rule scope (history-file exemption). Resolved in Aaron's favor via Otto-52 clarification; policy BACKLOG row filed in PR #210. - CC-002: Amara (4th ferry) vs Otto (pre-Otto-67 pattern) on Stabilize-vs-keep-opening-new-frames. Resolved in Amara's favor; Otto pivoted at Otto-68 to execute her roadmap; 3/3 Stabilize + 3/5 Determinize landed via PRs #222/#223/#224/#225/#226. - CC-003: Codex (PR reviewer) vs Otto (initial framing) on citing-absent-artifacts. Resolved in Codex's favor via fix commits 29872af/1c7f97d on PRs #207/#208; pattern now discipline (distinguish merged-on-main from proposed-in-PR-open). All three rows follow the schema's 8-column layout and include the full Resolution-so-far / Scope / Source cells the schema requires. No retroactive Aaron→human-maintainer sweep of prior rows; schema's rule 1 (resolutions are additive) honored. This is 1/2 of Amara's Govern-stage work. 2/2 is the authority-envelope + escalation-path ADR (deferred, M-effort). Part of Amara's 4-stage remediation roadmap (Stabilize → Determinize → Govern → Assure). Otto-75 tick. * govern: annotate CC-002/CC-003 Source cells — PR #221/#219 open, not yet on main Applies CC-003's own discipline (cite-as-open-not-landed) to CC-002 and CC-003 themselves. Both rows cited `docs/aurora/2026-04-23-amara-memory-drift-*` and `docs/aurora/2026-04-23-amara-decision-proxy-*` without the "not yet on main" marker — the files are added by PRs #221 / #219 which are still open. Drain for PR #227 review threads PRRT_kwDOSF9kNM59RFIx and PRRT_kwDOSF9kNM59RFJE (dangling file refs at lines 132, 133). * fix: markdownlint auto-fixes on governance doc Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…ize L-effort item) Amara's 4th ferry (PR #221 absorb) centerpiece proposal: replace hand-maintained CURRENT-*.md distillations with generated views over typed memory facts. Her sketch was ~40 lines of Python; this is the design that downstream implementation follows. ~380 lines covering: - MemoryFact record schema (id / subject / predicate / object / source_kind / source_path / source_anchor / timestamp_utc / supersedes / priority / status / confidence / tags) - 6 schema invariants (at-most-one-active-per-canonical-key + monotone-timestamps-on-chain + retraction-leaves-trail + ...) - Canonical-key normalization rules (7 apply; 3 deliberately NOT applied to preserve distinctions) - Reconciliation pseudocode (group by canonical key, detect conflicts, follow supersession chains) - Conflict output format → CONTRIBUTOR-CONFLICTS.md rows - Rendering rules for CURRENT-<maintainer>.md + MEMORY.md - 5-phase incremental migration (schema adoption → generator prototype → mechanical backfill → cutover → LLM extraction) - CI integration hooks composing with rows #58, #59, #12 - Worked examples (MF-2026-04-23-001 "Aaron endorses deterministic reconciliation"; MF-2026-04-23-004 "Aaron grants full GitHub access") - 5 open questions for Phase 1 PR design decisions Composes with: - Otto-73 retractability-by-design foundation — MemoryFact status (active / superseded / retracted) is the retraction- native primitive at the memory substrate - PR #222 decision-proxy-evidence — consulted_memory_ids can now reference MemoryFact.id directly - PR #225 memory-reference-existence CI (row #59) — generated output preserves the invariant by construction - Zeta's ZSet algebra — MemoryFact records ARE Z-set entries at the memory layer; same primitive, different surface Addresses MEMORY.md cap-drift (Otto-70 snapshot-tool surfaced 58842 bytes vs. 24976-byte cap): a generated index can be bounded by construction (top-N most-recent, archive the rest). Not implementation. Research doc only. Downstream arc: schema adoption (S) → generator prototype off-CI (S-M) → mechanical backfill (M) → cutover with retractability (M) → LLM-assisted extraction (L research). Amara Determinize-stage: 3/5 (with this PR). ✓ Live-state-before-policy (PR #224) ✓ Memory reference-existence lint (PR #225) ✓ Memory reconciliation algorithm design (this PR) Remaining: - Generated CURRENT-*.md views (L; this doc's Phase 2) - Memory duplicate-title lint enforcement (partial via AceHack PR #12; graduates via batch-sync) Per Aaron Otto-73 retractability foundation: the design itself embodies the thesis — supersession + status + retraction make the memory layer's reconciliation deterministic, same primitive as Zeta's data layer. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ize L-effort item) Amara's 4th ferry (PR #221 absorb) centerpiece proposal: replace hand-maintained CURRENT-*.md distillations with generated views over typed memory facts. Her sketch was ~40 lines of Python; this is the design that downstream implementation follows. ~380 lines covering: - MemoryFact record schema (id / subject / predicate / object / source_kind / source_path / source_anchor / timestamp_utc / supersedes / priority / status / confidence / tags) - 6 schema invariants (at-most-one-active-per-canonical-key + monotone-timestamps-on-chain + retraction-leaves-trail + ...) - Canonical-key normalization rules (7 apply; 3 deliberately NOT applied to preserve distinctions) - Reconciliation pseudocode (group by canonical key, detect conflicts, follow supersession chains) - Conflict output format → CONTRIBUTOR-CONFLICTS.md rows - Rendering rules for CURRENT-<maintainer>.md + MEMORY.md - 5-phase incremental migration (schema adoption → generator prototype → mechanical backfill → cutover → LLM extraction) - CI integration hooks composing with rows #58, #59, #12 - Worked examples (MF-2026-04-23-001 "Aaron endorses deterministic reconciliation"; MF-2026-04-23-004 "Aaron grants full GitHub access") - 5 open questions for Phase 1 PR design decisions Composes with: - Otto-73 retractability-by-design foundation — MemoryFact status (active / superseded / retracted) is the retraction- native primitive at the memory substrate - PR #222 decision-proxy-evidence — consulted_memory_ids can now reference MemoryFact.id directly - PR #225 memory-reference-existence CI (row #59) — generated output preserves the invariant by construction - Zeta's ZSet algebra — MemoryFact records ARE Z-set entries at the memory layer; same primitive, different surface Addresses MEMORY.md cap-drift (Otto-70 snapshot-tool surfaced 58842 bytes vs. 24976-byte cap): a generated index can be bounded by construction (top-N most-recent, archive the rest). Not implementation. Research doc only. Downstream arc: schema adoption (S) → generator prototype off-CI (S-M) → mechanical backfill (M) → cutover with retractability (M) → LLM-assisted extraction (L research). Amara Determinize-stage: 3/5 (with this PR). ✓ Live-state-before-policy (PR #224) ✓ Memory reference-existence lint (PR #225) ✓ Memory reconciliation algorithm design (this PR) Remaining: - Generated CURRENT-*.md views (L; this doc's Phase 2) - Memory duplicate-title lint enforcement (partial via AceHack PR #12; graduates via batch-sync) Per Aaron Otto-73 retractability foundation: the design itself embodies the thesis — supersession + status + retraction make the memory layer's reconciliation deterministic, same primitive as Zeta's data layer. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…e 3/5, L-effort design) (#226) * research: memory reconciliation algorithm — v0 design (Amara Determinize L-effort item) Amara's 4th ferry (PR #221 absorb) centerpiece proposal: replace hand-maintained CURRENT-*.md distillations with generated views over typed memory facts. Her sketch was ~40 lines of Python; this is the design that downstream implementation follows. ~380 lines covering: - MemoryFact record schema (id / subject / predicate / object / source_kind / source_path / source_anchor / timestamp_utc / supersedes / priority / status / confidence / tags) - 6 schema invariants (at-most-one-active-per-canonical-key + monotone-timestamps-on-chain + retraction-leaves-trail + ...) - Canonical-key normalization rules (7 apply; 3 deliberately NOT applied to preserve distinctions) - Reconciliation pseudocode (group by canonical key, detect conflicts, follow supersession chains) - Conflict output format → CONTRIBUTOR-CONFLICTS.md rows - Rendering rules for CURRENT-<maintainer>.md + MEMORY.md - 5-phase incremental migration (schema adoption → generator prototype → mechanical backfill → cutover → LLM extraction) - CI integration hooks composing with rows #58, #59, #12 - Worked examples (MF-2026-04-23-001 "Aaron endorses deterministic reconciliation"; MF-2026-04-23-004 "Aaron grants full GitHub access") - 5 open questions for Phase 1 PR design decisions Composes with: - Otto-73 retractability-by-design foundation — MemoryFact status (active / superseded / retracted) is the retraction- native primitive at the memory substrate - PR #222 decision-proxy-evidence — consulted_memory_ids can now reference MemoryFact.id directly - PR #225 memory-reference-existence CI (row #59) — generated output preserves the invariant by construction - Zeta's ZSet algebra — MemoryFact records ARE Z-set entries at the memory layer; same primitive, different surface Addresses MEMORY.md cap-drift (Otto-70 snapshot-tool surfaced 58842 bytes vs. 24976-byte cap): a generated index can be bounded by construction (top-N most-recent, archive the rest). Not implementation. Research doc only. Downstream arc: schema adoption (S) → generator prototype off-CI (S-M) → mechanical backfill (M) → cutover with retractability (M) → LLM-assisted extraction (L research). Amara Determinize-stage: 3/5 (with this PR). ✓ Live-state-before-policy (PR #224) ✓ Memory reference-existence lint (PR #225) ✓ Memory reconciliation algorithm design (this PR) Remaining: - Generated CURRENT-*.md views (L; this doc's Phase 2) - Memory duplicate-title lint enforcement (partial via AceHack PR #12; graduates via batch-sync) Per Aaron Otto-73 retractability foundation: the design itself embodies the thesis — supersession + status + retraction make the memory layer's reconciliation deterministic, same primitive as Zeta's data layer. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * drain(#226 P0+P1×2+P2×3 Codex): retraction semantics + cap consistency + smart-quote + pseudocode init + present-with-schema Six substantive Codex findings on memory-reconciliation algorithm doc: P0 (line 202) — retraction semantics inconsistency: reconcile() filtered by status == 'active' which masked the intent. Added explicit retraction-semantics docstring: - Facts transition via explicit FactRetracted / FactSuperseded events; never deleted, only marked. - reconcile() ignores retracted/superseded for liveness but STILL considers them when checking version-chain integrity. - Updated chain check to operate over ALL facts in the group (including retracted/superseded), not just active ones — chain integrity needs the full history. P1 (line 187) — stable fact identity vs grouping key: Distinguished fact ID (stable identity, unique) from (subject, predicate, canonical_key) grouping tuple (which multiple facts can share under invariant-2's collision case). Comment makes the distinction explicit. P1 (line 270) — MEMORY.md cap inconsistency: Default 30KB exceeded FACTORY-HYGIENE row #11 cap (24,976 bytes). Updated to 24,000 bytes — strictly under the hard cap with ~1KB headroom for header/annotation overhead. P2 (line 130) — smart-quote example ambiguous: Both sides showed plain ASCII ('"' / "'"). Replaced with explicit Unicode codepoint references (U+201C/D for double, U+2018/9 for single) so the rule is unambiguous in plain-ASCII source. P2 (line 186) — pseudocode by_key[k] used before init: Switched to defaultdict(list); added a comment noting the equivalence to 'if k not in by_key: by_key[k] = []' for non-Python implementers. P2 (line 216) — CONTRIBUTOR-CONFLICTS.md 'empty' wording: File is present and contains a schema; just unpopulated. Updated text to 'present-with-schema-but-unpopulated; this design starts populating it via the generator'. * drain(#226 P1+P2 Codex): chain-head liveness + chain-integrity for retired groups P1 (line 210) — chain-HEAD liveness, not 'any active in group': The reconcile filter marked a key live whenever any record in the group had status==active. That's wrong — a key with active(t=1) → retracted(t=2) has an earlier active record but the HEAD of the supersession chain is retracted, so the key is not live. Fix: `follow_supersession_to_head(group)` walks supersedes-pointers to find the most-recent record; liveness keyed on its status == active. P2 (line 224) — chain integrity for fully retired groups: The chain-integrity check looped over `accepted.items()`, which only included keys with at least one active record. Retired groups (all members retracted/superseded) could have broken chains and we'd silently miss them. Fix: loop over `by_key.items()` (all groups, including fully retired ones). Chain integrity is independent of liveness. --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Amara's 4th ferry (PR #221) Determinize-stage item landed: documents the "live-state-before-policy" rule explicitly in
docs/decision-proxy-evidence/README.md+ files BP-25 promotion candidacy as BACKLOG row for Aarav.What landed
docs/decision-proxy-evidence/README.md— new section between "Review block" and "Relationship to the hard rule", covering why / how / scope / exclusions / BP candidacydocs/BACKLOG.md— new P2 row "BP-25 promotion candidate — live-state-before-policy" for Aarav's considerationWhy
Per Amara:
The schema's
live_state_checks:field (PR #222) already enforces it per-record; this PR surfaces the principle explicitly so future authors see the rule, not just the field.Amara Determinize-stage progress
Acting under Otto-72 directive
Per Aaron Otto-72 ("don't wait on me approved, mark down your decisions"), this PR lands under the Otto-67 standing full-GitHub authority. BP-25 promotion decision is not made unilaterally — it's queued as BACKLOG for Aarav's ADR-driven promotion call.
Test plan
🤖 Generated with Claude Code