Skip to content

refactor: retire complete.md ledger for dated complete/ records #81

Description

@Jammy2211

Overview

complete.md has grown to 590 entries / 6,274 lines and is read by the memory faculty, intake reconcile, and any agent checking past work — a growing token burn on every lookup. The dated complete/<YYYY>/<MM>/ archive (585 records + generated token-light index.md) was built by lifecycle.py split-complete precisely so the ledger could be retired; lifecycle.py check's pairing invariant is annotated "(pre-retirement)". This task executes the retirement: dated records become the sole completion ledger.

The pairing has already drifted both ways (8 ledger entries with no record; 3 records with no ledger entry) — the unguarded direction drifts within days, which is the strongest argument for a single source of truth.

Plan

  • Backfill the 8 missing dated records from their complete.md entries (one-off extraction; do not rerun split-complete wholesale — it would clobber folded ## Original prompt sections in existing records).
  • Rework lifecycle.py: record --from-file (ship skills supply the rich entry directly), move takes --date/derives from the record, check gets post-retirement invariants, delete spent one-time subcommands (split-complete, migrate).
  • git rm complete.md; regenerate complete/index.md.
  • Repoint PyAutoBrain: ship skills write the dated record directly (no ledger append); memory faculty digests complete/** records; intake reconcile cross-refs complete/; docs/WORKFLOW.md wording.
  • Repoint PyAutoHeart pyauto-status ("last 5 completed" → top of complete/index.md).
  • Update Mind docs, status.sh (count records from complete/), spawn.py (drop complete.md from template stamp).
Detailed implementation plan

Affected Repositories

  • PyAutoMind (primary)
  • PyAutoBrain
  • PyAutoHeart

Branch Survey (2026-07-16)

Repository Current Branch Dirty? Claimed by
./PyAutoMind main other-session prompt memory-structure-cleanup
./PyAutoBrain main clean community-voice-agent, ic50-assistant-seed (+PR#118 awaiting merge)
./PyAutoHeart main clean heart-state-clobber

All three repos claimed → task parked in planned.md until claims clear.

Suggested branch: feature/retire-complete-ledger
Worktree root: ~/Code/PyAutoLabs-wt/retire-complete-ledger/

Implementation Steps

  1. Parity backfill (PyAutoMind). Verify with a scratch script that every complete.md slug has a complete/ record. Backfill the 8 missing (eceb-editorial-revision, ep-analytic-updates-scope, ep-deterministic-reconcile, ep-priors-fable-reassess, keck-ao-acceptance-checks, morning-status-release-rehearsal, release-profile-jax-default, slacs1430-acs-parity) by extracting only those ## <slug> sections via parse_complete_md()complete_bucket(date)/safe_name(slug).md. Reconcile the 3 unpaired records (slug-normalization variants; verify no true orphans).
  2. scripts/lifecycle.py rework.
    • record: add --from-file <path> (rich entry body supplied by the ship skill); keep --date, --prompt folding, git add. Drop the parse_complete_md() dependency.
    • move: derive date from --date or the existing dated record; drop complete.md lookup.
    • check: drop "record ↔ ledger pairing" + "slug in both ledgers"; add: no active.md slug has a complete/ record; no file in both active/ and complete/; keep archive/ skips.
    • Delete split-complete and migrate subcommands (one-time, spent). Update the module docstring lifecycle diagram.
  3. Retire the file (PyAutoMind). git rm complete.md; lifecycle.py index --apply; lifecycle.py check green.
  4. Mind surface updates. scripts/status.sh (count + recent from complete/ records, drop lines 75–115 ledger parsing); scripts/spawn.py:50 (drop ("complete.md", "EMPTY")); README.md ledger table + schema pointers; AGENTS.md registry section; REFERENCE.md; skills/OWNERSHIP.md:80; complete/AGENTS.md provenance ("complete.md retired , history in git").
  5. PyAutoBrain repointing.
    • skills/ship_library/ship_library.md:99 + reference.md:130-150: completion = write rich record via lifecycle.py record <slug> --date <d> --from-file <tmp> --prompt <name> --apply + lifecycle.py index --apply; drop the complete.md append. Same for skills/ship_workspace/ship_workspace.md:95 + reference.md:103-114.
    • agents/faculties/memory/_memory.py:44-45 + memory.sh:6: digest PyAutoMind/complete/**/*.md (excluding archive/, index.md, AGENTS.md) instead of complete.md. NOTE: coordinate with memory-structure-cleanup's parallel memory-faculty glob PR (same file).
    • agents/conductors/intake/_intake.py:595-710 (reconcile): cross-ref complete/ record slugs + content instead of complete.md; update intake.sh:28, intake/AGENTS.md:88,104, INTAKE_TAXONOMY.md:128, skills/intake/intake.md:43 ("until retired" → retired).
    • skills/WORKFLOW.md:14,100,205,211; skills/register_and_iterate/register_and_iterate.md:62; skills/health/health.md:14; docs/example.md:41, docs/organs/memory.md:16, docs/organs/mind.md, docs/concepts/workflow.md, AGENTS.md:185, ORGANISM.md.
  6. PyAutoHeart. skills/pyauto-status/reference.md:14,26: read recent completions from the top reverse-chronological bucket of complete/index.md.
  7. Verify. lifecycle.py check + index --check green; parity script shows 0 ledger-only entries before deletion; dry-run the new record --from-file path end-to-end on a scratch slug; grep the workspace for surviving complete.md references (expect only historical mentions in complete/ records themselves).

Key Files

  • PyAutoMind/scripts/lifecycle.py — lifecycle engine; record/move/check rework, delete spent subcommands
  • PyAutoMind/complete.md — the file being retired (git rm; history preserved)
  • PyAutoMind/scripts/status.sh, PyAutoMind/scripts/spawn.py — Mind status + template stamp
  • PyAutoBrain/skills/ship_library/reference.md, PyAutoBrain/skills/ship_workspace/reference.md — the completion-write contract (producers)
  • PyAutoBrain/agents/faculties/memory/_memory.py, PyAutoBrain/agents/conductors/intake/_intake.py — the two programmatic readers
  • PyAutoHeart/skills/pyauto-status/reference.md — Heart's read of recent completions

Original Prompt

Click to expand starting prompt

Retire the legacy PyAutoMind complete.md ledger in favour of the dated complete/ archive. User report (verbatim): 'The design of this seems to work very well, including the balance of tracking open issues, completed, etc. The only thing I am wary of when I look through it is that complete.md is getting huge, currently 4000 lines and counting. Is this something that will token burn or hurt context of an AI going forward? Should it link more concisely to the complete folder which now has date tracking?' Verified: complete.md is now 6,274 lines; the complete/ archive already exists (579 records, dated buckets, generated token-light index.md via lifecycle.py) and intake.md already calls complete.md 'legacy ... until retired'. Remaining work: repoint ship_library and ship_workspace in PyAutoBrain to write dated records into complete/ instead of appending to complete.md, repoint the memory faculty and intake reconcile to the archive, then migrate or freeze the legacy file so nothing grows it further.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions