Skip to content

Commit 2cf4483

Browse files
committed
Merge feat/cli-search: dogfood session feedback doc
2 parents 94832bd + a6c43fd commit 2cf4483

1 file changed

Lines changed: 239 additions & 0 deletions

File tree

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
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

Comments
 (0)