# Conductor Chronology Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Create `conductor/chronology.md` as the canonical manually-maintained index of all tracks (active + shipped + superseded + abandoned) plus notable non-track commits, prune the duplicated `[x]` entries from `conductor/tracks.md`, document the new 3-step archiving convention in `conductor/workflow.md`, and write a migration report. Every row is cross-checked per the user directive (2026-06-19): "EVERY SINGLE ENTRY MUST BE CROSS CHECKED TO MAKE SURE IT'S STILL CORRECT, AND NOTHING WAS MISSED."

**Architecture:** One-shot helper script (`scripts/audit/generate_chronology.py`, FR5) extracts per-track data from `conductor/tracks/` and `conductor/archive/` and produces a draft `chronology.md.draft`. Tier 1 (or the user) then cross-checks every row in the draft per FR6 (5 fields: date, ID, status, summary, range), and verifies completeness (every folder has a row). The user is the final quality gate (VC12). No CI integration; the file is hand-maintained like `tracks.md`.

**Tech Stack:** Python 3.11+ (helper script), `tomllib`, `git log` (for commit SHAs), `pathlib`. No new production code in `src/`. No new dependencies.

**Spec reference:** `conductor/tracks/chronology_20260619/spec.md` (250 lines; 6 FRs, 5 NFRs, 12 VCs, 9 Risks, 10 Phases).

---

## Phase 1: Data extraction audit + draft helper script (FR5)

Focus: Build the extraction tool. The tool emits a DRAFT (per FR5); the cross-check (FR6, Phase 8) is the authority.

- [ ] **Task 1.1: Audit the source folders** (estimate: 5 min)
  - WHERE: `conductor/tracks/`, `conductor/archive/`
  - WHAT: Enumerate every subfolder. For each, capture: folder name, presence of `spec.md` / `plan.md` / `metadata.json`, and the date string in the slug (if any).
  - HOW: `Get-ChildItem -Directory conductor/tracks`, `Get-ChildItem -Directory conductor/archive` (PowerShell). Save counts to `tests/artifacts/chronology_audit_step1.json`: `{"tracks_count": N, "archive_count": M, "with_slug": X, "without_slug": Y}`.
  - SAFETY: Read-only. Don't modify any folder.
  - NO COMMIT (investigation only).

- [ ] **Task 1.2: Write failing tests for the helper script** (estimate: 5 min)
  - WHERE: New file `tests/test_generate_chronology.py`
  - WHAT: 5 unit tests covering the script's per-folder extraction logic:
    1. `test_slug_date_extraction` — given folder name `gencpp_python_bindings_20260308`, returns `2026-03-08`
    2. `test_slug_date_extraction_handles_missing_date` — given `my_folder` (no date), returns `None`
    3. `test_summary_extraction_from_spec_md` — given a `spec.md` with "## Overview\n\nFirst sentence here. Second sentence.", returns `"First sentence here."`
    4. `test_summary_extraction_falls_back_to_metadata` — given a folder with `metadata.json.description` and no `spec.md`, returns the description
    5. `test_summary_extraction_truncates_to_25_words` — given a 50-word sentence, returns first 25 words + "…"
  - HOW: Use `pytest.tmp_path` to create fixture folders with synthetic `spec.md` / `metadata.json`. Pure unit tests; no `live_gui`, no `tmp_path_factory.mktemp` outside `./tests/`.
  - SAFETY: Tests must FAIL initially (the script doesn't exist yet). Use `pytest.raises` for the failure case.
  - VERIFY: `uv run pytest tests/test_generate_chronology.py -v` should FAIL on each test with `ModuleNotFoundError` or `NameError`.
  - COMMIT: `test(chronology): failing tests for generate_chronology.py extraction logic`
  - GIT NOTE: "Phase 1.2. TDD red. 5 tests cover slug date parsing, summary extraction, fallback chain, word truncation. Tests must fail before Task 1.3 writes the script."

- [ ] **Task 1.3: Write the helper script (TDD green)** (estimate: 10 min)
  - WHERE: New file `scripts/audit/generate_chronology.py`
  - WHAT: A Python 3.11+ script that:
    - Accepts `--draft` flag (output to stdout) and `--root PATH` (default: `conductor/`)
    - Walks `<root>/tracks/` and `<root>/archive/`
    - For each folder:
      - Extracts date from slug (regex `\d{8}$`); falls back to first-commit date if slug has no date
      - Extracts init SHA via `git log --reverse --format='%h' -- <folder>` (first commit)
      - Extracts end SHA via `git log -1 --format='%h' -- <folder>` (last commit)
      - Computes commit count via `git log --oneline <init>..<end> -- <folder> | wc -l` (approximate; actual count is the `git log <init>..<end>` line count)
      - Extracts status from folder location: `tracks/` = `Active`; `archive/` = `Shipped`. Override via `<folder>/metadata.json.status` if present.
      - Extracts summary: prefer `metadata.json.description` (modern tracks); else first non-empty line of `spec.md` (trimmed to 25 words, "…" if truncated); else first non-empty line of `plan.md`; else `"Imported from archive (no spec)"`.
    - Emits markdown to stdout: one row per folder, sorted by date descending. Format per FR1.
  - HOW: Use `subprocess.run(["git", "log", ...], capture_output=True, text=True)` for git queries. Use `pathlib`. Match the 1-space indentation convention.
  - SAFETY: The script is READ-ONLY on the source folders. It writes to stdout only.
  - VERIFY: `uv run pytest tests/test_generate_chronology.py -v` should now PASS (all 5 tests green).
  - COMMIT: `feat(chronology): add draft-only helper script (FR5)`
  - GIT NOTE: "Phase 1.3. TDD green. generate_chronology.py extracts date/SHA/status/summary per track folder. Draft-only: emits to stdout; the cross-check (Phase 8) is the authority."

- [ ] **Task 1.4: Commit Phase 1** (estimate: 1 min)
  - WHERE: Working tree
  - WHAT: Confirm both files (`tests/test_generate_chronology.py` + `scripts/audit/generate_chronology.py`) are staged from Tasks 1.2 + 1.3. Verify `git status` is clean except for pre-existing modifications.
  - HOW: `git log -1 --stat` to confirm the Phase 1 commit is in place.
  - SAFETY: Don't commit unrelated working-tree changes.
  - NO COMMIT (Phase 1 already committed in Task 1.3).
  - CHECKPOINT: `conductor(checkpoint): Phase 1 complete — script + tests green`

---

## Phase 2: Generate `chronology.md.draft` (FR5 + pre-Phase 8 prep)

Focus: Run the script, produce the draft. Do NOT commit `chronology.md` yet — it's still a draft.

- [ ] **Task 2.1: Run the script, capture the draft** (estimate: 2 min)
  - WHERE: `scripts/audit/generate_chronology.py`
  - WHAT: `uv run python scripts/audit/generate_chronology.py --draft > conductor/chronology.md.draft`. This produces one row per track (165+ rows), sorted newest first.
  - HOW: Run the command. Verify the output file exists and has > 100 rows.
  - SAFETY: The draft file is git-ignored OR clearly marked as draft (e.g., filename `chronology.md.draft`).
  - VERIFY: `Get-Content conductor/chronology.md.draft | Measure-Object -Line`. Expect ≥ 200 lines (header + 165+ rows × ~4 lines each).
  - NO COMMIT (draft is not canonical yet).

- [ ] **Task 2.2: Sanity-check 5-10 random rows** (estimate: 5 min)
  - WHERE: `conductor/chronology.md.draft`
  - WHAT: Pick 5 random rows; for each, manually verify the 5 fields (date, ID, status, summary, range) against the source folder's `spec.md` and `git log <folder>`. If any field is wrong, the script has a bug — fix the script in a follow-up commit BEFORE Phase 3.
  - HOW: For each picked row, run:
    - `Get-Content "conductor/archive/<id>/spec.md" | Select-Object -First 1` (verify summary source)
    - `git log --oneline --reverse -- "conductor/archive/<id>/"` (verify init SHA)
    - `git log -1 --format='%h' -- "conductor/archive/<id>/"` (verify end SHA)
  - SAFETY: Don't proceed to Phase 3 if the script is buggy. Fix the script first.
  - NO COMMIT (sanity check, not implementation).

---

## Phase 3: Prune `conductor/tracks.md` (FR2)

Focus: Remove the 3 categories of `[x]`/`[shipped]` entries. Preserve in-flight and backlog entries.

- [ ] **Task 3.1: Prune "Phase 9: Chore Tracks" section** (estimate: 5 min)
  - WHERE: `conductor/tracks.md` (around the "Phase 9" heading, roughly lines 480-560 based on the file's current size)
  - WHAT: Either delete the entire "Phase 9: Chore Tracks" section OR replace it with a one-line stub:
    ```markdown
    ### Phase 9: Chore Tracks
    *Completed chore tracks are in [`chronology.md`](./chronology.md).*
    ```
  - HOW: Use the `manual-slop_edit_file` MCP tool with the exact anchor for the section header + the first child line. Verify with `git diff conductor/tracks.md`.
  - SAFETY: Don't touch the "Active Tracks" table at the top of the file, the "Backlog" section, the "Follow-up" section, or the "Notes" section.
  - VERIFY: `grep -n "^- \[x\]" conductor/tracks.md | wc -l` should be reduced (this counts the remaining `[x]` markers; non-zero is fine if "Active Research" still has them, but should be smaller than before).
  - COMMIT: `conductor(track): prune Phase 9 Chore Tracks section from tracks.md (FR2)`
  - GIT NOTE: "Phase 3.1. Phase 9 section either deleted or stubbed; canonical record now in chronology.md."

- [ ] **Task 3.2: Prune `[x]` entries from "Active Research Tracks"** (estimate: 5 min)
  - WHERE: `conductor/tracks.md` "Active Research Tracks" section
  - WHAT: Remove only the `[x]` entries (e.g., the Fable review row that shipped 2026-06-18). Keep the `[ ]` in-flight entries.
  - HOW: For each `[x]` line in the section, delete the entire bullet (including the linked line, if any). The section heading and the `[ ]` rows stay.
  - SAFETY: Don't remove the section heading. Don't remove the `[ ]` rows. Don't touch other sections.
  - VERIFY: `grep -n "Active Research Tracks" -A 20 conductor/tracks.md` shows no `[x]` rows in that section.
  - COMMIT: `conductor(track): prune [x] entries from Active Research Tracks (FR2)`
  - GIT NOTE: "Phase 3.2. [x] entries from Active Research Tracks moved to chronology.md. [ ] in-flight rows preserved."

- [ ] **Task 3.3: Prune `[shipped: ...]` entries from "Follow-up"** (estimate: 5 min)
  - WHERE: `conductor/tracks.md` "Follow-up (Planned, Not Yet Specced)" section
  - WHAT: Remove only the `[shipped: YYYY-MM-DD]` entries. Keep the "planned" and "not yet specced" entries.
  - HOW: For each `[shipped: ...]` bullet, delete the entire bullet. The section heading and the active followups stay.
  - SAFETY: Don't remove the section heading. Don't remove the "planned" entries. Don't touch other sections.
  - VERIFY: `grep -n "shipped:" conductor/tracks.md | wc -l` should be 0.
  - COMMIT: `conductor(track): prune [shipped] entries from Follow-up section (FR2)`
  - GIT NOTE: "Phase 3.3. [shipped] entries from Follow-up moved to chronology.md. 'planned' and 'not yet specced' rows preserved."

- [ ] **Task 3.4: Verify no `[x]` remains** (estimate: 2 min)
  - WHERE: `conductor/tracks.md`
  - WHAT: Final scan. Any `[x]` in the file should be in a "Status legend" or in-context comment, not a track entry.
  - HOW: `grep -n "^- \[x\]" conductor/tracks.md`. Expected: 0 matches.
  - SAFETY: If there are matches, identify which section and Task 3.1/3.2/3.3 missed them. Fix and re-commit.
  - NO COMMIT (verification only).
  - CHECKPOINT: `conductor(checkpoint): Phase 3 complete — tracks.md pruned`

---

## Phase 4: Update `conductor/workflow.md` (FR3)

Focus: Document the 3-step archiving convention.

- [ ] **Task 4.1: Append the 3-step convention** (estimate: 3 min)
  - WHERE: `conductor/workflow.md` "Notes > Editing this file" section (the last subsection of the "Notes" section near the end of the file)
  - WHAT: Append the following 3-step block:
    ```markdown

    **Archiving a track (3 steps):**
    1. Move the folder from `conductor/tracks/<id>/` to `conductor/archive/<id>/`.
    2. Remove the `[x]` entry from `conductor/tracks.md` (and update status badges on related entries).
    3. Add a row to `conductor/chronology.md` with the init SHA, the end SHA (the archive-move commit), and a one-sentence summary.
    ```
  - HOW: Find the "Editing this file" subheading; append after its last paragraph.
  - SAFETY: Don't change the existing convention text; just add the new block at the end.
  - VERIFY: `grep -n "Archiving a track" conductor/workflow.md` should match.
  - COMMIT: `conductor(track): document 3-step archiving convention in workflow.md (FR3)`
  - GIT NOTE: "Phase 4. Workflow.md gets the 3-step convention: move folder, remove from tracks.md, add to chronology.md."
  - CHECKPOINT: `conductor(checkpoint): Phase 4 complete — workflow.md updated`

---

## Phase 5: Write the migration report (FR4)

Focus: One-page report for the user to review. This is the user's first check-point to verify the migration is on track.

- [ ] **Task 5.1: Write the report** (estimate: 10 min)
  - WHERE: New file `docs/reports/CHRONOLOGY_MIGRATION_20260619.md`
  - WHAT: Markdown report with the following sections:
    1. **Summary** — total rows in `chronology.md` (active + shipped + superseded + abandoned); total rows removed from `tracks.md`; total notable non-track commits.
    2. **Counts by status** — table: status, count.
    3. **Counts by `tracks.md` section removed** — table: section, count.
    4. **Documented exceptions** — list of folders that have no row in `chronology.md` (per FR6 completeness check) with one-line reason each.
    5. **Notable non-track commits added** — list of SHAs + dates + one-line descriptions.
    6. **Diff preview (10-20 rows)** — first 10 + last 10 rows of `chronology.md` for the user to spot-check the format and content.
    7. **Per-row cross-check log** — table of (row index, track ID, date verified, ID verified, status verified, summary verified, range verified, fixes if any). For Phase 5 (pre-cross-check), this is empty; it gets filled in during Phase 8.
    8. **User sign-off** — final section with a checklist for the user to fill in during Phase 10.
  - HOW: Generate the counts by running the script with `--counts` flag (add this flag in a script update, or compute manually from `chronology.md.draft` for now). Manually write the diff preview by copy-pasting 10 rows from the draft.
  - SAFETY: The report is the user's window into the migration. Make the tables readable; don't dump raw data.
  - VERIFY: The file should be 100-200 lines, well-formatted markdown.
  - COMMIT: `docs(chronology): write CHRONOLOGY_MIGRATION_20260619.md (FR4)`
  - GIT NOTE: "Phase 5. Migration report written. Pre-cross-check; the per-row log is empty until Phase 8."
  - CHECKPOINT: `conductor(checkpoint): Phase 5 complete — migration report drafted`

---

## Phase 6: User review of the draft (gate)

Focus: The user reviews the draft + report. Approves, OR requests changes (loop back to Phase 2).

- [ ] **Task 6.1: User reviews `conductor/chronology.md.draft` + the migration report** (estimate: user-paced)
  - WHERE: `conductor/chronology.md.draft`, `docs/reports/CHRONOLOGY_MIGRATION_20260619.md`
  - WHAT: User opens both files and confirms:
    - (a) The format matches FR1.
    - (b) The diff preview in the report is accurate.
    - (c) The documented exceptions are acceptable.
    - (d) The overall structure is correct.
  - HOW: User posts "approve" or specific change requests.
  - OUTCOMES:
    - **Approve** → proceed to Phase 7.
    - **Request changes** → loop back to Phase 2 (re-run script with fixed parameters, regenerate draft, update report).
  - SAFETY: Don't proceed past Phase 6 without explicit user approval.
  - NO COMMIT (gate).

---

## Phase 7: Promote draft to canonical + commit (FR1, FR2, FR3, FR4 finalized)

Focus: Rename `chronology.md.draft` to `chronology.md`; this is the first time `chronology.md` is committed.

- [ ] **Task 7.1: Rename + commit** (estimate: 2 min)
  - WHERE: `conductor/chronology.md.draft` → `conductor/chronology.md`
  - WHAT: `git mv conductor/chronology.md.draft conductor/chronology.md`. Then `git commit` with the message below.
  - HOW: `git mv` preserves git history; the file appears as a rename in the diff. (If `chronology.md` already exists for some reason, the `git mv` will fail; in that case, delete the old file first, but this shouldn't happen since chronology.md didn't exist before.)
  - SAFETY: Verify the rename with `git status` before commit. Verify the file content is identical to the draft.
  - VERIFY: `git log -1 --stat` shows the rename.
  - COMMIT: `conductor(track): add conductor/chronology.md (FR1)`
  - GIT NOTE: "Phase 7. chronology.md promoted from draft to canonical. Pre-cross-check; rows are verified in Phase 8."
  - CHECKPOINT: `conductor(checkpoint): Phase 7 complete — chronology.md committed (pre-cross-check)`

---

## Phase 8: Per-row cross-check (FR6, HARD GATE)

Focus: **EVERY** row is opened and verified per FR6's 5 fields. The migration report's per-row log is filled in. **This is the hard gate per the user directive (2026-06-19). NO shortcut is acceptable.**

The 5 fields per row (per FR6):
1. **Date** — match the slug (`YYYYMMDD` → `YYYY-MM-DD`)? Fix any disagreement.
2. **Track ID** — backticked slug matches the folder name?
3. **Status** — `Active` / `In Progress` / `Shipped` / `Superseded` / `Abandoned`? Per FR1's status mapping.
4. **Summary** — accurate, ≤ 25 words, describes the most important fact? Trim or rewrite if needed.
5. **Range** — init SHA exists, end SHA exists, count is plausible? Run `git log --oneline <init>..<end> -- <folder>` to spot-check.

The cross-check is done in batches of ~20 rows for commit granularity. Each batch is one commit. Per the user directive: "EVERY SINGLE ENTRY MUST BE CROSS CHECKED TO MAKE SURE IT'S STILL CORRECT, AND NOTHING WAS MISSED." Every row, no samples.

- [ ] **Task 8.1: Batch 1 — newest 20 rows** (estimate: 30 min)
  - WHERE: First 20 rows of `conductor/chronology.md`
  - WHAT: For each row, verify the 5 fields. Fix any errors in `chronology.md`. Log the result in the migration report's per-row table.
  - HOW: For each row, run:
    - `Get-ChildItem -Directory conductor/tracks/<id>, conductor/archive/<id>` (verify folder exists; pick the right location based on status)
    - `Get-Content "conductor/<tracks|archive>/<id>/spec.md" | Select-Object -First 1` (verify summary source)
    - `git log --oneline --reverse -- "conductor/<tracks|archive>/<id>/"` (verify init SHA)
    - `git log -1 --format='%h' -- "conductor/<tracks|archive>/<id>/"` (verify end SHA)
    - `git log --oneline <init>..<end> -- "conductor/<tracks|archive>/<id>/" | Measure-Object -Line` (verify count)
  - SAFETY: Don't trust the script output. Verify each row independently. If a field is wrong, fix the row in `chronology.md` BEFORE moving to the next row.
  - VERIFY: After this batch, the first 20 rows are confirmed correct in the migration report.
  - COMMIT: `conductor(chronology): cross-check batch 1 — 20 newest rows verified (FR6)`
  - GIT NOTE: "Phase 8.1. Per-row cross-check batch 1. 20 rows verified; [N] fixes applied; per-row log updated in migration report."

- [ ] **Task 8.2: Batch 2 — rows 21-40** (estimate: 30 min)
  - WHERE: Rows 21-40 of `conductor/chronology.md`
  - WHAT: Same procedure as 8.1.
  - HOW: Same as 8.1.
  - SAFETY: Same as 8.1.
  - VERIFY: Rows 21-40 are correct.
  - COMMIT: `conductor(chronology): cross-check batch 2 — rows 21-40 verified (FR6)`
  - GIT NOTE: "Phase 8.2. Per-row cross-check batch 2."

- [ ] **Task 8.3: Batch 3 — rows 41-60** (estimate: 30 min)
  - WHERE / WHAT / HOW / SAFETY / VERIFY / COMMIT / GIT NOTE: Same pattern as 8.1.

- [ ] **Task 8.4: Batch 4 — rows 61-80** (estimate: 30 min)
  - Same pattern.

- [ ] **Task 8.5: Batch 5 — rows 81-100** (estimate: 30 min)
  - Same pattern.

- [ ] **Task 8.6: Batch 6 — rows 101-120** (estimate: 30 min)
  - Same pattern.

- [ ] **Task 8.7: Batch 7 — rows 121-140** (estimate: 30 min)
  - Same pattern.

- [ ] **Task 8.8: Batch 8 — rows 141-160** (estimate: 30 min)
  - Same pattern.

- [ ] **Task 8.9: Batch 9 — rows 161+ (final batch)** (estimate: 30 min)
  - WHERE: Remaining rows (whatever the count is after batch 8).
  - WHAT: Final batch. After this, every row in `chronology.md` has been verified.
  - SAFETY: If the count is > 160 + 20, split into another batch. Don't exceed 30 rows per batch for review ergonomics.
  - VERIFY: Every row in `chronology.md` is now in the per-row log as "verified".
  - COMMIT: `conductor(chronology): cross-check batch 9 (final) — all rows verified (FR6)`
  - GIT NOTE: "Phase 8.9. FINAL cross-check batch. All 165+ rows verified; FR6 per-row gate satisfied."
  - CHECKPOINT: `conductor(checkpoint): Phase 8 complete — all rows cross-checked`

---

## Phase 9: Completeness check (FR6, HARD GATE)

Focus: Every folder in `conductor/tracks/` and `conductor/archive/` has a row in `chronology.md`. No exceptions except documented ones.

- [ ] **Task 9.1: Enumerate folders, compare to rows** (estimate: 10 min)
  - WHERE: `conductor/tracks/`, `conductor/archive/`, `conductor/chronology.md`
  - WHAT: Get the list of folder names from both directories. Get the list of track IDs from `chronology.md`. Compute the set difference: folders without rows, rows without folders.
  - HOW:
    - Folders: `Get-ChildItem -Directory conductor/tracks | Select-Object -ExpandProperty Name` + `Get-ChildItem -Directory conductor/archive | Select-Object -ExpandProperty Name`
    - Rows: extract backticked track IDs from `chronology.md` via `Select-String -Pattern '`([a-z_0-9]+_\d{8})`' -AllMatches`
    - Diff: `Compare-Object -ReferenceObject $folders -DifferenceObject $rows`
  - SAFETY: An empty diff is the goal. If non-empty, every diff item needs disposition (added or exception).
  - VERIFY: `$diff` is empty OR only contains documented exceptions.
  - NO COMMIT (verification only).

- [ ] **Task 9.2: Resolve diff** (estimate: 10 min)
  - WHERE: `conductor/chronology.md` + `docs/reports/CHRONOLOGY_MIGRATION_20260619.md`
  - WHAT: For each item in the diff from 9.1:
    - If it's a folder without a row: add the row (using the same FR1 format; extract data per the script; verify per FR6's 5 fields).
    - If it's a row without a folder: investigate. Either the folder was renamed/removed (update the row's folder link) or the row is stale (remove it). Document the resolution in the migration report.
  - HOW: Add rows using the same procedure as Phase 8 (verify 5 fields, log in the per-row table). Update the migration report's "Documented exceptions" section if any folders are intentional non-tracks.
  - VERIFY: Re-run the diff from 9.1; the result is now empty (or only contains documented exceptions).
  - COMMIT: `conductor(chronology): completeness check passed — folder set matches row set (FR6)`
  - GIT NOTE: "Phase 9. FR6 completeness check. [N] missing rows added; [M] exceptions documented. Diff is now empty."
  - CHECKPOINT: `conductor(checkpoint): Phase 9 complete — completeness check passed`

---

## Phase 10: User sign-off (FR6, HARD GATE)

Focus: The user is the quality gate. The track is not "done" until the user signs off.

- [ ] **Task 10.1: User reviews final state** (estimate: user-paced)
  - WHERE: `conductor/chronology.md`, `conductor/tracks.md`, `conductor/workflow.md`, `docs/reports/CHRONOLOGY_MIGRATION_20260619.md`
  - WHAT: User confirms:
    - (a) The format is correct.
    - (b) The summaries are accurate.
    - (c) The commit ranges are right.
    - (d) Nothing was missed.
  - HOW: User fills in the "User sign-off" section in the migration report with a confirmation + date.
  - OUTCOMES:
    - **Sign-off** → track is complete. Proceed to end-of-track wrap-up.
    - **More changes** → loop back to the relevant phase (Phase 8 for per-row fixes, Phase 9 for completeness, etc.).
  - SAFETY: No commit after Phase 10 without user sign-off.
  - NO COMMIT (gate).

- [ ] **Task 10.2: End-of-track report** (estimate: 15 min)
  - WHERE: New file `docs/reports/TRACK_COMPLETION_chronology_20260619.md`
  - WHAT: Per Tier 2 conventions (precedent: `TRACK_COMPLETION_tier2_autonomous_sandbox_20260616.md`), write a one-page end-of-track report with:
    - Summary (1-2 sentences)
    - Final state (5 fields: chronology.md, tracks.md, workflow.md, migration report, end-of-track report)
    - Statistics (rows in chronology, batches in Phase 8, fixes applied, exceptions documented)
    - Cross-check summary (per VC10/11/12 confirmation)
    - User sign-off (reference to the migration report)
    - Lessons learned (optional; "what would I do differently next time")
  - HOW: Write the file. Commit.
  - SAFETY: No new content beyond the summary; link to existing files.
  - COMMIT: `docs(chronology): add end-of-track report`
  - GIT NOTE: "Phase 10.2. Track complete. User sign-off recorded. All VCs satisfied."

- [ ] **Task 10.3: Update `conductor/tracks.md`** (estimate: 2 min)
  - WHERE: `conductor/tracks.md` top-level entry for `chronology_20260619`
  - WHAT: Add a line at the top of the file (or in the active section) noting the new track's completion. Mark it `[x]` completed.
  - HOW: Edit the file; flip the status marker.
  - SAFETY: Don't touch other entries.
  - VERIFY: `grep -n "chronology_20260619" conductor/tracks.md` shows the entry with `[x]`.
  - COMMIT: `conductor(track): mark chronology_20260619 as complete in tracks.md`
  - GIT NOTE: "Phase 10.3. Track marked complete in tracks.md."

- [ ] **Task 10.4: Update `state.toml` to completed** (estimate: 1 min)
  - WHERE: `conductor/tracks/chronology_20260619/state.toml`
  - WHAT: Set `[meta].status = "completed"`, `[meta].current_phase = "complete"`, all phase statuses to `"completed"`, all task statuses to `"completed"`, all `[verification]` flags to `true`.
  - HOW: Edit the file.
  - SAFETY: Don't change the task descriptions; just flip the status fields.
  - VERIFY: `uv run python -c "import tomllib; tomllib.load(open('conductor/tracks/chronology_20260619/state.toml','rb'))"` parses cleanly.
  - COMMIT: `conductor(track): mark chronology_20260619 as completed`
  - GIT NOTE: "Phase 10.4. Track complete. All VCs satisfied; user sign-off recorded."

---

## Summary

| Phase | Scope | Time estimate | Gate? |
|---|---|---|---|
| 1 | Data extraction + script + tests | ~25 min | No |
| 2 | Generate draft | ~7 min | No |
| 3 | Prune tracks.md (3 sections) | ~17 min | No |
| 4 | Update workflow.md | ~3 min | No |
| 5 | Write migration report | ~10 min | No |
| 6 | User review of draft | user-paced | Yes |
| 7 | Promote draft to canonical | ~2 min | No |
| 8 | Per-row cross-check (165+ rows, 9 batches) | ~4.5 hours | Yes (HARD per user directive) |
| 9 | Completeness check | ~20 min | Yes (HARD) |
| 10 | User sign-off + end-of-track | ~20 min | Yes (HARD) |

**Total: ~5.5 hours of focused work** (estimated scope, not time-bound; per the no-day-estimates rule). The cross-check (Phase 8) is the dominant cost; the user's "EVERY SINGLE ENTRY" mandate makes this non-negotiable.

## Verification Criteria Recap

All 12 VCs from the spec must be satisfied for the track to be marked complete:
- VC1-VC5: File contents (FR1, FR2, FR3, FR4) — verified in Phases 3, 4, 5, 7.
- VC6: Sort order (FR1) — verified in Phase 7.
- VC7: Folder coverage (FR6 completeness) — verified in Phase 9.
- VC8: No `src/*.py` files created — verified by `git diff --stat` against the spec'd scope.
- VC9: End-of-track report — written in Phase 10.2.
- VC10: Per-row cross-check completed (FR6) — verified at end of Phase 8.
- VC11: Completeness check (FR6) — verified at end of Phase 9.
- VC12: User sign-off (FR6) — recorded in Phase 10.1.

## Cross-cutting safety

- **No day estimates in the report.** Per the project rule added 2026-06-16.
- **Per-task atomic commits.** Per `conductor/workflow.md` "Commit Guidelines" — one commit per task, no batching.
- **Git notes on every commit.** Per the project convention.
- **No `git restore` / `git checkout -- <file>` / `git reset`.** Per the HARD BAN in `AGENTS.md`.
- **No new `src/*.py` files.** Per `AGENTS.md` File Size and Naming Convention. The helper script lives in `scripts/audit/`; no `src/` changes.
- **No new `conductor/code_styleguides/*` files.** The 3-step convention is added to existing `workflow.md`, not a new styleguide.
