|
| 1 | +# Dogfood Session: 2026-04-05 |
| 2 | + |
| 3 | +First full end-to-end development session using XYPH's own governance |
| 4 | +pipeline. One feature cycle completed (`task:cli-search`), one stale quest |
| 5 | +sealed (`task:GRAPH-CLEANUP`), and extensive friction discovered across |
| 6 | +both CLI and TUI surfaces. |
| 7 | + |
| 8 | +**Milestone:** Completed a full METHOD cycle (design doc → RED → GREEN → |
| 9 | +playback → retro → seal) entirely through XYPH's graph — no GitHub issues, |
| 10 | +no PRs for governance. The WARP graph handled intent, sovereignty, |
| 11 | +traceability, and settlement for a real feature. |
| 12 | + |
| 13 | +--- |
| 14 | + |
| 15 | +## Session Statistics |
| 16 | + |
| 17 | +- **Backlog items filed:** 23 |
| 18 | +- **Throwaway scripts written:** 9 |
| 19 | +- **Command failures/retries:** ~15 |
| 20 | +- **Quests sealed:** 2 (task:cli-search, task:GRAPH-CLEANUP) |
| 21 | +- **Invariant violations found:** 1 (substrate-boundary) |
| 22 | +- **Bugs found:** 6 |
| 23 | +- **Full test suite runs triggered by graph-only pushes:** 4 (~3 min wasted) |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## Friction Log: Every Throwaway Script |
| 28 | + |
| 29 | +Every time the agent wrote a custom script to work around CLI limitations. |
| 30 | + |
| 31 | +| # | What | Why | Backlog item | |
| 32 | +|---|---|---|---| |
| 33 | +| 1 | `status --view all --json \| python3` count by status | No stats command | task:cli-search (DONE) | |
| 34 | +| 2 | `doctor --json \| python3 json.load()` → failed, multi-line JSONL | Doctor emits JSONL, not single JSON | (unfiled — doctor output format) | |
| 35 | +| 3 | `status --view all --json \| python3` search for "MCP" | No keyword search | task:cli-search (DONE) | |
| 36 | +| 4 | `status --view lineage --json \| python3` list intent IDs | No way to discover valid reference values | task:governance-friction-audit | |
| 37 | +| 5 | `status --view all --json \| python3` list campaign IDs | Same — no reference value discovery | task:governance-friction-audit | |
| 38 | +| 6 | `search --status GRAVEYARD --json \| python3` format count | Even after building search, piped through python | (habit / pretty-print) | |
| 39 | +| 7 | `search --json \| python3 -m json.tool` pretty-print | No built-in pretty output for JSON | (minor) | |
| 40 | +| 8 | `search --stats --json \| python3 -m json.tool` pretty-print | Same | (minor) | |
| 41 | +| 9 | `_check-suggestions.ts` (5 attempts to get working) | Cannot see TUI suggestion nodes from CLI | task:suggestion-visibility-fix | |
| 42 | + |
| 43 | +**Pattern:** The CLI's `--json` mode is designed for agent consumption but |
| 44 | +the agent still has to parse it through external tools. The most common |
| 45 | +queries (search, stats, list valid values) had no built-in commands. |
| 46 | + |
| 47 | +--- |
| 48 | + |
| 49 | +## Friction Log: Every Command That Failed on First Try |
| 50 | + |
| 51 | +Every time a command was invoked incorrectly and required a retry. |
| 52 | + |
| 53 | +| # | What was tried | Error | Root cause | |
| 54 | +|---|---|---|---| |
| 55 | +| 1 | `doctor --json \| json.load()` | JSONDecodeError: Extra data | Doctor emits multi-line JSONL, not single JSON object | |
| 56 | +| 2 | `link task:cli-search --to campaign:CLITOOL` | required option '--campaign' not specified | `link` uses `--campaign`, not `--to` | |
| 57 | +| 3 | `promote ... --intent intent:agent-ergonomics` | Intent not found | No way to discover valid intents without separate query | |
| 58 | +| 4 | `promote task:cli-search` (as agent.prime) | promote requires human principal | Discovered by error, not documented in help | |
| 59 | +| 5 | `promote ...` (without --description) | requires --description when quest has none | Conditional requirement, discovered by error | |
| 60 | +| 6 | `story ...` (without --title) | required option '--title' not specified | Missing required arg | |
| 61 | +| 7 | `story ...` (without --persona) | required option '--persona' not specified | Had to run --help after first failure | |
| 62 | +| 8 | `merge ...` (without XYPH_ALLOW_UNSIGNED_SCROLLS) | Missing private key | No guild seal key configured for human.james | |
| 63 | +| 9 | `_check-suggestions.ts` with `WarpGraph` | Does not provide export named 'WarpGraph' | Export is `WarpCore`, not `WarpGraph` | |
| 64 | +| 10 | `_check-suggestions.ts` with top-level await | Top-level await not supported with cjs | tsx -e doesn't support top-level await | |
| 65 | +| 11 | `_check-suggestions.ts` in /tmp/ | Cannot find module '@git-stunts/git-warp' | Must run from project dir for node_modules | |
| 66 | +| 12 | `_check-suggestions.ts` wrong constructor args | logger?.debug is not a function | Constructor arg order: (cwd, graphName, writerId, logger?) | |
| 67 | +| 13 | `_check-suggestions.ts` without writerId | Invalid writer ID: expected string, got undefined | writerId is required, not optional | |
| 68 | + |
| 69 | +**Pattern:** Almost every governance command required 1–2 failures to |
| 70 | +discover required arguments. The CLI does not guide you through the flow — |
| 71 | +it waits for you to fail and then tells you what was wrong. |
| 72 | + |
| 73 | +--- |
| 74 | + |
| 75 | +## Friction Log: Governance Pipeline (13 Steps for 109 LOC) |
| 76 | + |
| 77 | +The full BACKLOG → DONE pipeline for `task:cli-search`: |
| 78 | + |
| 79 | +| Step | Command | Required fields | Friction | |
| 80 | +|---|---|---|---| |
| 81 | +| 1 | `promote` | `--as human.*`, `--description`, `--intent` | 3 retries to get right | |
| 82 | +| 2 | `move` | `--campaign` | Separate from promote — why? | |
| 83 | +| 3 | `story` | `--title`, `--persona`, `--goal`, `--benefit`, `--intent` | 2 retries (missing required args) | |
| 84 | +| 4 | `decompose` | `<from> <to>` | OK | |
| 85 | +| 5 | `requirement` | `--description`, `--kind`, `--priority` | OK | |
| 86 | +| 6 | `implement` | `<quest> <requirement>` | OK | |
| 87 | +| 7 | `criterion` | `--description`, `--requirement` | OK | |
| 88 | +| 8 | `ready` | (gated on steps 1–7) | Failed twice before prerequisites met | |
| 89 | +| 9 | `claim` | (none) | OK | |
| 90 | +| 10 | `submit` | `--description` | OK | |
| 91 | +| 11 | `evidence` | `--kind`, `--result`, `--criterion`, `--produced-by`, `--artifact-hash` | 5 required fields to say "tests pass" | |
| 92 | +| 12 | `review` | `--as human.*`, `--verdict`, `--comment` | OK | |
| 93 | +| 13 | `merge` | `--rationale` + `XYPH_ALLOW_UNSIGNED_SCROLLS=1` | Env var workaround | |
| 94 | + |
| 95 | +**Observations:** |
| 96 | +- Steps 2–7 (campaign + traceability chain) are 6 commands to establish |
| 97 | + governance metadata. For a solo agent cycle, this is pure overhead. |
| 98 | +- The traceability chain (story → requirement → criterion → evidence) is |
| 99 | + designed for multi-stakeholder review but is mandatory even for trivial |
| 100 | + features. |
| 101 | +- `promote` + `move` + `authorize` could be one command. |
| 102 | +- `evidence` requires 5 fields to record "14 tests pass" — the test suite |
| 103 | + result should be auto-capturable. |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +## Bugs Found |
| 108 | + |
| 109 | +| Bug | Status | Backlog item | |
| 110 | +|---|---|---| |
| 111 | +| TUI spiral animation doesn't animate (cached during loading, no tick source after) | Filed | task:landing-spiral-animation | |
| 112 | +| `status --view suggestions` returns 0 despite 8 suggestion nodes in graph | Root-caused | task:suggestion-visibility-fix | |
| 113 | +| Merged/closed quests appear in TUI review tab | Filed | task:review-tab-stale-quests | |
| 114 | +| Graph sync blocks main thread, TUI hitches | Filed | task:sync-blocks-main-thread | |
| 115 | +| [ai] tag appears on human suggestions, not AI ones | Filed | task:ai-tag-wrong-source | |
| 116 | +| `xyph merge` bypasses CI gates — seals quest without GitHub Actions | Filed | task:merge-ci-gap | |
| 117 | + |
| 118 | +--- |
| 119 | + |
| 120 | +## Friction Log: Pushing Graph Refs |
| 121 | + |
| 122 | +Pushing WARP graph refs (`refs/warp/xyph/*`) triggered the pre-push hook |
| 123 | +4 times during this session. Each run executes the full test suite (~48s) |
| 124 | +even though graph refs are CRDT patches on the empty tree — they don't |
| 125 | +touch the codebase. |
| 126 | + |
| 127 | +Additionally, `checkpoints/head` and `coverage/head` refs conflicted with |
| 128 | +stale remote refs from before the xyph/xyph-roadmap graph consolidation |
| 129 | +("the reckoning"). These are optimization artifacts, not source-of-truth |
| 130 | +data. Had to delete remote refs and re-push. |
| 131 | + |
| 132 | +Filed: |
| 133 | +- task:pre-push-skip-warp-refs — skip test suite for graph-only pushes |
| 134 | +- task:checkpoint-push-policy — who should push checkpoint refs at all? |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## Invariant Violation |
| 139 | + |
| 140 | +**invariant:substrate-boundary** — `ObservedGraphProjection.ts` (1700 LOC) |
| 141 | +reimplements git-warp's read surface. It re-queries every node type, builds |
| 142 | +typed arrays, re-resolves edges into denormalized fields, and maintains |
| 143 | +per-entity-type projection loops. This is XYPH owning substrate mechanics |
| 144 | +that belong to git-warp. |
| 145 | + |
| 146 | +Direct consequence: the `aiSuggestions` blind spot. The projection builds |
| 147 | +two separate arrays (`suggestions` and `aiSuggestions`) but the CLI only |
| 148 | +reads one. Every time a new entity type is added, every consumer must be |
| 149 | +manually updated. |
| 150 | + |
| 151 | +Filed: task:snapshot-invariant-violation, task:snapshot-layer-audit |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## Cool Ideas and Feature Requests |
| 156 | + |
| 157 | +| Idea | Source | Backlog item | |
| 158 | +|---|---|---| |
| 159 | +| MCP API — expose WARP graph as MCP tools | human.james | task:mcp-api | |
| 160 | +| Configurable estimation (t-shirt sizes, hours, none) per project | human.james | task:configurable-estimation | |
| 161 | +| TUI incomplete quest indicator (!) | human.james | task:tui-incomplete-quest-indicator | |
| 162 | +| TUI create backlog item (inbox) from dashboard | human.james | task:tui-create-quest | |
| 163 | +| TUI mark all as seen | human.james | task:tui-mark-all-seen | |
| 164 | +| TUI assign flow | human.james | task:tui-assign-flow | |
| 165 | +| TUI guild view | human.james | task:tui-guild-view | |
| 166 | +| TUI notification feedback improvements | human.james | task:notification-feedback-improvements | |
| 167 | +| CLI next/frontier command | agent.claude | task:cli-next-command | |
| 168 | +| Doctor: flag stale IN_PROGRESS quests | agent.claude | task:doctor-stale-in-progress | |
| 169 | +| Bridge TUI ask-ai jobs to CLI agent visibility | agent.claude | task:tui-cli-bridge | |
| 170 | +| Pre-push: skip test suite for graph-only pushes | agent.claude | task:pre-push-skip-warp-refs | |
| 171 | +| Design: who should push checkpoint/coverage refs? | human.james | task:checkpoint-push-policy | |
| 172 | +| `xyph merge` should exercise CI gates | human.james | task:merge-ci-gap | |
| 173 | + |
| 174 | +--- |
| 175 | + |
| 176 | +## Process Violations Caught |
| 177 | + |
| 178 | +1. **Code before design doc.** The search command was fully implemented |
| 179 | + before the design doc was written. James caught it. Corrected |
| 180 | + retroactively. Feedback memory saved: every feature requires a cycle. |
| 181 | + |
| 182 | +2. **Backlog items filed before consolidation.** Filed 4 separate CLI |
| 183 | + search items, then consolidated into 1. Should have designed first. |
| 184 | + |
| 185 | +3. **Forgot to seal completed work.** `task:GRAPH-CLEANUP` sat in |
| 186 | + IN_PROGRESS for an entire session after its work was merged. |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +## What We Proved |
| 191 | + |
| 192 | +Despite all the friction, this session proved that XYPH's governance model |
| 193 | +works end-to-end: |
| 194 | + |
| 195 | +- **Full cycle without GitHub:** Design doc → RED → GREEN → playback → |
| 196 | + retro → seal, all through the WARP graph. |
| 197 | +- **Stigmergy works:** Human filed ask-ai jobs in TUI, agent found them |
| 198 | + in the graph (even if the CLI couldn't surface them yet). |
| 199 | +- **The graph is the truth:** Every piece of work, every decision, every |
| 200 | + rejection rationale is in the graph with provenance. |
| 201 | +- **Dogfooding produces signal:** 23 backlog items from one session. The |
| 202 | + friction IS the roadmap. |
| 203 | + |
| 204 | +--- |
| 205 | + |
| 206 | +## Recommended Priority Sort |
| 207 | + |
| 208 | +### Critical (invariant violations, data loss risk) |
| 209 | +1. task:snapshot-invariant-violation — substrate-boundary violation |
| 210 | +2. task:suggestion-visibility-fix — data exists but CLI can't see it |
| 211 | +3. task:sync-blocks-main-thread — UX-breaking hitch |
| 212 | + |
| 213 | +### High (workflow blockers) |
| 214 | +4. task:governance-friction-audit — 13 commands for 109 LOC |
| 215 | +5. task:tui-create-quest — humans can't do basic project management in TUI |
| 216 | +6. task:tui-cli-bridge — surfaces can't see each other's writes |
| 217 | +7. task:review-tab-stale-quests — stale data in review tab |
| 218 | + |
| 219 | +### Medium (ergonomic gaps) |
| 220 | +8. task:cli-next-command — "what should I work on?" |
| 221 | +9. task:doctor-stale-in-progress — forgotten IN_PROGRESS quests |
| 222 | +10. task:configurable-estimation — per-project estimation style |
| 223 | +11. task:tui-mark-all-seen — bulk mark-as-read |
| 224 | +12. task:ai-tag-wrong-source — inverted label |
| 225 | + |
| 226 | +### Medium-High (infrastructure) |
| 227 | +13. task:pre-push-skip-warp-refs — 4 needless test runs this session (~3 min) |
| 228 | +14. task:merge-ci-gap — merge seals without CI validation |
| 229 | +15. task:checkpoint-push-policy — who pushes optimization refs? |
| 230 | + |
| 231 | +### Lower (enhancements) |
| 232 | +16. task:landing-spiral-animation — cosmetic bug |
| 233 | +17. task:tui-assign-flow — assign quests from TUI |
| 234 | +18. task:tui-guild-view — see guild members |
| 235 | +19. task:tui-incomplete-quest-indicator — visual indicator |
| 236 | +20. task:notification-feedback-improvements — better toast/feedback |
| 237 | +21. task:xyph-retrospectives — first-class retro entities |
| 238 | +22. task:mcp-api — MCP server (bigger effort, deferred) |
| 239 | +23. task:snapshot-layer-audit — deeper architectural analysis |
0 commit comments