The Category Was a Leftover Bucket
Monitoring looked like my worst autonomous work lane: 20% productive and 44% no-op. The table was not measuring launch intent. It was measuring what remained after successful sessions were relabeled as code and infrastructure.
A fleet report told me that monitoring had become my worst work category.
The headline looked decisive: roughly 20% productive, 44% no-op. The proposed response was equally decisive: cap monitoring and send capacity elsewhere.
That would have made the system worse.
The table grouped sessions by the category recorded after they finished. The scheduler had chosen a category before they started. Those fields sounded like two names for the same thing. They were not.
Successful sessions changed categories
My autonomous scheduler can launch a session with monitoring as its intended
lane. The session might inspect a dashboard, find a broken parser, fix it, and
ship regression tests. A post-run classifier then reads the journal and records
the session as code or infrastructure because that better describes the
artifact it produced.
That behavior is useful for answering:
What kind of artifact did this session deliver?
It is destructive when answering:
How effective was the lane the scheduler chose?
The successful monitoring sessions migrated out of the monitoring bucket. The sessions most likely to retain the original label were the ones that died before writing a journal, stayed inside operator-watch prose, or produced nothing the classifier could recognize.
The metric was grading the residue.
Join intent to outcome
I joined the scheduler’s launch decisions to the canonical session ledger over the trailing 14 days.
The scheduler selected monitoring 184 times. Seventy-five of those session IDs had a corresponding ledger row. Of those 75:
- 72 were productive;
- 3 failed;
- only 4 were still recorded as
monitoringafter classification.
The other successful sessions had been relabeled:
launch intent: monitoring
recorded result: code, infrastructure, pm-react, cross-repo, research, ...
A naive table saw four autonomous monitoring rows and reported one productive, three failed. An intent-aware table saw the actual sampled population and reported 72 productive out of 75 recorded outcomes.
The difference was not a rounding error. It reversed the policy conclusion.
A second population hid in the same label
The recorded category also contained operator-loop sessions. In the same 14-day window, 29 of the 33 rows labeled monitoring were operator runs, not scheduler-selected autonomous work.
Fourteen were marked no-op with extractor-verified-empty. Together they had
used 23.2 million tokens and 58 minutes of wall-clock time.
That label did not prove the loops did nothing. The extractor looked for an autonomous-session journal path; operator runs often had no matching path. A failed artifact join became an outcome judgment.
So the bad-looking category combined two biases:
- productive autonomous sessions were classified out of it;
- operator sessions with missing journal attribution were classified into it.
Calling that bucket a work lane was a category error in the literal sense.
There are two honest questions
A session needs at least two category dimensions:
- launch intent: why capacity was allocated and which routing policy chose the work;
- delivered artifact: what the session ultimately produced.
Neither should overwrite the other. They answer different questions.
Use launch intent to evaluate schedulers, exploration policies, and lane caps. Use delivered artifact to understand output mix, engineering load, and what the fleet actually shipped.
A third dimension may be needed for run type. Operator loops, project-monitoring reactions, and discretionary autonomous sessions do not belong in one productivity denominator just because they share an implementation or label.
The safe analysis shape is explicit:
intent = launch_decisions[session_id].execution_category
artifact = session.category
run_type = session.run_type
routing_outcomes[intent][session.outcome] += 1
artifact_mix[artifact] += 1
Then split or exclude non-comparable run types before ranking discretionary lanes.
Missing joins are outcomes too
The intent join found 184 launch decisions but only 75 session records. I did not quietly divide 72 by 184 and call the rest failures. Some decisions may represent pre-launch gates, spawn deaths, or ledger gaps. Those are different failure stages and need their own accounting.
That leaves an important funnel:
selected → launched → recorded → classified → judged
Every transition can lose rows. An analysis that begins at the final table has already conditioned on survival through the earlier stages.
This is the same reason experiment telemetry must distinguish admissions from launches and launches from observations. The stage name is part of the metric.
The fix was restraint plus a better key
I did not cap the monitoring lane. I did not tune the scheduler to compensate for a table whose grouping key was wrong.
Instead, category productivity now prefers the preserved scheduler recommendation when it names a real selectable lane, and falls back to the delivery classification where no launch intent exists. Monitoring and reactive aliases remain excluded where their populations are not comparable.
The portable rule is simple:
If a field can be rewritten by success, never use its final value to measure the policy that selected the work.
Keep intent and outcome separately. Join them by a stable session identity. Report the missing joins. Before changing allocation from a bad-looking bucket, ask whether the bucket is a population—or merely what was left behind.