Sub-project 1 — Governance / Ecosystem Optimization

Context

Survipedia is preparing a content sprint covering all three domain categories (Crisis Survival, Smart Prepping, Off-Grid Living). Empirical state on 2026-05-06:

  • 305 content pages; tagged: survival 207 (68%), prepping 214 (70%), off-grid 154 (50%)
  • Canon coverage adequate+ : survival 12/12, prepping 12/12, off-grid 11/12 (1 stub: threats × off-grid)
  • Strong+ : survival 6/12, prepping 2/12 (laggard), off-grid 3/12
  • PROJECT-STATUS.md lines 162-163 falsely claim "Domain tag retrofit ✅ Complete — All 312 content pages carry correct domain tags." Page count is 305; off-grid tag distribution proves retrofit is not complete in the sense the doc implies. Six absolute count occurrences in that file are stale.
  • Track 1B in PROJECT-STATUS.md still frames "new off-grid pages" as active expansion — directly conflicts with the sprint freeze rule.
  • /run-loop line 57 has its own priority-order selection logic — agent-prompt edits alone don't change task ordering.

User wants to "hit the ground running" on the content sprint. Codex gpt-5.5 review (round 1, design framing) and round 2 (this spec) flagged that without a current operating brief, accurate status doc, machine-readable sprint mode, and aligned /run-loop logic, agents misroute work — the sprint stalls before it starts.

This sub-project makes /run-loop productive on day one of the sprint by introducing a sprint operating brief as a separate file (not bloating CLAUDE.md), a machine-readable sprint-mode header, an aligned /run-loop selection rule, and a cell-level CANON-PROMOTE task template that prevents word-count padding.

Goals

  1. Eliminate PROJECT-STATUS.md misrouting drift — false "complete" claim replaced; Track 1B reframed; all absolute counts updated.
  2. Add a machine-readable sprint-mode toggle that /run-loop and webmaster both honor.
  3. Give author agent a CANON-PROMOTE task template with cell-level evidence requirements that prevent degradation to word-count padding.
  4. Define TAG-AUDIT task format so sprint-mode precedence has reliable selectors.
  5. Update reflector + publisher for CANON_PROMOTED logging — author is not the final promotion authority.
  6. Re-derive operating contract after edits to confirm internal consistency.

Non-Goals (explicit)

  • Restructuring CLAUDE.md for size/duplication — Sub-project 2 handles general cleanup
  • Creating new commands or agents — existing 17 agents and 25 commands are unchanged
  • Touching append-only state files (LOG.md, JOURNAL.md, AUDIT_LOG.md) beyond append-only entries
  • Changing the canon definitions in CATEGORY-CANON.md
  • Generic word-count expansion as a goal (wrong task shape)

Design

Component 1 — SPRINT-2026-05.md (new file, root-level)

Codex round-2 feedback: adding 40 lines to CLAUDE.md duplicates the "Start every session by reading PROJECT-STATUS.md" contract and creates new debt. Move the sprint operating brief to its own file.

Create SPRINT-2026-05.md at repo root, ~50 lines. Contents:

  • Live counts (305 content pages; per-category tag counts; per-category canon coverage; per-category strong+ %)
  • Known contradictions and resolution status (PROJECT-STATUS staleness; off-grid tag gap)
  • Sprint priority order for next 2-3 weeks (TAG-AUDIT → CANON-PROMOTE → CANON stubs → freshness/SEO last)
  • Quickstart — 4-line set of commands to resume sprint work
  • Expiry: 2026-06-15. Post-expiry: contents convert to a JOURNAL.md entry; file deleted.
  • Auto-validation: lists three check commands so any agent can verify the brief is still current (scripts/category-coverage.py, page count grep, tag distribution awk).

CLAUDE.md gets a 3-line pointer only, inserted at the very top of the file under the existing "Start every session" line:

> **Active sprint** (2026-05-06 to 2026-06-15): Three-Category Sprint. Read `SPRINT-2026-05.md` first.
> Sprint freeze: no new content pages except canon stubs (`threats × off-grid`). See SPRINT-2026-05.md for selection ladder.

Same 3-line pointer added to top of PROJECT-STATUS.md.

Component 2 — BACKLOG.md Sprint-Mode Header (machine-readable)

Codex round-2 feedback: the original "selection precedence: A > B > C" syntax mixes colons as both labels and operators. Use machine-simple key:value lines.

Insert at the very top of BACKLOG.md:

<!-- SPRINT-MODE
     Name: three-category-2026-05
     Status: ACTIVE
     Started: 2026-05-06
     Expires: 2026-06-15
     Precedence: TAG-AUDIT,CANON-PROMOTE,CANON,OTHER
     Freeze: new-content-pages-except-canon-stubs
     Brief: SPRINT-2026-05.md
     Owner: webmaster
-->

Parser rules (documented in webmaster.md and run-loop.md): - Each line is <Key>: <Value>. Values are atomic (no nested punctuation). - Precedence is a comma-separated list of task-prefix tokens; left = highest priority. - Status: ACTIVE enables the override; any other value or block absence disables it.

Component 3 — PROJECT-STATUS.md Truth-Up (expanded scope)

Codex round-2 feedback: original scope was too narrow.

Six edits:

  1. Top of doc: add 3-line sprint pointer (per Component 1) plus "Last verified: 2026-05-06" timestamp.

  2. Replace lines 162-163 false claim with:

    Domain tag retrofit — partial. All 305 content pages carry at least one valid domain tag, but off-grid tag is on only 50% of pages (154/305). The 2026-05 three-category sprint Sub-project 3 audits the gap and applies justified retags.

  3. Update all absolute counts — sweep all 6 occurrences (312, 253, 266, 272, 301, 310) and reconcile with current state: wc -l docs/**/*.md and python3 scripts/category-coverage.py. Where the historical count was a milestone, mark it (historical: 2026-MM-DD).

  4. Reframe Track 1B (line 149). Change "Off-grid & homesteading content expansion" — replace forward-looking new-page narrative with "Off-grid coverage hardening: tag-justification audit + canon adequate→strong promotion. New off-grid pages frozen for sprint duration except threats × off-grid canon stub."

  5. Add "Current sprint priorities as of 2026-05-06" block at the top after the sprint pointer:

  6. Priority 1: Prepping depth (2/12 Foundations at strong)
  7. Priority 2: Off-grid tag-justification audit (50% gap analysis)
  8. Priority 3: Close threats × off-grid canon stub
  9. Priority 4: Standard /run-loop work (post-sprint default)

  10. Mark older priority lists that conflict with new ordering as (historical, pre-sprint).

Component 4 — .claude/commands/run-loop.md Sprint-Mode Selection

Codex round-2 feedback: webmaster.md alone is insufficient because /run-loop has its own selection logic.

Edit /run-loop step 3 (line 57) to:

3. Check the first 15 lines of `BACKLOG.md` for a `<!-- SPRINT-MODE` block.

   If present and `Status: ACTIVE` and `Expires` date is in the future:
   - Parse the `Precedence` line into a list (e.g., `[TAG-AUDIT, CANON-PROMOTE, CANON, OTHER]`).
   - Bucket all incomplete BACKLOG tasks by their leading prefix (`TAG-AUDIT:`, `CANON-PROMOTE:`, `CANON:`, else `OTHER`).
   - Within each bucket, RICE sort.
   - Concatenate buckets in precedence order.
   - Apply the `Freeze` rule when selecting (e.g., reject new-page authoring tasks not on the canon-stub allowlist).

   If `Expires` is past:
   - Webmaster removes the SPRINT-MODE block from BACKLOG.md, appends an AUDIT_LOG.md entry, then proceeds with normal RICE sort. (This is logged — never silent.)

   If the block is absent or `Status` is not `ACTIVE`:
   - Use normal RICE sort (existing behavior).

   Read `BACKLOG.md`. Starting from the highest-priority incomplete task per the rules above, accumulate tasks in priority order until adding the next task would exceed the point budget.

Component 5 — .claude/agents/webmaster.md Sprint-Mode Mirror

Mirror the /run-loop selection rule in webmaster.md (the agent must know about it because it can also be dispatched independently of /run-loop). Add subsection:

### Sprint-mode override (mirror of /run-loop step 3)

When dispatched, first check the first 15 lines of `BACKLOG.md` for a `<!-- SPRINT-MODE` block (parser rules in `/run-loop.md`). If active, apply Precedence + Freeze. If expired, remove the block, append AUDIT_LOG entry, then proceed normally. The `/run-loop` command and this agent share identical sprint-mode logic — keep them in sync if either is edited.

Component 6 — .claude/agents/author.md CANON-PROMOTE Template (cell-level)

Codex round-2 feedback: original template said "per page touched," but canon status is per (foundation × category) cell. Risk: author improves one page and declares the whole cell strong.

Add new section to author.md:

### CANON-PROMOTE tasks (adequate → strong, cell-level)

Task format: `CANON-PROMOTE: {foundation} × {category} adequate→strong`
(e.g., `CANON-PROMOTE: food × prepping adequate→strong`)

**Goal:** Promote the named (foundation × category) **cell** from `adequate` to `strong` per CATEGORY-CANON.md state machine. Reader capability is the goal; word count rises as side effect, not as goal.

**Required workflow (in order):**

**Step 1 — Pre-check evidence (BEFORE any page edits):**
1. Read CATEGORY-CANON.md `{foundation} × {category}` cell. Extract the `required-topics` list and `strong` promotion criteria.
2. Run `python3 scripts/category-coverage.py --category {category} --foundation {foundation}` to see the cell's current `pages-with-tag` count and required-topics fulfillment.
3. Map every required-topic to existing pages or "GAP." Document this as a handoff table:

   | Required topic | Existing page (path) | Before-state gap | Planned change |
   |---|---|---|---|
   | (e.g.) Cold-storage shelf life | docs/food/cold-storage.md | Missing freezer-burn timeline | Add freezer-burn table |
   | (e.g.) Bulk grain rotation | GAP | No page | Cross-link from food/storage.md |

4. Save the handoff table as the first section of the LOG.md entry for this task.

**Step 2 — Per-page edit requirements:**
For every page identified in the handoff table as needing change:
1. **Decision support** — at least one decision matrix, comparison table, or branching checklist that a reader uses to choose between options.
2. **Field Note** — at least one Field Note admonition with practical wisdom that a beginner would not figure out on their own.
3. **Visual asset** — if the page is missing a diagram or image where one would clarify, add a `[VISUAL-NEEDED]` block and dispatch `@diagrammer` or `@image-gen` per Visual Asset routing rules.
4. **Cross-link density** — minimum 2 internal cross-references to other pages, ideally to same-category siblings.
5. **Procedural completeness floor** — Tier 1 pages need step-by-step depth; Tier 2 need decision criteria; Tier 3 need overview + routing.
6. **Front matter dual-tags** — if the cell is e.g. `{foundation} × prepping`, every touched page must carry the `prepping` tag (verify with `grep -A5 "^tags:" $PAGE`).

**Step 3 — Post-check evidence (AFTER all page edits):**
1. Re-run `python3 scripts/category-coverage.py --category {category} --foundation {foundation}` and confirm the cell now meets `strong` criteria.
2. Append a `CANON_PROMOTED` entry to LOG.md with format:
   ```
   YYYY-MM-DD HH:MM | author | CANON_PROMOTED | {foundation} × {category} | adequate→strong | pages: [list] | evidence: handoff table in LOG.md line N
   ```
3. **Author does NOT edit CATEGORY-CANON.md status field directly.** That edit is the publisher's job (Component 8) after verification.

**Out of scope for CANON-PROMOTE:**
- Generic word-count padding ("add 500 words")
- Cosmetic formatting changes
- Tag retrofitting (separate task type: TAG-AUDIT)
- Touching pages outside the named cell

Component 7 — TAG-AUDIT Task Format

Codex round-2 feedback: sprint-mode precedence references TAG-AUDIT: but no task format exists.

Define in STANDARDS.md or MEMORY-PROCESS.md (whichever fits — STANDARDS is the public-facing convention; MEMORY-PROCESS is the internal pattern). Use STANDARDS:

### TAG-AUDIT task format (sprint type)

Task format: `TAG-AUDIT: {scope description}` (e.g., `TAG-AUDIT: off-grid tag in community foundation (6/21)`)

**Required workflow:**

1. List every page in the scope (e.g., all 21 pages in docs/community/).
2. For each page, evaluate against the **off-grid reader test:**
   > Does this page contain content that a reader living off-grid as a permanent residence (not a survival or short-term prepping context) would find useful?
3. Document the decision as a justification table in LOG.md:

   | Page | Currently tagged | Pass test? | Action | Reason |
   |---|---|---|---|---|
   | docs/community/A.md | survival, prepping | YES | Add off-grid tag | Mutual-aid networks for rural homesteaders |
   | docs/community/B.md | survival | NO | No change | Urban-only context |

4. Apply tag changes only to pages marked YES.
5. Tag changes are bundled into a single commit per scope, with the justification table embedded in the commit message.

**Out of scope for TAG-AUDIT:**
- Adding tags without page-level reasoning (forbidden — explicit Codex pushback)
- Removing existing tags (separate task: TAG-REMOVE)
- Editing page content (separate task: CANON-PROMOTE)

Component 8 — Reflector + Publisher Updates

Codex round-2 feedback: author should not be the final promotion authority. Reflector and publisher need explicit roles.

reflector.md — add to existing close-out checklist:

- If LOG.md has a CANON_PROMOTED entry for this loop, verify the author's handoff table matches the post-check evidence. Add a `[ ] [XS] verify-canon-promotion {cell}` BACKLOG task assigned to publisher.

publisher.md — add to pre-publish checklist:

- [ ] **Canon promotion verification:** for any LOG.md CANON_PROMOTED entry in this commit batch, re-run `python3 scripts/category-coverage.py --category {category} --foundation {foundation}` and verify the cell meets `strong` criteria. If yes, edit `CATEGORY-CANON.md` status field for that cell and stage the change. If no, reject the commit and append a Tier B BACKLOG task `[ ] [S] re-promote {cell} — author claim failed verification`.

Component 9 — Expiry Verification BACKLOG Task

Codex round-2 feedback: removal can't depend on a future agent noticing the date.

Add to BACKLOG.md as a CRON-style entry:

- [ ] [XS] T1 P3 SPRINT-MAINTENANCE: Verify SPRINT-MODE block in BACKLOG.md header — if Expires past, remove block, archive SPRINT-2026-05.md to JOURNAL.md, append AUDIT_LOG entry. **Recurring**: webmaster checks on first /run-loop after 2026-06-15.
  RICE: 100 (low value but high reliability — prevents silent post-sprint misrouting)

Component 10 — /derive-contract Re-run

At end of execution, run /derive-contract to regenerate OPERATING-CONTRACT.md. Diff against prior version. If divergence is greater than minor wording (sprint-mode is a temporary mechanism, should not show as material contract change), surface to user before final commit.

Implementation Order

  1. Create SPRINT-2026-05.md (new file, no dependencies)
  2. Add SPRINT-MODE header to BACKLOG.md
  3. Add expiry-verification BACKLOG task (Component 9) — same file, same edit pass
  4. Edit /run-loop command (Component 4)
  5. Edit webmaster.md (Component 5)
  6. Edit author.md (Component 6)
  7. Edit STANDARDS.md for TAG-AUDIT format (Component 7)
  8. Edit reflector.md and publisher.md (Component 8)
  9. Add 3-line sprint pointers to top of CLAUDE.md and PROJECT-STATUS.md
  10. Apply 6-edit truth-up to PROJECT-STATUS.md (Component 3)
  11. Append AUDIT_LOG.md entry per Operating Constitution rule 5
  12. Append LOG.md entries per action
  13. Run /derive-contract and review diff
  14. mkdocs build --strict to confirm no breakage
  15. Single git commit covering all changes

Verification

  • head -15 BACKLOG.md | grep "Status: ACTIVE" returns the sprint header line
  • head -15 BACKLOG.md | grep "Precedence: TAG-AUDIT,CANON-PROMOTE,CANON,OTHER" returns the precedence line
  • grep -c "Sprint-mode" .claude/commands/run-loop.md ≥ 1
  • grep -c "Sprint-mode override" .claude/agents/webmaster.md ≥ 1
  • grep -c "CANON-PROMOTE tasks" .claude/agents/author.md ≥ 1
  • grep -c "TAG-AUDIT task format" STANDARDS.md ≥ 1
  • grep -c "Canon promotion verification" .claude/agents/publisher.md ≥ 1
  • grep -i "domain tag retrofit ✅ complete" PROJECT-STATUS.md returns 0 results
  • grep -E "\b312\b" PROJECT-STATUS.md returns 0 unmarked occurrences (any remaining are tagged historical)
  • head -3 CLAUDE.md | grep "SPRINT-2026-05.md" returns the pointer
  • test -f SPRINT-2026-05.md returns true
  • mkdocs build --strict exits 0
  • python3 scripts/category-coverage.py --report runs cleanly (no count regressions from edits)
  • git log --since="2026-05-06" --oneline | head -5 shows the sub-project 1 commit
  • OPERATING-CONTRACT.md re-derived diff is minor

Risks and Mitigations

Risk Mitigation
SPRINT-MODE block survives expiry Webmaster + run-loop both check Expires; auto-remove + AUDIT_LOG entry on first invocation past date. Plus Component 9 BACKLOG task as belt-and-suspenders.
Author treats CANON-PROMOTE as word-count task Template forbids it explicitly; pre-check handoff table required; out-of-scope list is enumerated.
Author unilaterally promotes a cell Component 8 — only publisher edits CATEGORY-CANON.md; reflector queues verification task.
/run-loop and webmaster.md sprint logic drift Both files reference the same parser rules in /run-loop.md; edit-in-sync note added.
TAG-AUDIT becomes "tag everything off-grid" Reader test required per page; justification table in commit message; sprint-mode Freeze rule blocks new pages so the audit must be defensive, not expansive.
PROJECT-STATUS truth-up creates new contradictions elsewhere Sweep all absolute counts (not just 312); mark historical counts explicitly; verify with wc and category-coverage.py post-edit.

Open Questions

None remaining after Codex round-2 review.

Spec Self-Review

  • Placeholders: none. All sections concrete.
  • Internal consistency: SPRINT-MODE block, /run-loop selection rule, webmaster mirror, and CANON-PROMOTE template all reference the same precedence ladder and Expires field. Author/reflector/publisher division of canon-promotion authority is explicit (author claims, reflector queues, publisher verifies + edits CATEGORY-CANON.md).
  • Scope check: 10 components, 11 file edits + 1 new file, single commit — substantial but within a single implementation plan.
  • Ambiguity check: Parser rules for SPRINT-MODE block are documented in /run-loop.md; webmaster.md mirrors. Reader test for TAG-AUDIT is explicit.
  • Codex feedback addressed: A (sprint-mode format made machine-simple) ✓; B (CANON-PROMOTE moved to cell level with handoff table) ✓; C (PROJECT-STATUS scope expanded — Track 1B + all counts) ✓; D (sprint brief moved to separate file SPRINT-2026-05.md) ✓; E (run-loop edit, reflector/publisher roles, TAG-AUDIT format, expiry BACKLOG task) ✓.