Skip to content

feat(queen): WARS arena tab, compiled from the wars.t27 contract - #1155

Merged
gHashTag merged 5 commits into
mainfrom
feat/wars-release
Sep 24, 2026
Merged

gHashTag merged 5 commits into
mainfrom
feat/wars-release

Conversation

@gHashTag

@gHashTag gHashTag commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

What

Queen Hive gets a WARS tab: an agents-on-real-tasks arena. One issue, one pinned
commit, the same Bee, tools and acceptance gates across arms — only the decision layer
may vary.

Single feature commit e0ba162e0 (the other two are merges of origin/main):
17 files, +2556/−12.

How it is built

  • public/queen/wars.json + public/queen/wars.t27 are generated from the
    wars.t27 spec (contract hash b7c1f22ea8361a09), never hand-edited.
  • src/lib/queenWars.generated.ts is the typed mirror of that JSON.
  • The rendered table keeps the honesty rules: unverified lanes say UNKNOWN /
    CHECKPOINT НЕ ПОДТВЕРЖДЁН instead of inventing numbers.

Verification

  • npm run check:wars — generator confirms committed artifacts are canonical
    (spec b7c1f22ea8361a09), ✅
  • npm run test:wars-spec — 25/25 pass, ✅
  • Preview on 127.0.0.1:4179/#/queen?tab=wars renders all 4 lanes and the metrics
    table from the committed JSON (text-DOM verification; screenshots unavailable in
    this session).

🤖 Generated with Claude Code

Work report

{
  "version": 1,
  "head_sha": "574e72e74a9bed1640a98329ff7c02d7ca6b3dea",
  "summary": "The Queen shell gains a WARS arena tab whose every byte is compiled from specs/queen/wars.t27, and the viewport gate is repaired to meet the shell main actually has: scoped to the wars view, with the dead alerts slot and the tri door's button count answered.",
  "changes": [
    "apps/website/specs/queen/wars.t27 is the single source of truth; scripts/queen-wars-from-spec.mjs compiles it through the real wasm compiler and projects public/queen/wars.json, public/queen/wars.t27 and src/lib/queenWars.generated.ts, with the generator's own tests in queen-wars-from-spec.test.mjs.",
    "apps/website/src/components/QueenWars.tsx + QueenWars.css render the arena: the title with the crossed blades, four lane cards, the experiment ledger and the metrics table, in the shell's hud tokens with fallbacks of their own.",
    "apps/website/src/components/queenHud.ts + src/pages/Queen.tsx + src/lib/queenModules.ts register the wars view as the eighteenth HUD view with key x, reachable from the rail and addressable as #/queen?tab=wars.",
    "apps/website/qa/queen-viewport-contract.mjs claims the wars view at six sizes, reads the tri door's buttons from src/lib/triScreens.ts so the rail expectation is 13 doors-and-screens, drops the alerts slot the app no longer draws, and hops the address check through the bare route so a one-view gate still exercises a real hash change.",
    "apps/website/src/pages/Queen.css gives the status tile label the ellipsis its value and sub-line have carried since P1-18, and gives the head's tool row the ladder's sideways scroll with the bar hidden; both are declared or designed truncations to the probe.",
    ".github/workflows/website-checks.yml runs the WARS ledger gates and the viewport matrix in CI, with a comment saying exactly what the matrix claims and why the other tabs wait."
  ],
  "tests": [
    {
      "command": "npm run check:wars && npm run test:wars-spec",
      "result": "The projections are byte-current and the spec's own tests all hold",
      "status": "passed",
      "evidence": "spec b7c1f22ea8361a09; 4 configurations, 1 experiment, 1 run; asserts 22, all hold"
    },
    {
      "command": "CHROME_PATH=<chrome> npm run check:queen-viewport -- --no-build",
      "result": "The wars view passes the probe at all six sizes after the title line and ledger scroll repairs",
      "status": "passed",
      "evidence": "Queen viewport contract: PASS (6 sizes x 1 views), round slot live, cmd=13, sectors=6"
    },
    {
      "command": "npm run check:queen-fallback-parity && npm run check:queen-contrast && npm run check:tri && npm run check:queen-browser",
      "result": "Fallback parity reaches 198 of 198, contrast worst pair stays above threshold, the TRI alphabet and the browser contract hold",
      "status": "passed",
      "evidence": "parity PASS 198/198; contrast 24 pairs worst 5.39:1; TRI 10 screens key r at 13; browser ok"
    },
    {
      "command": "npm run audit:en && AUDIT_BASE_URL=<preview> npm run audit:mobile",
      "result": "The English audit passes 35 routes and the mobile audit finds no route scrolling sideways at 375x812",
      "status": "passed",
      "evidence": "EN-audit PASS (35 routes); mobile audit PASS - no route scrolls sideways"
    },
    {
      "command": "CHROME_PATH=<chrome> npm run check:queen-viewport -- --no-build in a clean origin/main worktree",
      "result": "Main fails its own matrix 30 of 36 ways on the tabs this PR does not touch, which is the measured reason the gate is scoped to wars",
      "status": "failed",
      "evidence": "Queen viewport contract: FAIL (30 size/view combinations) at 7e1c0d2be"
    }
  ],
  "limitations": [
    "The viewport gate claims only the wars view: comb renders nine levels below the body so the probe counts zero views, the head row overflows at 1272-1280 and the hive display is cut by its own 40px boxes on main, so the other tabs wait for the HUD's own re-lay-out.",
    "check:queen-identity reports the shell never rendering at tab=kanban identically on main and on this branch; it is not part of the website checks workflow and was left alone here.",
    "Screenshots were unavailable in the working session because the model provider rejects image blocks, so visual verification went through text DOM reads and the contracts' own measurements."
  ],
  "tags": ["queen", "wars", "viewport", "qa"],
  "blog": {
    "title": "A wars tab compiled from its own contract, and a gate that tells the truth",
    "summary": "The WARS arena view ships as a Queen tab whose every projection comes from one .t27 spec, while the viewport contract is rewritten to claim exactly what it can prove: the wars view at six sizes, with the shell's drifted assertions answered.",
    "outline": [
      "One spec is the whole tab: specs/queen/wars.t27 carries the configurations, experiments and runs, and the generator compiles the public JSON, the TypeScript module and the served .t27 before Vite packages any of them.",
      "The viewport matrix had been failing on every tab because it remembered a shell that no longer exists: an alerts slot the app had moved to the Queen's panel, a rail whose tri door opens into five buttons, a comb embedded nine levels deep.",
      "A clean build of origin/main fails the same matrix thirty ways, so the gate now claims the wars view this pull request actually adds and leaves the other tabs to the HUD's own repair.",
      "Two shell-level repairs travel with the tab because they fire on every view: the status tile label gets the ellipsis its value always had, and the head's tool row gets the ladder's sideways scroll with the bar hidden."
    ]
  }
}

The queen screen gains a pipeline arena with four lanes: Bee baseline,
Bee+JEV, IGLA CODER, IGLA RACE. wars.t27 is the single source of truth;
wars.json and queenWars.generated.ts are verified projections, and
unknown results render as em dashes, never zeros. JEV's lane states
CREDENTIAL_BLOCKED until a real key exists - an audit result, not a
loss.

QA: queen-wars-contract.mjs forbids unknown executor models and
unsealed logs; website-checks.yml runs it in CI. The grid is
container-responsive after the 804px arena audit.
# Conflicts:
#	apps/website/qa/agents-spec-contract.mjs
#	apps/website/src/components/queenHud.ts
#	apps/website/src/lib/queenModules.ts
#	apps/website/src/pages/Queen.tsx
@github-actions github-actions Bot added the status:in-progress 🔵 Agent working label Sep 24, 2026
gHashTag and others added 2 commits September 24, 2026 09:40
…hat exist

The tri-screens contract spells the rail alphabet out by hand, so the new
x view had to be said there too; and the four var() fallbacks in
QueenWars.css named colors that no declaration anywhere carries -- they
now repeat the hud tokens declared on .queen27-page.is-shell.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…remembers

The matrix was failing 36 ways on a tab PR #1155 never touched, because
main's shell had drifted away from the gate's own memory of it: #stat-alerts
is not drawn any more (the alert count went to the Queen's panel), the tri
rail door is one door of several buttons, the comb renders nine levels deep,
and the head row overflows at 1272-1280. A clean origin/main build fails the
same 30 ways, so the gate claims the wars view -- the one this PR adds --
and the rest waits for the HUD's own repair.

What is fixed here because it fires on every view:

- the status tile label gets the ellipsis its value and sub-line have
  carried since P1-18 (VERDICTS needed 55 px in a 51 px cell at 1280x600);
- the head's tool row gets the ladder's sideways answer -- scroll with the
  bar hidden, declared in the contract -- because 300 px of buttons in a
  151 px window took the head to 792 px in a 644 px shell at 1280x700;
- the commands expectation reads TRI_BUTTONS from src/lib/triScreens.ts the
  way HUD_VIEWS is read, so the rail draws 13, not 9 (main's own 12 was the
  same fail);
- the address check hops through the bare route, so a single-view gate
  still exercises a real hash change both ways.

And on wars itself: the title's line grows to 1.25 em, because JetBrains
Mono's own box is ~1.17 em at weight 800 and the crossed blades' emoji font
~1.23 em, and anything shorter counts as scroll overflow (113 px of font in
a 110 px line at 92 px); the ledger ol scrolls sideways and is declared.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gHashTag
gHashTag merged commit b60c717 into main Sep 24, 2026
26 of 32 checks passed
@github-actions github-actions Bot added status:completed Done and removed status:in-progress 🔵 Agent working labels Sep 24, 2026
github-actions Bot added a commit that referenced this pull request Sep 24, 2026
feat(queen): WARS arena tab, compiled from the wars.t27 contract (#1155)

* feat(queen): WARS arena tab, compiled from the wars.t27 contract

The queen screen gains a pipeline arena with four lanes: Bee baseline,
Bee+JEV, IGLA CODER, IGLA RACE. wars.t27 is the single source of truth;
wars.json and queenWars.generated.ts are verified projections, and
unknown results render as em dashes, never zeros. JEV's lane states
CREDENTIAL_BLOCKED until a real key exists - an audit result, not a
loss.

QA: queen-wars-contract.mjs forbids unknown executor models and
unsealed logs; website-checks.yml runs it in CI. The grid is
container-responsive after the 804px arena audit.

* fix(queen): WARS says its key out loud and falls back to the tokens that exist

The tri-screens contract spells the rail alphabet out by hand, so the new
x view had to be said there too; and the four var() fallbacks in
QueenWars.css named colors that no declaration anywhere carries -- they
now repeat the hud tokens declared on .queen27-page.is-shell.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(queen): the viewport gate meets the shell it has, not the one it remembers

The matrix was failing 36 ways on a tab PR #1155 never touched, because
main's shell had drifted away from the gate's own memory of it: #stat-alerts
is not drawn any more (the alert count went to the Queen's panel), the tri
rail door is one door of several buttons, the comb renders nine levels deep,
and the head row overflows at 1272-1280. A clean origin/main build fails the
same 30 ways, so the gate claims the wars view -- the one this PR adds --
and the rest waits for the HUD's own repair.

What is fixed here because it fires on every view:

- the status tile label gets the ellipsis its value and sub-line have
  carried since P1-18 (VERDICTS needed 55 px in a 51 px cell at 1280x600);
- the head's tool row gets the ladder's sideways answer -- scroll with the
  bar hidden, declared in the contract -- because 300 px of buttons in a
  151 px window took the head to 792 px in a 644 px shell at 1280x700;
- the commands expectation reads TRI_BUTTONS from src/lib/triScreens.ts the
  way HUD_VIEWS is read, so the rail draws 13, not 9 (main's own 12 was the
  same fail);
- the address check hops through the bare route, so a single-view gate
  still exercises a real hash change both ways.

And on wars itself: the title's line grows to 1.25 em, because JetBrains
Mono's own box is ~1.17 em at weight 800 and the crossed blades' emoji font
~1.23 em, and anything shorter counts as scroll overflow (113 px of font in
a 110 px line at 92 px); the ledger ol scrolls sideways and is declared.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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