Skip to content

determinize: live-state-before-policy rule + BP-25 candidate (Amara Determinize-stage)#224

Merged
AceHack merged 1 commit intomainfrom
determinize/live-state-before-policy-rule-amara-determinize
Apr 24, 2026
Merged

determinize: live-state-before-policy rule + BP-25 candidate (Amara Determinize-stage)#224
AceHack merged 1 commit intomainfrom
determinize/live-state-before-policy-rule-amara-determinize

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 24, 2026

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 candidacy
  • docs/BACKLOG.md — new P2 row "BP-25 promotion candidate — live-state-before-policy" for Aarav's consideration

Why

Per Amara:

Never recommend a repository settings change, required-check change, merge policy change, or branch-rule change unless the current live state has been queried in the same work unit.

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

  • ✓ Live-state-before-policy (this PR)
  • Remaining S-effort: memory reference-existence lint
  • Remaining L-effort: generated CURRENT views + memory reconciliation algorithm + extensions to duplicate-title lint

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

  • README section reads cleanly in existing structure
  • BACKLOG row renders + cites sources
  • No markdownlint regression

🤖 Generated with Claude Code

…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>
Copilot AI review requested due to automatic review settings April 24, 2026 00:37
@AceHack AceHack enabled auto-merge (squash) April 24, 2026 00:37
@AceHack AceHack merged commit bfc69b9 into main Apr 24, 2026
12 checks passed
@AceHack AceHack deleted the determinize/live-state-before-policy-rule-amara-determinize branch April 24, 2026 00:39
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread docs/BACKLOG.md
Comment on lines +6907 to +6911
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).
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.md explaining 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.

Comment thread docs/BACKLOG.md
Comment on lines +6891 to +6893
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
Comment thread docs/BACKLOG.md
Comment on lines +6893 to +6895
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:
Comment thread docs/BACKLOG.md
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`
Comment thread docs/BACKLOG.md
Comment on lines +6908 to +6909
`docs/aurora/2026-04-23-amara-memory-drift-alignment-
claude-to-memories-drift.md` (PR #221 absorb) +
AceHack added a commit that referenced this pull request Apr 24, 2026
…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>
AceHack added a commit that referenced this pull request Apr 24, 2026
…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.
AceHack added a commit that referenced this pull request Apr 24, 2026
…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>
AceHack added a commit that referenced this pull request Apr 25, 2026
…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>
AceHack added a commit that referenced this pull request Apr 25, 2026
…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>
AceHack added a commit that referenced this pull request Apr 25, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants