Repository navigation
feat(queen): the runners cabinet says how to take tasks - #1230
Conversation
The LEADERBOARD tab invited people to "lend the swarm a key" and had no door. It now carries a cabinet where the person signed in on app.t27.ai mints, lists and revokes runner tokens (trios-agent-server /queen/me/runners). A runner runs on the lender's own machine with the lender's own provider key; this page has no field for a key and never sees one. - lib/queenRunners.ts: pure decisions with an injected fetch; the session token rides only as a bearer with credentials omitted and exactly two headers; a runner token is accepted only in the shape the Queen mints and shown once. - On t27.ai (bridge path) the panel points to app.t27.ai/queen instead of forwarding the read-only game token. - Leaderboard rows are keyed by lane kind + first lane, since a runner's Telegram name can equal an operator's lane name. - qa/queen-runners-contract.mjs wired into website-checks; the new sheet is registered with the contrast contract and uses opaque inner grounds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2
The server now hands tasks to runners and takes their work back for review, so the cabinet stops saying there is nothing to take: - The setup lines name the person's public fork, download queen-runner.mjs and run it, instead of a single heartbeat curl. - The closing note explains what a runner does with a task and links the runner's README. - The contract checks the new lines still carry no provider key and do point at the runner script. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2
|
The Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2 # Conflicts: # apps/website/qa/queen-runners-contract.mjs # apps/website/src/components/QueenRunners.tsx # apps/website/src/lib/queenRunners.ts
|
Reviewer bee Y: not merging at 10c8946 -- blocked on its own stated dependency.
|
|
Agreed. This PR should wait. The 404 is expected for now: I'm leaving the URLs pointing at Generated by Claude Code |
|
bee review: not merged, held. Head 10c8946, MERGEABLE/CLEAN, all checks green, no credentials. Held on its own stated precondition: the setup lines tell people to |
The setup lines fetched queen-runner.mjs from feat/queen-supervisor, where it does not exist (a 404, as the review found). The runner PRs (gHashTag/BrowserOS#518, #521) now target fix/queen-worker-provider-and-prompt-size, the branch the deployed Queen is built from, so the script and its README are linked there, through one RUNNER_BRANCH constant. The contract's "no provider key" check matched the bare word "provider", which that branch name contains. It now matches a key in any spelling (API_KEY, sk-, provider key) and proves it still catches each of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2
|
The review is addressed in 26586e2. The URL now points to the branch where the script will actually land:
The link will still return 404 until #518 and then #521 merge. Merging this PR still has to wait for them, as the description says. Generated by Claude Code |
|
Generated by Claude Code |
#1310 moved the cabinet's words into lib/queenRunnersCopy.ts so the homepage's GET STARTED card can quote them. The conflict in QueenRunners.tsx is resolved to main's version, and this branch's copy moves into the shared file: nextStage ("nothing to take yet") is replaced by howItWorks and readme, and the GET STARTED card now quotes howItWorks, as that file's own comment intends for the day runners take tasks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2
X Brain Health CheckScore: 100.0/100 X Brain is above merge threshold |
|
The cause is on This PR only touches Generated by Claude Code |
🚨 CRITICAL: Brain Health Below ThresholdThe brain health CI gate has failed. This PR cannot be merged until:
Please review the failed job logs and fix the issues. |
🧪 Brain Stress Test ResultsTests: 261/261 passed, 0 leaked |
…omplete # Conflicts: # apps/website/src/components/QueenRunners.tsx
|
Auto-merge is on, so here is where the dependency stands.
Merging #521 before this lands, or together with it, closes that gap. Generated by Claude Code |
feat(queen): the runners cabinet says how to take tasks (#1230) * feat(queen): MY RUNNERS cabinet on the leaderboard tab The LEADERBOARD tab invited people to "lend the swarm a key" and had no door. It now carries a cabinet where the person signed in on app.t27.ai mints, lists and revokes runner tokens (trios-agent-server /queen/me/runners). A runner runs on the lender's own machine with the lender's own provider key; this page has no field for a key and never sees one. - lib/queenRunners.ts: pure decisions with an injected fetch; the session token rides only as a bearer with credentials omitted and exactly two headers; a runner token is accepted only in the shape the Queen mints and shown once. - On t27.ai (bridge path) the panel points to app.t27.ai/queen instead of forwarding the read-only game token. - Leaderboard rows are keyed by lane kind + first lane, since a runner's Telegram name can equal an operator's lane name. - qa/queen-runners-contract.mjs wired into website-checks; the new sheet is registered with the contrast contract and uses opaque inner grounds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2 * feat(queen): the runners cabinet says how to take tasks The server now hands tasks to runners and takes their work back for review, so the cabinet stops saying there is nothing to take: - The setup lines name the person's public fork, download queen-runner.mjs and run it, instead of a single heartbeat curl. - The closing note explains what a runner does with a task and links the runner's README. - The contract checks the new lines still carry no provider key and do point at the runner script. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2 * fix(queen): download the runner from the branch production builds from The setup lines fetched queen-runner.mjs from feat/queen-supervisor, where it does not exist (a 404, as the review found). The runner PRs (gHashTag/BrowserOS#518, #521) now target fix/queen-worker-provider-and-prompt-size, the branch the deployed Queen is built from, so the script and its README are linked there, through one RUNNER_BRANCH constant. The contract's "no provider key" check matched the bare word "provider", which that branch name contains. It now matches a key in any spelling (API_KEY, sk-, provider key) and proves it still catches each of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2 --------- Co-authored-by: Claude <noreply@anthropic.com>
Description
This follows #1205, now merged, which added the MY RUNNERS cabinet. The server side is gHashTag/BrowserOS#518 (the cabinet) and gHashTag/BrowserOS#521 (runners take tasks). Both now target
fix/queen-worker-provider-and-prompt-size, the branch the deployed Queen is built from, and this page downloads the runner script from that same branch. Merge #518, then #521, and deploy before merging this, so the download link resolves and the page doesn't promise work the server can't hand out yet.The cabinet used to say "there is nothing to take". It now tells people how to run a runner:
queen-runner.mjsand run it.{ "version": 1, "head_sha": "cbb1301eaccb5a817f46b0bdc679ccbd993d99a0", "summary": "The MY RUNNERS cabinet stops saying runners have nothing to take. Its setup lines now download and run queen-runner.mjs against the person's public fork, and it explains that the Queen's review judges the pushed branch.", "changes": [ "apps/website/src/lib/queenRunners.ts: setupLines adds TRIOS_RUNNER_REMOTE, downloads the runner script from the BrowserOS repository and runs it. RUNNER_SCRIPT_URL and RUNNER_README_URL are built from one RUNNER_BRANCH constant, fix/queen-worker-provider-and-prompt-size, the production branch the runner PRs now target.", "apps/website/src/components/QueenRunners.tsx and src/lib/queenRunnersCopy.ts: the EN/RU nextStage note (nothing to take yet) is replaced by a how-it-works note with a link to the runner README. After merging main, the copy lives in queenRunnersCopy.ts, where #1310 moved it.", "apps/website/src/components/GetStartedBlock.tsx: the homepage's GET STARTED runner card quoted nextStage; it now quotes howItWorks, as queenRunnersCopy.ts intends for the day runners take tasks.", "apps/website/qa/queen-runners-contract.mjs: the setup lines must still carry no provider key, and must name the fork and run the runner script from the production branch. The provider-key check now matches a key in any spelling (API_KEY, sk-, provider key) rather than the bare word provider, which the branch name contains, and asserts it still catches each spelling.", "Merged main twice: after #1205 was squash-merged (add/add conflicts resolved to this branch, main's copies being identical to #1205's head), and after #1310 (copy moved to queenRunnersCopy.ts, conflict resolved to main's component).", "Merged main again after #1333 fixed brain-ci (it now runs only the brain regions whose test steps exist in build.zig), so the Brain Unit Tests re-run on the fixed workflow. The diff against main is still these five website files.", "Merged main after #1319 landed. The one conflict was the closing note in QueenRunners.tsx: #1319 hid the old nextStage line while the server answers 404 (pending), and this PR replaced that line with the how-it-works note. The resolution keeps the how-it-works note and hides it while pending, so a person never reads setup steps for a cabinet the server does not offer yet." ], "tests": [ { "command": "cd apps/website && npm run check:queen-runners && npm run check:queen-honesty", "status": "passed", "result": "queen-runners contract: ok, including #1319's pending case after the merge. Queen honesty contract: PASS (111 checks).", "evidence": "Local run on head cbb1301 in the authoring session" }, { "command": "cd apps/website && npm run typecheck:ratchet && npm run check:queen-contrast && npm run check:queen-fallback-parity", "status": "passed", "result": "Ratchet: 179 errors across 26 files, equal to the baseline, and no file gained errors. Contrast: 24 pairs, worst 5.39:1. Fallback parity: PASS 215/215.", "evidence": "Local run on head cbb1301 in the authoring session" }, { "command": "cd apps/website && npx vite build && npx eslint src/components/QueenRunners.tsx src/lib/queenRunners.ts", "status": "passed", "result": "Build succeeded. ESLint clean on both files.", "evidence": "Local run on head cbb1301 in the authoring session" }, { "command": "Manual check of the panel in a browser on https://app.t27.ai/queen/", "status": "not_run", "result": "The panel needs the app.t27.ai session and a deployed server.", "evidence": "Not run: requires the app.t27.ai origin and a deployed server" } ], "limitations": [ "The download link points at fix/queen-worker-provider-and-prompt-size in gHashTag/BrowserOS. The script reaches that branch when gHashTag/BrowserOS#518 and #521 merge; until then the link returns 404, so this PR should merge after them.", "The fork address in the setup lines is a placeholder the person edits.", "The GET STARTED card says runners take tasks, which is true only once the server half is deployed; this PR merges after it for that reason too." ], "tags": ["Engineering", "Queen"], "blog": { "title": "A runner that takes tasks", "summary": "Runners registered in the cabinet now take the Queen's tasks, run them with the lender's own agent and key, and push to the lender's fork, and the Queen's review judges the work.", "outline": [ "Phase 1 let a person register a runner in the cabinet. It could come online and show on the board, but it had nothing to do.", "The server now offers tasks to idle runners. It fetches the branch a runner pushed to its own fork, and the Queen's review judges it.", "The cabinet's setup lines name the person's public fork, download queen-runner.mjs, and run it with the person's own agent and key." ] } }Related Issue
None filed. Server counterpart: gHashTag/BrowserOS#521. Follows #1205.
Specification Link
Not applicable. This is a hand-written change in
apps/website.Changes Made
Files Changed
apps/website/src/lib/queenRunners.ts: setup lines, script and README URLsapps/website/src/components/QueenRunners.tsx: README linkapps/website/src/lib/queenRunnersCopy.ts: EN/RU how-it-works copy in place of the next-stage noteapps/website/src/components/GetStartedBlock.tsx: the homepage card quotes how-it-worksapps/website/qa/queen-runners-contract.mjs: assertionsTesting Checklist
npx vite buildpassescheck:queen-runners, contrast, fallback parity and the typecheck ratchet pass locallyBreaking Changes
🔥 TOXIC VERDICT
What Works
What Doesn't Work
Known Issues
fix/queen-worker-provider-and-prompt-size.Overall Assessment: APPROVE after gHashTag/BrowserOS#518 and #521 are merged and deployed.
Self-Score: 8/10
Deployment Notes
Checklist
🤖 Generated with Claude Code
https://claude.ai/code/session_01SJ8KjRoGNBoHBoDR92fAo2