feat(bearings): add all-projects Lavish status page to bearings - #46
Merged
Merged
Conversation
…aused by this PR, and it is fixed. The PR added two new passing checks to tests/fm-bearings-snapshot.test.sh ("task inventory includes all 11 backlog rows..." and "task inventory preserves delegated children..."). But .github/workflows/ci.yml still expected exactly 59 Bearings tests, which broke the rule that the pinned count must match the checks the suite actually runs. I changed the pin and its error message from 59 to 61. That was the only place with this pin. A local run of `/bin/bash tests/fm-bearings-snapshot.test.sh` exited 0 with 61 passing checks and 0 failures. ci-1 and ci-2 (Behavior portable serial 3 and 8) were not caused by this PR, so I made no code change for them. The failing tests are tests/fm-calm-pi-extension.test.sh ("rendered export DOM violated the Calm conversation boundary") and tests/fm-pi-branch-extension.test.sh ("Calm-off ToolExecutionComponent rendering differs from Pi stock"). This PR does not touch Pi or Calm code. CI installs @earendil-works/pi-coding-agent without a pinned version. PR 45's run at 14:07 installed 0.87.1, and these same shards passed. This run installed 0.99.1, and they failed. The cause is a newer Pi release upstream, not this change. Pinning the Pi version or adapting Calm to Pi 0.99 is outside this PR's scope and should be decided separately
doitdigital0495
force-pushed
the
fm/fm-lavish-status-board-skill
branch
from
October 1, 2026 10:51
1c20dbc to
ce0b9c8
Compare
…y). This PR caused it. The CI parse sweep runs `/bin/bash -n` (stock Bash 3.2.57) and failed on `tests/fm-pi-branch-extension.test.sh` with "unexpected EOF while looking for matching `''". Cause: commit ce0b9c8 added the comment `// Both outcomes tools must inherit the installed Pi's argument formatter,` to the JS heredoc that sits inside `out=$(... <<'JS' ... JS)`. Bash 3.2 reads the whole `$(...)` text for quotes without knowing it is a heredoc. The bare apostrophe in "Pi's" opened a single quote that never closed, so the parser hit end of file. Rule that must hold: no quote character in a heredoc inside `$(...)` may be left unpaired outside a double-quoted string. I checked every other place in that heredoc. The only other apostrophe (line 4700, already on the base branch) is inside a "..." string literal, so Bash 3.2 ignores it. The other new lines have balanced double quotes and balanced parentheses. CI reported no other file. Fix: I reworded the comment to "inherit the argument formatter of the installed Pi". It is a comment-only change; the test logic is unchanged. What I checked: - `bash -n` on the file passes on the local Linux Bash. - After the fix, the heredoc has no bare apostrophes left. - I could not run the real Bash 3.2: it is not installed here and I did not install it. The evidence is from a scan of the heredoc, not from that shell
doitdigital0495
added a commit
that referenced
this pull request
Oct 2, 2026
Removes the all-projects Lavish status page and the compact open-work board from PRs #46 (e10503d) and #47 (837f39d), restoring every bearings path to its state at ac35f70: the bearings skill and board template, fm-bearings-board.sh, fm-bearings-snapshot.sh, the fleet snapshot projects projection, their tests, the bearings test-count pin, and the board-only cross-references in docs and fm-project-mode.sh (--list-json). The Pi stock-call and export-visibility fixes that rode along in #46 are unrelated to the board and stay. Co-authored-by: Daan Aerts <daan@daeverhuur.nl>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Captain wants an on-demand Lavish all-tasks status-page skill, merged into bearings when that avoids duplicate ownership. Preserve all requests and their truthful statuses, plain wording, fully explained Needs you options, self-contained dark styling with no external requests, and existing structured snapshot/decision sources and supervised Lavish adapter; no new daemon or configuration knobs. Follow-up on PR 46 requires every project in data/projects.md, including idle projects, with registered delivery posture and merge authority in plain words, and every present worker and registered secondmate grouped by known project associations, with 1-2-line status and open questions explaining the issue, actual choice and recommendation. Unknown progress, absent project links and bounded or stale delegated coverage must remain explicit, never guessed; shared leads may appear under multiple projects, unassigned people remain visible. Build from current fleet data and verify at 390px, serve through lavish-axi, report URL and remain available for the supervised feedback loop. The live page already shows all 10 registered projects plus shared work, 21 present workers and 91 requests at https://desktop-agentic.tail1dbb2d.ts.net:8387/session/faa900220fea1c21; explicit html/body dark backgrounds persist under light preference, width/scrollWidth both 390, no external resource requests, listener live. Extend fm-project-mode's existing annotation parser with structured complete enumeration, canonical registered-secondmate project associations, and bearings opt-in task inventory with complete main crew plus sampled delegated crew; preserve all default digest formats and honest canonical coverage limits. New board fields are validated and rendered by the shipped template, with no alternate board design or polling mechanism. Earlier Pi stock rendering and hidden export visibility compatibility repairs and all no-mistakes fixes remain in branch history. They must remain compatible with Pi 0.86 and 0.99, with no Pi pin/downgrade, visibility-policy change, gate skip or override. Four targeted board/render/snapshot/task-delivery suites pass after correcting one fixture association assertion; lint, documentation audience guard and whitespace checks pass. Publish to existing PR 46 via the normal pipeline; do not merge, and only call delivery complete with genuinely green checks. Preserve the earlier preview alongside .lavish/validation/status-all-projects.html; live session remains hosted during validation.
What Changed
board-template.html,fm-bearings-board.sh,fm-bearings-snapshot.sh, SKILL.md). It lists every registered project, including idle ones, with its delivery posture and merge authority. Workers and registered secondmates are grouped under the projects they are linked to, and each request shows its truthful status, with a full explanation of any "Needs you" option. Unknown progress, missing project links and sampled or stale delegated coverage are labelled as such, never guessed.fm-project-mode.shgains a--list-jsonmode that lists every entry in the project registry using the existing annotation parser. A registry mode it does not recognise is markedrecognised:false, and a missing registry is reported as absent.fm-fleet-snapshot.shnow also reads the project links of each registered secondmate. The default single-project output formats are unchanged.fm_branch_outcomes,fm_branch_processed) now hand their call line to Pi's own stock tool rendering, so newer Pi versions show the call arguments without duplicating Pi's formatter. Also included: matching tests and docs, plus updated Bearings test count in CI (59 to 61).🤖 Generated with Claude Code
Risk Assessment
✅ Low: The fix round moves the existing registry parser into a shared function without changing what it parses.
--list-jsonnow addsrecognisedandannotationto each project row.fm-bearings-snapshotpasses that registry data through unchanged, and the board'sdeliveryfield is free text, so the composer can write "Delivery plan not confirmed" without changing the schema. The default and--rawdigest output is unchanged. The test runs the real--list-jsoncommand and checks both the unknown-mode row and the intentional legacy row.Testing
The four targeted board, render, snapshot and task-delivery suites pass. The new
--list-jsonCLI was driven live on a sandbox registry: a typo mode comes back asrecognised:falsewith its raw annotation, while legacy defaults stayrecognised:true. A missing registry reportspresent:false. The real fleet registry lists all 10 projects, none unrecognised. The bearings snapshot was driven on the real fleet (read-only).--fields tasksrefuses without--json. With--jsonit yields the project registry, 24 crew rows and 93 backlog rows, and the default output still has no new fields. A real board build in a throwaway home was rendered in headless Chrome at 390px with light preference. html and body stay dark (rgb 14,17,22), scrollWidth is 390, and there are no external requests. The page shows idle projects, a shared lead under two projects, an unconfirmed-project group for the unassigned person, explained questions (what it is, your choice, recommendation), all five request statuses and the coverage note. A payload with a question missing its recommendation is refused. The live session faa900220fea1c21 is open and its bearings-board listener is running. Screenshots of each section are in the evidence directory. Not driven live: secondmate crew grouping on the real fleet (the live home has no registered secondmates; the snapshot suite covers it) and the Pi 0.86/0.99 compatibility, which belongs to the Pi extension suites and CI. Lab browser session and temp home are torn down; the worktree is clean.Evidence: Rendered board HTML built by fm-bearings-board.sh
Source: Rendered board HTML built by fm-bearings-board.sh
Evidence: Render checks at 390px, light preference
Source: Render checks at 390px, light preference
lightPref:true htmlBg:rgb(14,17,22) bodyBg:rgb(14,17,22) innerWidth:390 scrollWidth:390 external:[] hasIdle hasUnconfirmed notConfirmedDelivery leadInPortal:2 routingIdsLeak:false nullLeak:falseEvidence: fm-project-mode --list-json transcript
Source: fm-project-mode --list-json transcript
Evidence: bearings snapshot --fields tasks transcript (real fleet)
Source: bearings snapshot --fields tasks transcript (real fleet)
Evidence: Board build output and adversarial refusal
Source: Board build output and adversarial refusal
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 1 issue found → auto-fixed ✅
bin/fm-project-mode.sh:61- --list-json resolves each project through the --raw path, which maps an unknown or typo'd annotation to "no-mistakes off" and only warns on stderr (lines 106-108). The JSON row then looks identical to a deliberately registered legacy no-mistakes project (tests/fm-task-delivery.test.sh asserts typoproj -> no-mistakes/off). The board composer will describe a delivery posture the captain never registered, which conflicts with the intent's 'unknown ... must remain explicit, never guessed'. A possible remedy is a recognised:false flag or the raw annotation on such rows. That changes the documented output, so the author should decide.🔧 Fix applied.
✅ Re-checked - no issues remain.
.agents/skills/bearings/assets/board-template.html- At 390px the request title column breaks a long word mid-word ('Unconfirme / d request'). It is cosmetic, but the page is meant to look pixel-perfect on a phone.overflow-wrap: anywhere/word-breakon the narrow title column causes it;hyphens: autoor a wider minimum column would fix it.bash tests/fm-bearings-board.test.sh,tests/fm-bearings-board-render.test.sh,tests/fm-bearings-snapshot.test.sh,tests/fm-task-delivery.test.sh(all exit 0)FM_HOME=<sandbox> bin/fm-project-mode.sh --list-jsonwith registry rows direct-PR, legacy default, typo[no-mistakez],[no-mistakes-prod-only +yolo]bin/fm-project-mode.sh gammaand--raw gamma(mechanical fallback for the typo mode)FM_DATA_OVERRIDE=<absent> bin/fm-project-mode.sh --list-jsonand--list-json x(usage refusal)FM_HOME=~/.firstmate bin/fm-project-mode.sh --list-json(read-only, real registry)FM_HOME=~/.firstmate bin/fm-bearings-snapshot.sh --fields tasks(TOON refusal),--json --fields tasks, default--jsonand default TOONfm-bearings-board.sh build payload.jsonin a throwaway private home with a stub lavish-axi (projects, crew, requests, coverage, cards), plus an adversarial payload with a question missing its recommendationchrome-devtools-axi: emulate 390x844 mobile with light colour preference, open the built board, eval computed backgrounds, scrollWidth, resource entries and text checks, network list, screenshots of each sectionlavish-axisession list plus chrome-devtools-axi open of the live session faa900220fea1c21 (read-only)✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.