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.mdlines 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.mdstill frames "new off-grid pages" as active expansion — directly conflicts with the sprint freeze rule. /run-loopline 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
- Eliminate
PROJECT-STATUS.mdmisrouting drift — false "complete" claim replaced; Track 1B reframed; all absolute counts updated. - Add a machine-readable sprint-mode toggle that
/run-loopand webmaster both honor. - Give author agent a
CANON-PROMOTEtask template with cell-level evidence requirements that prevent degradation to word-count padding. - Define
TAG-AUDITtask format so sprint-mode precedence has reliable selectors. - Update reflector + publisher for
CANON_PROMOTEDlogging — author is not the final promotion authority. - Re-derive operating contract after edits to confirm internal consistency.
Non-Goals (explicit)
- Restructuring
CLAUDE.mdfor 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:
-
Top of doc: add 3-line sprint pointer (per Component 1) plus "Last verified: 2026-05-06" timestamp.
-
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.
-
Update all absolute counts — sweep all 6 occurrences (
312,253,266,272,301,310) and reconcile with current state:wc -l docs/**/*.mdandpython3 scripts/category-coverage.py. Where the historical count was a milestone, mark it(historical: 2026-MM-DD). -
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-gridcanon stub." -
Add "Current sprint priorities as of 2026-05-06" block at the top after the sprint pointer:
- Priority 1: Prepping depth (2/12 Foundations at strong)
- Priority 2: Off-grid tag-justification audit (50% gap analysis)
- Priority 3: Close
threats × off-gridcanon stub -
Priority 4: Standard /run-loop work (post-sprint default)
-
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
- Create
SPRINT-2026-05.md(new file, no dependencies) - Add SPRINT-MODE header to
BACKLOG.md - Add expiry-verification BACKLOG task (Component 9) — same file, same edit pass
- Edit
/run-loopcommand (Component 4) - Edit
webmaster.md(Component 5) - Edit
author.md(Component 6) - Edit
STANDARDS.mdfor TAG-AUDIT format (Component 7) - Edit
reflector.mdandpublisher.md(Component 8) - Add 3-line sprint pointers to top of
CLAUDE.mdandPROJECT-STATUS.md - Apply 6-edit truth-up to
PROJECT-STATUS.md(Component 3) - Append
AUDIT_LOG.mdentry per Operating Constitution rule 5 - Append
LOG.mdentries per action - Run
/derive-contractand review diff mkdocs build --strictto confirm no breakage- Single git commit covering all changes
Verification
head -15 BACKLOG.md | grep "Status: ACTIVE"returns the sprint header linehead -15 BACKLOG.md | grep "Precedence: TAG-AUDIT,CANON-PROMOTE,CANON,OTHER"returns the precedence linegrep -c "Sprint-mode" .claude/commands/run-loop.md≥ 1grep -c "Sprint-mode override" .claude/agents/webmaster.md≥ 1grep -c "CANON-PROMOTE tasks" .claude/agents/author.md≥ 1grep -c "TAG-AUDIT task format" STANDARDS.md≥ 1grep -c "Canon promotion verification" .claude/agents/publisher.md≥ 1grep -i "domain tag retrofit ✅ complete" PROJECT-STATUS.mdreturns 0 resultsgrep -E "\b312\b" PROJECT-STATUS.mdreturns 0 unmarked occurrences (any remaining are tagged historical)head -3 CLAUDE.md | grep "SPRINT-2026-05.md"returns the pointertest -f SPRINT-2026-05.mdreturns truemkdocs build --strictexits 0python3 scripts/category-coverage.py --reportruns cleanly (no count regressions from edits)git log --since="2026-05-06" --oneline | head -5shows the sub-project 1 commitOPERATING-CONTRACT.mdre-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) ✓.