Skip to content

fix(followups): structural merge driver (#391) + untracked FU-id warning (#392) - #405

Merged
montfort merged 1 commit into
mainfrom
fix/lote3-followups-merge-driver-untracked-ids
Aug 5, 2026
Merged

fix(followups): structural merge driver (#391) + untracked FU-id warning (#392)#405
montfort merged 1 commit into
mainfrom
fix/lote3-followups-merge-driver-untracked-ids

Conversation

@montfort

@montfort montfort commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Third batch from the 2026-08-04 open-issue triage (one PR per batch, per agreement).

  • followups: the registry is a guaranteed conflict between parallel PRs, and the correct resolution silently reverts closures #391 — registry conflicts between parallel PRs. .straymark/follow-ups-backlog.md is a single CLI-owned file, so every concurrent PR touching follow-ups conflicts on it, and the textual resolution (take one side, re-run drift --apply) silently reverted the other side's closures — statuses live only in the file, and re-extraction renumbers ids, so even comparing ids cannot detect the loss. Fixed two ways:
    • New straymark followups merge-driver <base> <ours> <theirs>: a git merge driver that reconciles structurally. Entries match by title (ids are positional and do not survive regeneration); the higher-rank status wins (open < in-progress < suspected-closed < closed/superseded/promoted), so a closure made on either side survives; equal-rank disagreements keep ours and are reported on stderr. Theirs-only entries are appended (renumbered on id collision), deletions respected unless ours changed the entry's status, Notes unions append-only extensions, frontmatter recomputed. Exit code follows git's driver contract.
    • drift --apply skips candidates whose normalized title already exists in the registry, so a declaration that moved section (or a re-extraction after conflict resolution) cannot spawn a duplicate open entry shadowing the operator's status.
  • followups/validate: a follow-up declared outside ## Follow-ups is invisible to the extractor and nothing warns #392 — FU ids declared outside ## Follow-ups were invisible to the extractor with no warning. validate now emits a warn-only FOLLOWUP-UNTRACKED-ID when an AILOG body mentions a FU-NNN / FU-NNN-NNN id outside its own ## Follow-ups section and that id is not in the registry. Registered ids (cross-references) stay quiet; the check is skipped entirely when the project has no registry.
  • Docs: CLI-REFERENCE (en/es/zh-CN) + FOLLOW-UPS-BACKLOG-PATTERN.md (new "Parallel PRs — structural merge" subsection).
  • Folded in: /.qoder/ gitignore (local agent config, mirrors /.claude/).
  • Self-adoption: AILOG-2026-08-04-003 (validated, 0 errors) + repo registry seeded via drift --apply. Note: with a registry present, the new rule surfaces 5 pre-existing warn-only cross-references in historical AILOGs (Weft-registry ids) — advisory, as designed.

Test plan

  • cargo test --no-fail-fast in cli/: all suites green except the pre-existing audit_template_test::unified_template_has_seven_universal_sections failure (documented in AILOG-2026-08-04-001 R1)
  • New tests: merge driver preserves closures + unions entries (renumbering), respects deletions + surfaces equal-rank conflicts; title dedup prevents duplicate extraction; unregistered FU id warns exactly once; no-registry stays quiet
  • straymark validate on this repo: 0 errors

Closes #391
Closes #392

…racked FU-id validation warning (#392)

#391: the follow-ups registry is a single CLI-owned file, so every
parallel PR touching it conflicts, and resolving textually (take one
side, re-run drift --apply) silently reverted the other side's closures
— statuses live only in the file and re-extraction renumbers ids.

- New `straymark followups merge-driver <base> <ours> <theirs>`: git
  merge driver that reconciles structurally. Entries match by title
  (ids are positional); higher-rank status wins so closures made on
  either side survive; theirs-only entries appended (renumbered on
  collision); deletions respected unless ours changed the status;
  Notes unions append-only extensions; frontmatter recomputed.
- drift --apply skips candidates whose normalized title already exists
  in the registry, so a declaration that moved section cannot spawn a
  duplicate open entry shadowing the operator's status.

#392: validate now warns (FOLLOWUP-UNTRACKED-ID) when an AILOG body
mentions a FU-NNN / FU-NNN-NNN id outside its own ## Follow-ups section
— where the extractor cannot see it — and that id is not in the
registry. Registered ids (cross-references) stay quiet; the check is
warn-only and skipped when the project has no registry.

Docs: CLI-REFERENCE en/es/zh-CN + FOLLOW-UPS-BACKLOG-PATTERN.md.
Folded in: /.qoder/ gitignore (local agent config, mirrors /.claude/).
Self-adoption: AILOG-2026-08-04-003 + seeded follow-ups registry via
drift --apply.
@montfort
montfort merged commit 331b581 into main Aug 5, 2026
2 checks passed
montfort added a commit that referenced this pull request Aug 5, 2026
Releases the three adopter-triage batches (PRs #403, #404, #405):
nine issues remediated. Framework touched in all three (telemetry
schema + charter templates, .qoder/skills + manifest, backlog pattern
doc) → minor fw bump; CLI gains followups merge-driver (#391), the
FOLLOWUP-UNTRACKED-ID validate warning (#392) and Qoder skills (#399)
→ minor CLI bump (docs already cite cli-3.41.0 for these features).

Version tables updated in README + CLI-REFERENCE (en/es/zh-CN);
CHANGELOG entry summarizes all nine fixes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant