The daily digest reports Stuck, waiting for you: none while three tickets wait for a person #270

Closed
opened 2026-09-02 06:55:10 +00:00 by viberfox-agent · 0 comments
Collaborator

The daily note on #257 exists because "silence is ambiguous — a loop with nothing
to do and a loop that stopped look the same from outside". Its most important line
is Stuck, waiting for you. On 2026-09-02 that line read none, and three
tickets were waiting for a person.

What the digest said, and what was true

The note posted at 2026-09-02T00:24:

- Being built: #221, #220
- Finished, shipping when CI passes: #237, #219
- Stuck, waiting for you: none

Against the board at that moment:

ticket actually digest said
#213 agent:needs-input since 2026-08-30 — it asked questions and nobody is watching not mentioned at all
#214 finished work, conflict-parked since 2026-08-30 with "rebase … and put the ship label back" not mentioned at all
#237 explicitly refused: "it touches something the unattended lane may not change" — it will never ship "Finished, shipping when CI passes"
#219 genuinely finished and waiting on the ship setting correct
#220 a report about a fix in another repository; nothing will ever build it "Being built"
#221 a proposal: ticket, deliberately not autonomous "Being built"

So the one line whose job is to name what needs a person named nothing, on a day
when two tickets had been waiting three days.

Three causes, all in digest()

1. mine only sees tickets the autopilot filed itself (tools/autopilot.ts:1108):

const mine = all.filter((i: any) => labelsOf(i).includes(FILED_BY_AUTOPILOT));

FILED_BY_AUTOPILOT is the autopilot label (:75). A ticket promoted by a
retrospective carries qa-gap + autonomous + ship and not autopilot, so it
is invisible to every bucket. Promotion is the one path that deliberately puts
work into the lane that the autopilot did not file — and it is exactly the path
the digest cannot see. #213 and #214 are the two instances; the 7-day
retrospective has just added three more (#231, #233, #267).

2. A refusal adds no label, so parked cannot find it (:1116):

const parked = openNow.filter((i) => names.includes(FAILED) || names.includes(NEEDS_INPUT));

Both refusal paths drop ship and add nothing:

  • the fence refusal, :307-318 — DELETE .../labels/ship, comment, continue
  • the conflict park, :394-406 — the same, with a different sentence

The red-CI path at :355-368 does add FAILED, which is why that one is
reported correctly. The two that do not are the two that mean a person must act.

3. working is the residual bucket (:1121):

const working = openNow.filter((i) => !parked.includes(i) && !finished.includes(i));

Anything left over is announced as "being built". A proposal: ticket and a
cross-repository report are both left over, so both were announced as being
built. Nothing is building either, and nothing will.

What to change

  1. Widen mine. The digest should report the lane, not the autopilot's own
    filings: include an open ticket carrying autonomous or ship whoever filed
    it. Keep the existing QA / RETRO exclusions if they still earn their place.
  2. Label the two silent refusals. Give the fence refusal and the conflict park
    a label the digest reads — agent:failed is the existing one and its comment
    already says what to do — or add a distinct state if "failed" reads wrong for
    "finished, but you must land it". Either way the invariant is: no path may
    leave a ticket needing a person without a label that says so.
  3. Make working a positive test, not a residual. In progress means
    agent:running or agent:refining/agent:refined — not "none of the above".
    Anything matching nothing belongs in a fourth line, or in none.
  4. Say when a bucket is empty because nothing matched. none on the stuck
    line should be trustworthy; today it is also what a filter that cannot see the
    ticket prints.

Why this is worth its own ticket

The three gates in docs/direction.md that make an unattended lane safe are all
about not shipping the wrong thing. This is the other half: the lane's only way
of telling a maintainer that it needs them. #214 is a finished feature — a buoy
you can walk up to and be told what it is — that has been sitting unmentioned for
three days because the one report that would have named it filters on a label it
does not carry.

tools/autopilot.ts only. The unattended lane may build this and may not merge
it; it lands for review.

Filed by the 7-day retrospective on #269.

The daily note on #257 exists because "silence is ambiguous — a loop with nothing to do and a loop that stopped look the same from outside". Its most important line is **Stuck, waiting for you**. On 2026-09-02 that line read `none`, and three tickets were waiting for a person. ## What the digest said, and what was true The note posted at 2026-09-02T00:24: ``` - Being built: #221, #220 - Finished, shipping when CI passes: #237, #219 - Stuck, waiting for you: none ``` Against the board at that moment: | ticket | actually | digest said | |---|---|---| | #213 | `agent:needs-input` since 2026-08-30 — it asked questions and nobody is watching | **not mentioned at all** | | #214 | finished work, conflict-parked since 2026-08-30 with "rebase … and put the `ship` label back" | **not mentioned at all** | | #237 | explicitly refused: "it touches something the unattended lane may not change" — it will never ship | "Finished, **shipping when CI passes**" | | #219 | genuinely finished and waiting on the ship setting | correct | | #220 | a report about a fix in another repository; nothing will ever build it | "**Being built**" | | #221 | a `proposal:` ticket, deliberately not `autonomous` | "**Being built**" | So the one line whose job is to name what needs a person named nothing, on a day when two tickets had been waiting three days. ## Three causes, all in `digest()` **1. `mine` only sees tickets the autopilot filed itself** (`tools/autopilot.ts:1108`): ```ts const mine = all.filter((i: any) => labelsOf(i).includes(FILED_BY_AUTOPILOT)); ``` `FILED_BY_AUTOPILOT` is the `autopilot` label (`:75`). A ticket **promoted** by a retrospective carries `qa-gap` + `autonomous` + `ship` and not `autopilot`, so it is invisible to every bucket. Promotion is the one path that deliberately puts work into the lane that the autopilot did not file — and it is exactly the path the digest cannot see. #213 and #214 are the two instances; the 7-day retrospective has just added three more (#231, #233, #267). **2. A refusal adds no label, so `parked` cannot find it** (`:1116`): ```ts const parked = openNow.filter((i) => names.includes(FAILED) || names.includes(NEEDS_INPUT)); ``` Both refusal paths drop `ship` and add nothing: - the fence refusal, `:307-318` — `DELETE .../labels/ship`, comment, `continue` - the conflict park, `:394-406` — the same, with a different sentence The red-CI path at `:355-368` does add `FAILED`, which is why that one is reported correctly. The two that do not are the two that mean *a person must act*. **3. `working` is the residual bucket** (`:1121`): ```ts const working = openNow.filter((i) => !parked.includes(i) && !finished.includes(i)); ``` Anything left over is announced as "being built". A `proposal:` ticket and a cross-repository report are both left over, so both were announced as being built. Nothing is building either, and nothing will. ## What to change 1. **Widen `mine`.** The digest should report the lane, not the autopilot's own filings: include an open ticket carrying `autonomous` or `ship` whoever filed it. Keep the existing `QA` / `RETRO` exclusions if they still earn their place. 2. **Label the two silent refusals.** Give the fence refusal and the conflict park a label the digest reads — `agent:failed` is the existing one and its comment already says what to do — or add a distinct state if "failed" reads wrong for "finished, but you must land it". Either way the invariant is: *no path may leave a ticket needing a person without a label that says so.* 3. **Make `working` a positive test, not a residual.** In progress means `agent:running` or `agent:refining`/`agent:refined` — not "none of the above". Anything matching nothing belongs in a fourth line, or in none. 4. **Say when a bucket is empty because nothing matched.** `none` on the stuck line should be trustworthy; today it is also what a filter that cannot see the ticket prints. ## Why this is worth its own ticket The three gates in `docs/direction.md` that make an unattended lane safe are all about not shipping the wrong thing. This is the other half: the lane's only way of telling a maintainer that it needs them. #214 is a finished feature — a buoy you can walk up to and be told what it is — that has been sitting unmentioned for three days because the one report that would have named it filters on a label it does not carry. `tools/autopilot.ts` only. The unattended lane may build this and may not merge it; it lands for review. <sub>Filed by the 7-day retrospective on #269.</sub>
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jeroen/cartopolis#270
No description provided.