Skip to content

With agents of one model, the user is the second opinion: on shared knowledge, and on what no C makes - #181

Open
silvervest wants to merge 4 commits into
n-delic:mainfrom
silvervest:feat/one-model-user-verdicts
Open

silvervest wants to merge 4 commits into
n-delic:mainfrom
silvervest:feat/one-model-user-verdicts

Conversation

@silvervest

@silvervest silvervest commented Nov 2, 2026 •

Copy link
Copy Markdown

Merge order: any time: independent of the other PRs of this set (#178-#185).

New feature.

Two rules ask agents of two models to agree, so one model's blind spot isn't taken for proof: shared knowledge, and the verdict that no C makes a function. Agents of one model never get there, and nothing told the user it was theirs to settle.

  • Knowledge: on an x86 game worked by one model only, 55 proposals waited for a second model that never came, and every session found the same things out again. The knowledge panel now offers Give it to agents and Reject on proposals with one backer too. decide() already took any proposal; its docstring, the reply to a proposal and the prompt's heading ("or checked by the user") now say so.
  • No C makes it: on the Xbox demo, whose last open function is its hand-written _ftol2, two agents of one model claimed it a dozen times between them, each time writing the same note, then failed session after session until the five-failure pause. The claim order now skips a function the agent itself said no C makes (another model's agent can still take it), and nothing_to_claim says which ones wait on that verdict. When every open function does, the agent is told to stop, the user gets one notification per function (set it aside in its panel, or let another model look), and a helper with nothing else stops before starting a session, saying so.

Tests: test_the_user_can_be_the_second_opinion (tests/test_knowledge.py), test_an_agent_isnt_handed_back_what_it_said_no_c_makes_and_the_user_hears_when_only_that_is_left (tests/test_claims.py), test_a_helper_stops_when_all_that_is_open_is_what_it_said_no_c_makes (tests/test_agents.py). ruff is clean.

🤖 Generated with Claude Code

@github-actions github-actions Bot added the enhancement New feature or request label Nov 2, 2026
Nick Silvestro added 4 commits November 6, 2026 21:33
Shared knowledge counts once two different models back a proposal. On an x86 game worked by one model only, 55
proposals waited for a second model that never came (54 had a single backer), and every session found the same
things out again. The panel now offers "Give it to agents" and "Reject" on those proposals too: the user is the
second opinion. decide() already took any proposal; its docstring, the reply to a proposal and the prompt's
heading ("or checked by the user") now say so.
…r hears when only those are left

A verdict that no C makes a function sets it aside once NOT_C_AGENTS agents of NOT_C_MODELS models agree; agents of
one model never get there. On an x86 demo whose last function was a hand-written float-to-int helper, two agents
of one model claimed it a dozen times between them, each time writing the same note: once an agent's run started
again, its own recent release no longer kept it off.

The claim order now skips a function the agent itself said no C makes (another model's agent can still take it),
and nothing_to_claim says which ones are waiting on that verdict. When every open function is, the agent is told
to stop, and the user gets one notification per function: set it aside in its panel, or let another model look.
The claim order never hands those back to it, so every session could only find nothing to do: they failed one
after another into a pause after five. Now the helper stops before a session starts and says what the user can do
(set them aside, or start a helper of another model). Another helper, which hasn't said so, works on.
…stop

"Stop working on this project" went to any agent that found nothing to claim while every open function had a no-C
verdict from anyone: an agent of another model, out of claims only because it had released them for now, quit
though its verdict was the one they waited for. It's said only when every open function has the agent's own
verdict. Tested with an agent of another model that released the function.
@silvervest
silvervest force-pushed the feat/one-model-user-verdicts branch from ab9728c to 58763e5 Compare November 6, 2026 10:55
@silvervest

Copy link
Copy Markdown
Author

Rebased onto main, with one new commit from my own review: "Only an agent whose own verdict is on every open function is told to stop". "Stop working on this project" went to any agent that found nothing to claim while every open function had a no-C verdict from anyone. That included an agent of another model that had only released them for now, so the agent whose verdict could set them aside quit. It's now said only when every open function has the agent's own verdict. The test adds that case, and it fails on the previous head.

@RetroGameDeveloper

Copy link
Copy Markdown

I reviewed head 58763e5dcf0ab7523e65d0fc2658cd1a7ce09e64. I'd request one fix before merging:

[P2] The new verdict handling doesn't reach room guests. The host's /collab/claim handler calls claim_row() directly. When the new filter excludes a function the guest already ruled out, it returns None without calling nothing_to_claim(). This bypasses both the verdict explanation and the user notification.

New handling being bypassed: https://github.com/silvervest/decompdecomp/blob/58763e5dcf0ab7523e65d0fc2658cd1a7ce09e64/src/decompnet/network.py#L638

I reproduced this with separate host/guest databases and a stand-in room link that delegates to the host's claim_row(), matching the current room handler:

  • The last function remains open with the guest's no-C verdict.
  • The guest receives “Nothing left to claim in this room — every open function is matched or someone is on it. 🎉”
  • The host records no verdict notification.

The room protocol should carry the host's verdict-aware response, with a regression test. Both the ROM room path (engine/judging.py) and project room path (forkengine.py) currently turn the empty claim into the generic response. This falls under the repository's requirement that features reach rooms.

Otherwise, the knowledge controls and local claim handling look sound. All six CI checks pass; locally, 83 focused tests passed, and lint passed. The PR merges cleanly.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants