Skip to content

feat(loop): free a retry ceiling that was spent on silence - #112

Merged
gHashTag merged 1 commit into
feat/queen-supervisorfrom
feat/loop-unpark
Sep 4, 2026
Merged

gHashTag merged 1 commit into
feat/queen-supervisorfrom
feat/loop-unpark

Conversation

@gHashTag

@gHashTag gHashTag commented Sep 4, 2026

Copy link
Copy Markdown
Owner

The swarm ran one bee of four. This is why, and what it took to get to three.

Nine issues parked, and not one of them on the work

The tick's own skip summary said claimed: 11, and nine of those were dispatches at or over QueenRetryPolicy.maximumRealAttempts = 2 — the oldest idle 52 hours. Meanwhile author.mjs found fourteen real deficits and could file against none of them, because every one already had an issue: one of the parked ones. Work existed and was locked by the thing that recorded its failure.

Then the review notes, read together:

issue verdict omission
browseros-ai#1133 4 criteria still unmet omitted 4 verdict lines
browseros-ai#1175 4 criteria still unmet omitted 4 verdict lines
browseros-ai#1316 3 criteria still unmet omitted 3 verdict lines
browseros-ai#1318 4 criteria still unmet omitted 4 verdict lines
browseros-ai#1311 5 criteria still unmet omitted 5 verdict lines

The unmet count is the omitted count. Those criteria were not judged and found wanting — they were never judged at all. The reviewer marks a criterion unmet when the worker's ## VERDICT block has no line for it. That is the right default (silence must never read as success) and it is a different fact from a criterion that was tested and failed.

So the whole retry budget was spent on the shape of a report.

What unpark.mjs claims, and what it refuses to

maximumRealAttempts counts real attempts. An attempt that returned no verdict on a criterion did not attempt that criterion.

It releases only those, and the test is deliberately strict — every unmet criterion must be accounted for by an omitted line:

FREE  #1175   escalate  sb=2   40.9 h  all 4 unmet criteria accounted for by 4 missing verdict line(s)
FREE  #1311   sendBack  sb=2   40.4 h  all 5 unmet criteria accounted for by 5 missing verdict line(s)
FREE  #1133   escalate  sb=2   39.6 h  all 4 unmet criteria accounted for by 4 missing verdict line(s)
keep  #1291   escalate  sb=2   39.3 h  6 unmet against 5 omitted - at least 1 criterion was tested and failed
keep  #1328   sendBack  sb=2    4.1 h  the review names no omitted verdict lines
keep  #1329   sendBack  sb=2      1 h  the review names no omitted verdict lines
keep  #1350   sendBack  sb=2    4.1 h  the review names no omitted verdict lines

Three released, four kept. It also refuses anything whose issue body asks for a person, on the same grounds as stale-escalations.mjs.

A filter of mine that could delete the answer it was filtering

clean() stripped railway's chatter by dropping any line containing Migrate, Existing, Using SSH or railway.json. A single-line JSON answer carrying a review note that mentioned migration was deleted in full, and the caller reported "unparseable answer" about a query that had worked perfectly.

Patterns are now anchored to the start of the line, and a line beginning with [ or { is never dropped. A noise filter that can eat evidence is worse than no filter: it turns a working system into an unexplainable one, and it fails silently by construction.

Result

0 → 3 bees. The fourth slot is held by a genuine fileConflict — two of the four issues I filed name the same file, which is an authoring mistake and not a defect. To fill N slots you need N issues with disjoint boundaries.

The skill gains what the night measured

  • an escalation is a claim about a cause, and a cause can be measured again — unlike a wait, whose input can never change
  • two gates before retiring one, and the near miss that built the second
  • ask the shipping parser, never a copy
  • what a judging pass actually found: 187 criteria, 0 fabricated by any worker, and 6 of my own 7 accusations refuted on adversarial review

The swarm ran ONE bee of four. The tick's own skip summary said claimed=11, and
nine of those were dispatches at or over QueenRetryPolicy.maximumRealAttempts.
Meanwhile author.mjs found fourteen real deficits and could file against none of
them, because every one already had an issue - one of the parked ones. Work
existed and was locked.

Then the review notes read together:

  browseros-ai#1133  4 criterion(s) still unmet   'omitted 4 verdict lines'
  browseros-ai#1175  4 criterion(s) still unmet   'omitted 4 verdict lines'
  browseros-ai#1316  3 criterion(s) still unmet   'omitted 3 verdict lines'
  browseros-ai#1318  4 criterion(s) still unmet   'omitted 4 verdict lines'

The unmet count IS the omitted count. Those criteria were not judged and found
wanting - they were never judged at all. The reviewer marks a criterion unmet
when the worker's VERDICT block has no line for it, which is the right default
and is a different fact from a criterion that was tested and failed. So the
ceiling was reached without the work ever being assessed.

maximumRealAttempts counts REAL attempts. An attempt that returned no verdict on
a criterion did not attempt that criterion. unpark.mjs releases only those, only
when the reviewer's own words say so, and only when the issue does not ask for a
person. Every criterion must be accounted for by an omission: browseros-ai#1291 has 6 unmet
against 5 omitted, so at least one WAS tested, and it keeps its ceiling. Three
released, three kept, and browseros-ai#1328/browseros-ai#1329/browseros-ai#1350 carry no omission at all.

Also fixes a filter of mine that could delete the answer it was filtering.
clean() dropped any line CONTAINING 'Migrate', 'Existing', 'Using SSH' or
'railway.json'. A single-line JSON answer carrying a review note that mentioned
migration was deleted in full, and the caller reported 'unparseable answer'
about a query that had worked perfectly. Patterns are now anchored, and a line
beginning with [ or { is never dropped. A noise filter that can eat evidence
turns a working system into an unexplainable one.

The skill gains what this night measured: an escalation is a claim about a cause
and a cause can be measured again; two gates before retiring one; ask the
shipping parser and never a copy; and what a judging pass actually found -
187 criteria, 0 fabricated by any worker, 6 of 7 of my own accusations refuted.
@gHashTag
gHashTag merged commit 1c97f66 into feat/queen-supervisor Sep 4, 2026
2 of 3 checks passed
@gHashTag
gHashTag deleted the feat/loop-unpark branch September 4, 2026 10:16
@gHashTag
gHashTag restored the feat/loop-unpark branch September 28, 2026 11:04
@gHashTag
gHashTag deleted the feat/loop-unpark branch October 8, 2026 18:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant