Skip to content

fix(board): the verify nudge ignored needs:you, so its own escape did not exit it - #106

Open
Dygreens wants to merge 1 commit into
mainfrom
fix/verify-nudge-respects-needs-you
Open

fix(board): the verify nudge ignored needs:you, so its own escape did not exit it#106
Dygreens wants to merge 1 commit into
mainfrom
fix/verify-nudge-respects-needs-you

Conversation

@Dygreens

Copy link
Copy Markdown
Collaborator

The bug

The verify nudge ends by telling the session how to get out:

Cards that genuinely cannot be verified by you (e.g., they require a human decision or access you lack) should be tagged needs:you so they surface in the owner digest rather than sitting here indefinitely.

Neither done_verify_candidates nor done_card_count ever referenced issue_tags. So the escape it names does not exit it. AEAB-5 was tagged needs:you on 2026-08-14 via amux board needsyou — the sanctioned command, which worked — and the nudge fired on it again today.

Ethos rule 6: walk the documented escape using only the sanctioned tooling; if you cannot, the constraint is theatre. This one is walkable and still does nothing.

It also nags twice. needsyou.renag in this same file already chases the human on these cards every 3d. The verify nudge then asks the agent, who by construction cannot answer — the human owes the decision.

Why this is a missed consumer, not a missing capability

select_pickup in the same file already excludes these correctly, and its comment is explicit that the loops must not disagree:

Same LIKE form as the candidate query below, so the two loops can never disagree about which cards are human-blocked (the py split this fixes).

This is the AC-223 shape one tier down. That card closed the auto-pickup hole and said in its own fix note that the representation question (tag vs status=needsyou) stayed open. Each remaining consumer that reads issues without joining issue_tags is another instance; this is one of them.

The change

Factored the exclusion into needs_human_sql(), sitting next to the existing unverifiable_types_sql(), and applied it to both queries. They must move together — the file's own comment on the counter says that if they diverge, "the prompt states a total its own list cannot account for."

LIKE 'needs:you%' rather than = 'needs:you', matching select_pickup, so a sub-tagged ask (needs:you:decision) does not slip past. That exact split is what leaked in the python advance path.

Firing is unaffected otherwise: the caller already short-circuits on total == 0, so a lane whose only done cards are human-blocked now goes quiet instead of nagging forever.

Test

a_card_tagged_needs_you_is_not_nudged_at_its_agent — five done cards: untagged, needs:you, NEEDS:YOU, needs:you:decision, and an unrelated mobile tag.

It discriminates. Reverted to an empty fragment it fails with:

left:  ["N-1", "N-2", "N-3", "N-4", "N-5"]
right: ["N-1", "N-5"]

The N-1/N-5 control is load-bearing rather than decorative: a predicate matching everything also produces an empty candidate list, and would pass a bare "the tagged card is absent" assertion. That is the unbounded-filter failure this repo has shipped twice.

cargo test --workspace: every one of 37 result lines ok, 0 failed. cargo clippy -p amux-server --lib: clean. (cargo fmt --check reports diffs across ~165 files including ones untouched here; CI does not run it.)

🤖 Generated with Claude Code

https://claude.ai/code/session_01B4vuEScunv4K6RMwQoT9xx

… not exit it (AEAB-9)

The nudge closes with "Cards that genuinely cannot be verified by you ... should
be tagged `needs:you` so they surface in the owner digest rather than sitting
here indefinitely." Neither `done_verify_candidates` nor `done_card_count` ever
touched `issue_tags`, so taking that escape changed nothing. AEAB-5 carried the
tag for two days and was nudged again today.

That is ethos rule 6: walk the documented escape using only the sanctioned
tooling, and if you cannot, the constraint is theatre. Here the sanctioned
tooling was `amux board needsyou`, it worked, and the loop kept running anyway.

It also double-nagged. The `needsyou.renag` job in this same file already chases
the HUMAN on these cards every 3d. Nudging the agent as well asks the one party
who by construction cannot answer.

Not a missing capability — a missed consumer. `select_pickup` already excludes
these correctly, with the same LIKE form, and its comment says the two loops must
never disagree about which cards are human-blocked. This is the AC-223 shape one
tier down: that card closed the auto-pickup hole and noted in its own fix that
the representation question stayed open. Factored the fragment into
`needs_human_sql()` alongside `unverifiable_types_sql()` so the selector and the
counter cannot drift; the file already warns that if they do, the prompt states a
total its own list cannot account for.

`LIKE 'needs:you%'` not `= 'needs:you'`, so a sub-tagged ask (`needs:you:decision`)
does not slip through — the exact split that made the python advance path leak.

The test discriminates: reverted to an empty fragment it fails, listing all three
tagged cards leaking through. Its N-1/N-5 control is load-bearing — a predicate
matching EVERYTHING also yields an empty list and would pass a bare "the tagged
card is absent" assertion, which is the unbounded-filter failure this repo has
shipped twice.

cargo test --workspace: 1011 + 189 + 27 + ... across 37 binaries, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4vuEScunv4K6RMwQoT9xx

Amux-Session: amux-errors-and-bugs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant