From 9fea49a972f0da0b88605a2ec7ade619cbe15b42 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Sat, 25 Apr 2026 01:27:42 -0400 Subject: [PATCH 1/2] drain(#226 follow-up 2: CC log schema + populated state) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codex post-merge findings on PR #226 (after the first follow-up #433 merged): P1 (line 244) — CONTRIBUTOR-CONFLICTS.md is already populated: The doc said the file is 'present-with-schema-but- unpopulated'. Wrong: CC-001..CC-003 are filled in (no-name-attribution-rule scope, Stabilize-vs-keep-opening frames, absent-artifact-citation discipline). Updated text to reflect the populated state. P1 (line 270) — Conflict-row format mismatch: Proposed format used '### CONF--' + bullet fields. Actual file uses CC-### IDs in a markdown table with columns (Conflict ID | Date | Question | Parties | Positions | Resolution | Scope | Source). Replaced the proposed format with a template that matches the existing table schema. CC-### counter continues from the highest existing ID (next auto-detected = CC-004). Generator preserves manually-curated rows and only appends auto- detected ones. --- ...onciliation-algorithm-design-2026-04-24.md | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md b/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md index 1c16ced4..40af941d 100644 --- a/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md +++ b/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md @@ -260,22 +260,34 @@ function reconcile(facts): ### Conflict outputs -Each conflict becomes a row in `docs/CONTRIBUTOR-CONFLICTS.md` -(the file Amara's 4th ferry noted is present-with-schema-but- -unpopulated; this design starts populating it via the -generator). -Row format: +Each conflict becomes a row in `docs/CONTRIBUTOR-CONFLICTS.md`, +which already has a populated schema (CC-001..CC-003 as of +2026-04-23 cover the no-name-attribution-rule scope, the +Stabilize-vs-keep-opening-frames disagreement, and the +absent-artifact-citation discipline). This design extends +the same table by appending machine-generated rows from +the reconciliation pass — one CC-### row per detected +conflict, using the existing column schema: ```markdown -### CONF--: / -- **Canonical key:** `::::` -- **Conflicting facts:** [MF-..., MF-...] -- **Winner (priority tiebreak):** MF-... -- **Reason:** invariant-2 violation | broken chain | explicit disagreement -- **Resolution:** pending | explicit-preference-recorded | escalated -- **Resolution evidence:** +| CC- | | ::::` +between facts MF-..., MF-...> | | + | + | | | ``` +The CC-### counter continues from the highest existing ID +(e.g., next machine-generated conflict starts at CC-004). +Generator MUST preserve all existing manually-curated rows; +auto-detected rows are appended only. + Conflicts block the `CURRENT-*.md` generation if unresolved — this is the "explicit-not-silent" discipline Amara emphasized. A CI run that discovers unresolved conflicts From acac9d4d2e14b205f68b3f5570ce901881229a48 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Sat, 25 Apr 2026 02:04:41 -0400 Subject: [PATCH 2/2] =?UTF-8?q?drain(#226=20follow-up=202):=20fix=20Copilo?= =?UTF-8?q?t=20P1/P2=20=E2=80=94=20schema=20+=20idempotency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P1 (L269) — clarify Open-table targeting: Replaced "appending machine-generated rows" (ambiguous given the file has separate Open / Resolved / Stale tables) with "inserting machine-generated rows into the Open table (or a delimited autogenerated subsection)". Without this, a literal append-to-EOF implementation wouldn't land in Open. P1 (L290) — specify idempotent generator strategy: Added explicit canonical-key → CC-NNN mapping. Generator updates in-place when key already matches; allocates new CC-NNN only when unmapped. Avoids unbounded growth / duplicate entries on repeated CI runs. Documents both strategies (in-place update + delimited autogenerated subsection). P2 (L275) — placeholder labels match column headers: Renamed schema placeholders from "Parties:" / "Resolution:" to "Between:" / "Resolution-so-far:" matching the actual headers in docs/CONTRIBUTOR-CONFLICTS.md (verified via grep). Reduces drift between the design doc and the live schema. --- ...onciliation-algorithm-design-2026-04-24.md | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md b/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md index 40af941d..6626d38f 100644 --- a/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md +++ b/docs/research/memory-reconciliation-algorithm-design-2026-04-24.md @@ -265,28 +265,55 @@ which already has a populated schema (CC-001..CC-003 as of 2026-04-23 cover the no-name-attribution-rule scope, the Stabilize-vs-keep-opening-frames disagreement, and the absent-artifact-citation discipline). This design extends -the same table by appending machine-generated rows from -the reconciliation pass — one CC-### row per detected +that schema by inserting machine-generated rows from the +reconciliation pass into the **Open** table (or into a +dedicated autogenerated subsection within **Open** if that +convention is later adopted) — one CC-### row per detected conflict, using the existing column schema: ```markdown | CC- | | ::::` -between facts MF-..., MF-...> | | | | - | | | + | | | ``` The CC-### counter continues from the highest existing ID (e.g., next machine-generated conflict starts at CC-004). -Generator MUST preserve all existing manually-curated rows; -auto-detected rows are appended only. + +**Idempotent generator strategy.** Repeated CI runs MUST +NOT re-append the same conflict, otherwise the **Open** +table grows unboundedly. The generator maintains an +explicit mapping from canonical key +(`::::` plus the +sorted set of contributing MF-IDs) → CC-NNN. On each run: + +- If the canonical key already maps to an existing CC-NNN + row in the **Open** table, update that row in-place + (refresh "Between"/"Positions" if source paths shifted; + preserve any human-edited "Resolution-so-far"). +- If the conflict has been moved to **Resolved** or + **Stale**, leave it alone — those tables are out of the + generator's write scope. +- If no existing row maps, allocate the next CC-NNN and + insert a new row. + +Generator MUST preserve all existing manually-curated rows +verbatim — both in **Open** (treat human-edited rows as +read-only) and in **Resolved** / **Stale**. Auto-detected +rows update in-place when matched; new rows are inserted +at the bottom of **Open**. As an alternative convention, +implementers MAY reserve a clearly delimited +"" subsection within **Open** that +is fully rewritten on each run, leaving manually curated +rows untouched outside the delimited block. Conflicts block the `CURRENT-*.md` generation if unresolved — this is the "explicit-not-silent" discipline Amara