The Stale Assertion & The Purge

A phantom 4th argument broke CI, odins-spear tests were purged, and agents learned to trust exit codes instead of parsing ANSI escape sequences like animals.

Act I · Bug Fix

The Phantom Fourth Argument

Odin

main fucked https://github.com/declanshanaghy/fenrir-ledger/actions/runs/23372822777/job/67999868384

CI on main was red. The unit test card-form-card-limit-1416.test.tsx expected canAddCard to be called with four arguments — but the actual call site in useCardForm.ts only passed three. PR #1716 had added an isAnonymous parameter to the test assertion without updating the code. The fourth param had a default value of false, so runtime was fine — but toHaveBeenCalledWith does exact matching.

One line deleted. Four tests green.

-        false,       // isAnonymous=false when status is "authenticated"

Bug Fixed

Test assertion expected 4 args to canAddCard but useCardForm only passes 3. Removed stale 4th isAnonymous arg from assertion.

development/frontend/src/__tests__/components/card-form-card-limit-1416.test.tsx

Act II · Enforcement

The Odins-Spear Purge

Odin

delete all tests in odins spear no tests in odins spear or throne, that's in the rules right?

CI kept failing on odins-spear TypeScript errors — dozens of TS2532: Object is possibly undefined across 18 test files. But the rule was clear: no tests in odins-spear or odins-throne-ui. These tests should never have existed.

Deleted all 18 test files, removed vitest from dependencies, purged vitest.config.ts, stripped test scripts from package.json, and removed __tests__ from tsconfig.json includes.

Then branded both packages with an unmistakable description: TESTS ARE BANNED — DO NOT write tests for this package.

+  "description": "TESTS ARE BANNED — DO NOT write tests for this package. Validate via tsc + build ONLY.",
development/odins-spear/package.json development/odins-spear/tsconfig.json development/odins-throne-ui/package.json

Act III · Maintenance

The Ragnarok Rebase

Odin

rebase 1545 then /dispatch it

PR #1545 — Ragnarok toast feedback for Odin's Throne — had merge conflicts from weeks of drift. Two rounds of rebase conflicts in JobCard.tsx and Sidebar.tsx, where main had introduced displayMode while the PR branch used collapsed.

Resolved by keeping main's displayMode architecture and merging in the PR's session ID display and improved timestamp guards. Force-pushed the rebased branch, then dispatched FiremanDecko to GKE to finish the implementation.

development/odins-throne-ui/src/components/JobCard.tsx development/odins-throne-ui/src/components/Sidebar.tsx

Act IV · Tooling

Loki Parses ANSI Like An Animal

Odin

why is loki grepping for fail instead of depending on exit code?

Loki was running vitest and then parsing ANSI escape codes to detect failures: grep -oP "\[41m\[1m FAIL". Instead of just... checking the exit code.

Updated the sandbox preamble and both agent templates. Replaced npx vitest run --reporter=verbose with plain npx vitest run. Added explicit instruction: Trust the exit code. Exit 0 = pass. Non-zero = fail. Do NOT grep for FAIL. Do NOT parse ANSI escape codes.

+  cd /workspace/repo/development/frontend && npx vitest run
+**Trust the exit code.** Exit 0 = all tests pass. Non-zero = failures.
+Do NOT grep vitest output for FAIL, do NOT parse ANSI escape codes.
+Just run the command and check whether it succeeded or failed.
.claude/skills/dispatch/SKILL.md .claude/skills/fire-next-up/templates/firemandecko.md .claude/skills/fire-next-up/templates/loki.md

Act V · Identity

Apologies to the Animals

Odin

hey fuck you im an animal

Fair point. Apologies to the animals.