archetype
thrash
17 of 46 sessions · 9.3h of the waste
● morphology · all agentsskalpel prosumer workspace
Your merged behavioral DAG, read by the causal Profile engine. Twelve lenses run once at ingest over every session's causal edges and measured time. Claude Code and Codex are mined separately, because they fail differently — pool them and you get a profile that describes neither.
Pooled across every agent. Useful for volume; misleading for behaviour — the two agents fail differently.
archetype
thrash
17 of 46 sessions · 9.3h of the waste
● morphology · all agentsrework share
18%
19.1h of 106 active hours · idle-capped at 30min/turn
● headline.rework_pctE[time to resolve]
22min
at debug/retry_refine, per the all agents profile
● absorbing markov · P(success) 0.71deep-spiral escape
29%
at depth 5+ · down from 78% at depth 2
● survival · the cliff*🔬 skalpel · you usually lose ~6min re-entering the “correcting the AI without it converging” loop here — routing around it:*
The felt line is a fixed string the model places verbatim. Behind it sits the reasoning block above, drawn from the codex profile. top_sim 0.74 — credited per dodge, confirmed at n+1.
| metric | Claude Code | Codex | all agents |
|---|---|---|---|
| Dominant archetypeThe agents have different failure shapes. The pooled archetype describes whichever one you use more, and mislabels the other. | over-polish | thrash | thrash |
| Rework shareA pooled rate is a weighted average of two populations. It is the rate for no session you have ever had. | 14% | 24% | 18% |
| Deep-spiral escapeThis is the push-vs-bail signal. Getting it wrong inverts the steer: you tell a grinder to bail and a quitter to push. | 44% | 17% | 29% |
| Biggest time sinkWhere the hours actually go, per agent — the thing you would act on. | refine · 21.4h | debug · 22.5h | debug · 34.2h |
Escape probability collapses from 78% at depth 2 to 29% at depth 5+. A steer is worth far more early. This curve is the only thing in the system that can answer when to fire, rather than just what to say — and it is the signal that most disagrees between agents.
| state | E[resolve] | P(success) | V · all agents |
|---|---|---|---|
| debug/retry_refine | 22 min | 0.71 | 11.2m |
| refine/retry_refine | 17 min | 0.83 | 7.4m |
| feature/in_progress | 14 min | 0.86 | 6.1m |
| plan/in_progress | 9 min | 0.91 | — |
| Absorbing states (success / blocked / abandoned) carry no forecast, so no FORECAST line fires there. V is a pooled whole-graph value iteration with no per-source decomposition — it stays “all agents” in every scope. | |||
| after state | spirals into | n | min each | total |
|---|---|---|---|---|
| debug/blocked | debug | 12 | 8 | 96m |
| feature/in_progress | debug | 9 | 8 | 68m |
| debug/retry_refine | refine | 7 | 6 | 41m |
| debug/success | refine | 4 | 5 | 19m |
sinks — same-type waste self-loops
forks — outcome swing of the next move
research has the worst waste-rate (56%) but costs only 3.9h. debug wastes proportionally less yet is 32% of the wall-clock. Rate-ranking and hour-ranking disagree — attacking the rate leader would move almost nothing.
| spiral shape | n | minutes |
|---|---|---|
| debug→refine | 34 | 198 |
| feature→debug→refine | 14 | 156 |
| debug | 22 | 121 |
| refine | 19 | 88 |
| feature→debug | 11 | 74 |
| signature | high-waste | clean |
|---|---|---|
| feature→debug→debug | 9 | 1 |
| debug→refine→refine | 8 | 2 |
| explain→explain→feature | 5 | 0 |
| debug→debug→debug | 4 | 0 |
thrash tercile — 41% of time is rework
opens with: debug (14) · refine (9) · feature (6)clean tercile — 7% of time is rework
opens with: plan (11) · explain (8) · feature (7)The most actionable line in the profile: clean sessions open with plan; thrash sessions open with debug. It becomes a SessionStart steer, not a mid-turn one. Correlational until the do-calculus layer lands.
read · file · revert · smaller · test · logs · scope · print · isolate · diff
Keywords lifted from the goal text of the intent that immediately followed each waste run and resolved it. Honest caveat: the selection of which intents to mine is causal, but the extraction is still bag-of-words (_kw() over a stopword list). This is the one lens that did not fully escape the heuristic it replaced.
Value iteration over the whole graph, one number per state. The n+1 counter still diffs this V, and render_injection still splices on it. It is computed over all agents pooled and has no per-source form — so a Codex turn is currently credited against a number that includes Claude Code behaviour. Retiring V for the absorbing-Markov table is open work, and it is what fixes this.
| from → to | count | waste_to |
|---|---|---|
| feature/in_progress → feature/success | 41 | 8% |
| debug/retry_refine → refine/retry_refine | 32 | 71% |
| debug/retry_refine → debug/success | 28 | 9% |
| refine/retry_refine → refine/success | 26 | 12% |
| feature/in_progress → debug/retry_refine | 24 | 58% |
| plan/success → feature/in_progress | 22 | 18% |
| debug/blocked → debug/retry_refine | 21 | 62% |
| debug/blocked → feature/blocked | 18 | 55% |
| refine/retry_refine → debug/blocked | 14 | 64% |
| explain/success → feature/in_progress | 12 | 15% |
| feature/blocked → feature/success | 11 | 20% |
| feature/blocked → refine/retry_refine | 9 | 61% |
| debug/blocked → research/abandoned | 6 | 83% |
[skalpel — this user's behavioral profile, from 18 sessions (24% of their time is rework). Account for these silently; surface only when one clearly applies this turn.]
· Archetype: their waste is mostly 'thrash' (7.1h).
· Waste tell: the sequence 'feature→debug→debug' shows up in their bad sessions, not clean ones.
· They ABANDON — only 17% escape a deep spiral; nudge them to push, not bail.
· Clean sessions open with: plan, explain, feature — steer them to open that way.
· Time sink: 'debug' is 53% of their wall-clock.
_parse_any() dispatches on is_codex_rollout(path) and then discards the answer; Session has no source field and analyze_session() returns none. Everything this page splits by agent is fixture data. Landing the four-line engine change in docs/INTENT-GRAPH.md is what makes it real.parser_codex.py says so in its own docstring. Any lens that leans on n_tool_errors or step counts is weaker for Codex than for Claude Code, and the two are not comparable on those axes even after the split.aggregate_dag._WASTE = {blocked, abandoned, retry_refine, in_progress} but mine._WASTE = {retry_refine, debug, error, abandoned, blocked}. The resolution enum is {success, retry_refine, abandoned, in_progress, blocked, unknown} — so "debug" and "error" can never match a resolution, and in_progress is silently not counted as waste by the profile.enabled edges. The judge sees a Codex transcript through an adapter, so attribution quality is not guaranteed to be equal across sources.profile lenses 12scope all agentssteers capped at 3sim floor 0.62mine.py · 341 loc · zero deps