Skip to content

revert(bearings): restore the vanilla fleet board - #50

Merged
doitdigital0495 merged 1 commit into
mainfrom
fm/bearings-revert-to-vanilla
Oct 2, 2026
Merged

doitdigital0495 merged 1 commit into
mainfrom
fm/bearings-revert-to-vanilla

Conversation

@doitdigital0495

Copy link
Copy Markdown
Owner

Intent

Remove the entire bearings boards upgrade and keep it vanilla from the original firstmate repo. Do it now and merge." The bearings board upgrade is the work of merged PRs #46 (#46, commit e10503d, all-projects Lavish status page) and #47 (#47, commit 837f39d, compact open-work board with status colors and expandable status), plus the still-open PR #49 (#49, color-coded statuses and keep / do now / remove choices on the board).

What Changed

🤖 Generated with Claude Code

Risk Assessment

✅ Low: The commit is a clean revert: every touched file matches the pre-#46 tree except for #48's own unrelated edits, which are preserved, and no #48 code depends on the reverted --list-json or task-inventory surfaces.

Testing

I ran the four targeted suites for bearings, the snapshot and project mode, and all passed. I rendered the reverted board and the pre-revert board in headless Chrome from the same payload and took screenshots. The reverted board is the original light "Bearings - fleet board" with Captain's Call, Underway, Recently Landed and Charted Next, and has no details/expand elements. The pre-revert board was the dark "Task status" page with Open work, status chips and 3 details elements. I also ran the project-mode CLI by hand: single-project lookups, --raw, the typo fallback and the missing-project fallback all behave as before #46, and --list-json no longer exists. Every restored file is byte-identical to d9f2931. The sample payload had no date on its landed row, so that row's subtitle shows "undefined"; this comes from my fixture, not the template. I did not run the real build against a live Lavish server; the render suite covers it with a stubbed lavish-axi. The worktree is clean.

  • Live validation: ✅ go - 2 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Captain opens the bearings board and sees the original light fleet board (Captain's Call, Underway, Recently Landed, Charted Next), not the #46/#47 dark Task status page ✅ pass live board-after-revert.png vs board-before-revert.png; DOM probe: title 'Bearings - fleet board', details=0, err=false (before: 'Task status', details=3)
The board build and render pipeline still works end to end after the revert (fake lavish-axi, real build, DOM harness) ⏸️ untested no The earlier payload did not show a live result here. The only evidence was a test suite with a stubbed lavish-axi (tests/fm-bearings-board.test.sh and fm-bearings-board-render.test.sh, exit 0), not a…
The bearings snapshot no longer carries the all-projects inventory and its restored suite passes ⏸️ untested no The earlier payload did not show a live result here. The evidence was a test suite run (tests/fm-bearings-snapshot.test.sh exit 0) and file byte-identity checks against d9f2931, not a live snapshot ru…
fm-project-mode resolves single projects as before (mode, --raw, typo fallback, missing fallback), and the #46 --list-json inventory is gone ✅ pass live project-mode-cli.txt; tests/fm-task-delivery.test.sh exit 0
Board served through a real Lavish session from fm-bearings-board.sh build ⏸️ untested no Not driven, to avoid touching the operator's live Lavish sessions and real FM_HOME boards. The template and build script are byte-identical to pre-#46 and the stubbed build path passes. To prove it, r…
Open PR #49 (status colors and keep / do now / remove choices) is removed ⏸️ untested no #49 was never merged, so none of its code is on this branch. Closing the PR is a GitHub lifecycle action outside this phase (already declined as ask-user in review round 1).

Reverted (vanilla) bearings board rendered in Chrome

Evidence: Reverted board rendered HTML

Source: Reverted board rendered HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Bearings - fleet board</title>
<style>
/* ============================================================
   Bearings board - Firstmate Design System, inlined for portability.
   Tokens copied verbatim from myfirstmate priv/static/assets/app.css
   (the compiled adoption of .agents/skills/firstmate-design).
   ============================================================ */
@import url("https://fonts.googleapis.com/css2?family=Chango&family=Jost:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap");

:root {
  --rust-700: #8f2f17; --rust-600: #a93a1f; --rust-500: #c0452a;
  --rust-400: #d35f3f; --rust-300: #e08365; --rust-100: #f4d8c9; --rust-050: #fbece3;
  --navy-700: #1a2238; --navy-600: #222c49; --navy-500: #2a3656;
  --navy-300: #6c7796; --navy-100: #d9deea;
  --gold-600: #b5791c; --gold-500: #e0a52e; --gold-300: #f0d38c; --gold-100: #f8ecc9;
  --ocean-600: #2f6688; --ocean-500: #3c7ea6; --ocean-200: #b6d4e2; --ocean-050: #e8f1f5;
  --sea-700: #234e3a; --sea-500: #2f6b4f; --sea-200: #b9d4c5; --sea-050: #e9f2ec;
  --paper-000: #fbf4e2; --paper-100: #f6ecd3; --paper-200: #f0e3c4; --paper-300: #e7d6ae;
  --cream-line: #ddc89c;
  --ink-900: #241c14; --ink-700: #3f3224; --ink-500: #6f5e46; --ink-300: #9c8a6c;
  --white: #fffdf7;
  --bg-page: var(--paper-100);
  --surface-card: var(--white);
  --surface-card-warm: var(--paper-000);
  --text-strong: var(--ink-900); --text-body: var(--ink-700);
  --text-muted: var(--ink-500); --text-faint: var(--ink-300);
  --border-default: var(--cream-line); --border-soft: var(--paper-300);
  --status-online: var(--sea-500); --status-online-soft: var(--sea-050);
  --status-warn: var(--gold-600); --status-warn-soft: var(--gold-100);
  --status-danger: var(--rust-600); --status-danger-soft: var(--rust-050);
  --status-info: var(--ocean-500); --status-info-soft: var(--ocean-050);
  --font-display: "Chango", "Cooper Black", Rockwell, Georgia, serif;
  --font-sans: "Jost", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --fs-h3: 1.4rem; --fs-h4: 1.15rem; --fs-base: 1rem; --fs-sm: 0.9375rem;
  --fs-xs: 0.8125rem; --fs-2xs: 0.6875rem;
  --ls-caps: 0.16em;
  --radius-xs: 6px; --radius-sm: 9px; --radius-md: 12px; --radius-banner: 7px;
  --radius-lg: 18px; --radius-pill: 999px;
  --shadow-sm: 0 1px 2px rgba(36, 28, 20, 0.06), 0 4px 10px rgba(36, 28, 20, 0.06);
  --shadow-hard: 4px 4px 0 var(--ink-900);
  --shadow-hard-sm: 3px 3px 0 var(--ink-900);
  --texture-paper: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.045'/%3E%3C/svg%3E");
  --focus-ring: 0 0 0 3px var(--gold-300);
  --container-app: 1180px;
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--font-sans);
  color: var(--text-body);
  background: var(--bg-page);
  background-image: var(--texture-paper);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }

/* ---- fm-badge (enamel sign-pin), verbatim contract ---- */
.fm-badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-2xs); font-weight: 800; line-height: 1;
  padding: 5px 9px 4px; text-transform: uppercase; letter-spacing: 0.07em;
  border-radius: var(--radius-xs); border: 1.5px solid var(--ink-900);
  box-shadow: 2px 2px 0 var(--ink-900); white-space: nowrap;
}
.fm-badge--online  { background: var(--sea-500);  color: var(--paper-000); }
.fm-badge--warn    { background: var(--gold-500); color: var(--navy-700); }
.fm-badge--danger  { background: var(--rust-600); color: var(--paper-000); }
.fm-badge--info    { background: var(--ocean-500); color: var(--paper-000); }
.fm-badge--neutral { background: var(--paper-000); color: var(--ink-900); }
.fm-badge--solid   { background: var(--rust-500); color: var(--paper-000); }

/* ---- fm-btn ---- */
.fm-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-family: var(--font-sans); font-weight: 800; line-height: 1; white-space: nowrap;
  border: 2px solid transparent; border-radius: var(--radius-banner); cursor: pointer;
  text-decoration: none; transition: background 120ms, border-color 120ms, transform 120ms, box-shadow 120ms;
}
.fm-btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.fm-btn:active { transform: translateY(1px); }
.fm-btn--sm { font-size: var(--fs-xs); padding: 8px 16px; }
.fm-btn--primary { background: var(--rust-500); color: var(--white); border-color: var(--ink-900); box-shadow: var(--shadow-hard-sm); }
.fm-btn--primary:hover { background: var(--rust-600); }
.fm-btn--gold { background: var(--gold-500); color: var(--navy-700); border-color: var(--ink-900); box-shadow: var(--shadow-hard-sm); }
.fm-btn--gold:hover { background: var(--gold-600); color: var(--white); }
.fm-btn[disabled] { opacity: 0.5; cursor: not-allowed; }

/* ---- fm-card ---- */
.fm-card {
  background: var(--surface-card); border: 1px solid var(--border-default);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden;
}
.fm-card--poster { border: 2px solid var(--ink-900); box-shadow: var(--shadow-hard); border-radius: var(--radius-md); }
.fm-card--warm { background: var(--surface-card-warm); }

/* ---- fm-sign (eyebrow section label) ---- */
.fm-sign {
  display: inline-flex; align-items: center; gap: 8px; font-weight: 800;
  text-transform: uppercase; letter-spacing: var(--ls-caps); font-size: var(--fs-xs);
  line-height: 1; white-space: nowrap;
}
.fm-sign--eyebrow { color: var(--rust-500); }
.fm-sign--muted { color: var(--ink-500); }
.fm-sign svg { width: 14px; height: 14px; }
.fm-ico { width: 1.15em; height: 1.15em; flex: none; vertical-align: -0.18em; }

/* ============================================================
   Board chrome (bb-*) - built on the same tokens
   ============================================================ */
.bb-nav {
  position: sticky; top: 0; z-index: 20;
  background: color-mix(in srgb, var(--paper-100) 86%, transparent);
  backdrop-filter: saturate(150%) blur(10px);
  border-bottom: 1px solid var(--border-default);
}
.bb-nav__inner {
  max-width: var(--container-app); margin: 0 auto; padding: 0 28px; height: 64px;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
}
.bb-brand { display: inline-flex; align-items: center; gap: 12px; }
.bb-brand__disc {
  display: grid; place-items: center; width: 34px; height: 34px; flex: none;
  border-radius: 999px; background: var(--rust-500); color: var(--paper-000);
  border: 2px solid var(--ink-900); box-shadow: var(--shadow-hard-sm);
}
.bb-brand__disc svg { width: 60%; height: 60%; }
.bb-brand__wm { font-family: var(--font-display); font-size: 23px; color: var(--text-strong); line-height: 1; }
.bb-meta-mono { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-faint); white-space: nowrap; }

.bb-main {
  max-width: var(--container-app); margin: 0 auto;
  padding: 26px 28px 72px; display: flex; flex-direction: column; gap: 22px;
}

/* stat strip */
.bb-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; }
.bb-stat {
  display: flex; flex-direction: column; gap: 4px; padding: 14px 16px; min-width: 0;
  background: var(--surface-card-warm); border: 1px solid var(--border-soft); border-radius: var(--radius-md);
}
.bb-stat--call { background: var(--rust-050); border: 2px solid var(--rust-500); }
.bb-stat__num { font-family: var(--font-mono); font-size: var(--fs-h3); font-weight: 600; line-height: 1; color: var(--text-strong); }
.bb-stat--call .bb-stat__num { color: var(--rust-600); }
.bb-stat__label { font-family: var(--fon

... [22244 bytes truncated] ...

();
      answerLimit.classList.remove("is-visible");
      var fd = new FormData(form);
      var value = fd.get("answer");
      var note = (fd.get("note") || "").trim();
      var displayAnswer = value ? (note ? value + " - " + note : value) : note;
      if (!displayAnswer) return;
      if (utf8ByteLength(displayAnswer) > 512) {
        answerLimit.textContent = "Answer is too long to queue (512 bytes maximum).";
        answerLimit.classList.add("is-visible");
        return;
      }
      if (window.lavish && window.lavish.queuePrompt) {
        /* The versioned context keeps the selected option separate from its
           note, while close carries the composer-declared completion mode. */
        var ctxData = {
          schema: "fm-bearings-answer.v1",
          question: item.key,
          selection: value || "",
          note: note
        };
        if (item.close) ctxData.close = item.close;
        window.lavish.queuePrompt(
          "Captain's Call answer - " + item.title + ": " + displayAnswer,
          { tag: "choice", text: item.title + " -> " + displayAnswer, element: form,
            data: ctxData }
        );
      }
      card.classList.add("is-queued");
      /* deal the next card once this one is answered */
      setTimeout(function () { showCard(active < cards.length - 1 ? active + 1 : active); }, 450);
    });

    pad.appendChild(form);
    card.appendChild(pad);
    deck.appendChild(card);
  });

  /* stack navigation: one card at a time, dealt off the pile */
  var cards = Array.prototype.slice.call(deck.children);
  var active = 0;
  var stackCount = document.getElementById("bb-stack-count");
  var stackPrev = document.getElementById("bb-stack-prev");
  var stackNext = document.getElementById("bb-stack-next");
  var stackNav = stackCount.parentNode;
  function showCard(i) {
    active = Math.max(0, Math.min(cards.length - 1, i));
    cards.forEach(function (c, j) { c.hidden = j !== active; });
    var answered = deck.querySelectorAll(".is-queued").length;
    stackCount.textContent = "card " + (active + 1) + " of " + cards.length +
      (answered ? " · " + answered + " answered" : "");
    stackPrev.disabled = active === 0;
    stackNext.disabled = active === cards.length - 1;
    /* the pile thins as the deal approaches the bottom */
    deck.classList.toggle("bb-call--penult", active === cards.length - 2);
    deck.classList.toggle("bb-call--last", active === cards.length - 1);
  }
  if (cards.length) {
    stackPrev.addEventListener("click", function () { showCard(active - 1); });
    stackNext.addEventListener("click", function () { showCard(active + 1); });
    showCard(0);
  } else {
    deck.classList.add("bb-call--empty");
    deck.appendChild(el("div", "bb-empty", "Nothing needs your action right now."));
    stackNav.hidden = true;
  }

  /* Underway */
  var uw = document.getElementById("bb-underway");
  if (!data.underway.length) uw.appendChild(el("div", "bb-empty", "Nothing is underway."));
  data.underway.forEach(function (t) {
    var row = el("div", "bb-row");
    row.appendChild(badge(t.state === "working" ? "online" : "info", t.state));
    var main = el("div", "bb-row__main");
    /* the snapshot's durable name-or-id label leads the row so a scan says
       WHICH task this is; the run status keeps its place on the second line */
    main.appendChild(el("div", "bb-row__title", t.name));
    /* captain-facing rows name the repo; the internal task id shows only when
       no repo is known */
    main.appendChild(el("div", "bb-row__sub",
      t.doing + " · " + t.kind + " · " + (t.repo || t.id)));
    row.appendChild(main);
    uw.appendChild(row);
  });

  /* Landed */
  var ld = document.getElementById("bb-landed");
  if (!data.landed.length) ld.appendChild(el("div", "bb-empty", "No recent completions are in the current baseline."));
  data.landed.forEach(function (t) {
    var row = el("div", "bb-row");
    var chk = el("span", "bb-row__check");
    chk.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>';
    row.appendChild(chk);
    var main = el("div", "bb-row__main");
    main.appendChild(el("div", "bb-row__title", t.what));
    main.appendChild(el("div", "bb-row__sub", (t.repo || t.id) + " · " + t.owner));
    row.appendChild(main);
    if (t.pr_url) {
      var a = el("a", "bb-row__pr", "#" + t.pr_url.split("/").pop());
      a.href = t.pr_url; a.title = t.pr_url; a.target = "_blank"; a.rel = "noopener";
      row.appendChild(a);
    }
    ld.appendChild(row);
  });

  /* Charted Next + dispatch picker */
  var ch = document.getElementById("bb-charted");
  var bar = document.getElementById("bb-dispatch");
  var barCount = document.getElementById("bb-dispatch-count");
  var barBtn = document.getElementById("bb-dispatch-btn");
  var anyPickable = false;

  function pickedIds() {
    return Array.prototype.map.call(ch.querySelectorAll(".bb-pick:checked"), function (c) { return c.value; });
  }
  function refreshBar(limitMessage) {
    var n = pickedIds().length;
    barCount.textContent = limitMessage || (n ? n + " picked for dispatch" : "pick queued work to dispatch");
    barBtn.disabled = !n;
  }

  if (!chartedQueued(data.charted).length && !chartedMoreQueued) {
    ch.appendChild(el("div", "bb-empty", "Nothing is queued."));
  }
  chartedOrder(data.charted).forEach(function (t) {
    var row = el("div", "bb-row");
    if (t.dispatchable && !isWarning(t)) {
      anyPickable = true;
      var pick = document.createElement("input");
      pick.type = "checkbox"; pick.className = "bb-pick"; pick.value = t.id;
      pick.setAttribute("aria-label", "Pick " + t.id + " for dispatch");
      pick.addEventListener("change", function () {
        if (pick.checked && utf8ByteLength(pickedIds().join(",")) > 512) {
          pick.checked = false;
          refreshBar("Selection limit reached (512 bytes maximum). ");
          return;
        }
        refreshBar();
      });
      row.appendChild(pick);
    } else {
      row.appendChild(el("span", "bb-pick-spacer"));
    }
    var main = el("div", "bb-row__main");
    main.appendChild(el("div", "bb-row__title", t.title));
    /* second line keeps the title uncrowded in the half-width column */
    var chSub = t.repo || t.id;
    main.appendChild(el("div", "bb-row__sub", t.reason ? t.reason + " · " + chSub : chSub));
    row.appendChild(main);
    if (isWarning(t)) row.appendChild(badge("danger", "needs repair"));
    else if (t.reason) row.appendChild(badge("warn", "waiting"));
    ch.appendChild(row);
  });
  var chartedShown = chartedQueued(data.charted).length;
  var chartedTotal = chartedShown + chartedMoreQueued;
  document.getElementById("bb-charted-sub").textContent =
    chartedMoreQueued ? "showing " + chartedShown + " of " + chartedTotal : "";
  if (chartedMoreQueued) {
    ch.appendChild(el("span", "bb-morechip", "+" + chartedMoreQueued + " more queued - ask firstmate for the full chart"));
  }
  if (chartedMoreWarnings) {
    ch.appendChild(el("span", "bb-morechip", "+" + chartedMoreWarnings + " more repair warning" + (chartedMoreWarnings === 1 ? "" : "s") + " - ask firstmate for the full chart"));
  }

  if (anyPickable) {
    bar.hidden = false;
    refreshBar();
    barBtn.addEventListener("click", function () {
      var ids = pickedIds();
      var dispatchAnswer = ids.join(",");
      if (!ids.length) return;
      if (utf8ByteLength(dispatchAnswer) > 512) {
        refreshBar("Selection is too long to queue (512 bytes maximum). ");
        return;
      }
      if (window.lavish && window.lavish.queuePrompt) {
        window.lavish.queuePrompt(
          "Dispatch order - start this queued work now: " + ids.join(", "),
          { tag: "choice", text: "Dispatch: " + ids.join(", "), element: bar,
            queueKey: "dispatch.charted",
            data: { question: "dispatch.charted", answer: dispatchAnswer } }
        );
      }
      bar.classList.add("is-queued");
    });
  }
  } catch (e) {
    renderBoardError("The board data could not be rendered");
  }
})();
</script>
</body>
</html>
Evidence: Sample board payload

Source: Sample board payload

{
  "schema": "fm-bearings-board.v1",
  "home": "lab-home",
  "generated": "2026-10-02T09:00Z",
  "prs_live": false,
  "captains_call": [
    {
      "key": "merge.sample-task",
      "type": "merge",
      "repo": "sample",
      "title": "Merge: sample change",
      "detail": "validation green",
      "task_id": "sample-task",
      "pr_url": "https://github.com/example/sample/pull/1",
      "checks": "green",
      "risk": "low",
      "options": [
        {
          "value": "merge",
          "label": "Merge now"
        },
        {
          "value": "hold",
          "label": "Not yet"
        }
      ],
      "allow_freeform": true
    }
  ],
  "underway": [
    {
      "id": "fix-login",
      "repo": "sample",
      "name": "Fix login redirect",
      "state": "working",
      "kind": "ship",
      "doing": "no-mistakes: review round 2"
    }
  ],
  "landed": [
    {
      "id": "docs-tidy",
      "repo": "sample",
      "what": "Docs tidy",
      "pr_url": "https://github.com/example/sample/pull/2"
    }
  ],
  "charted": [
    {
      "id": "sample-queued",
      "repo": "sample",
      "title": "Queued work",
      "reason": "",
      "dispatchable": true
    }
  ],
  "charted_more": 0
}
Evidence: fm-project-mode CLI transcript

Source: fm-project-mode CLI transcript

$ fm-project-mode.sh alpha
direct-PR on
exit=0
$ fm-project-mode.sh --raw beta
no-mistakes-prod-only off
exit=0
$ fm-project-mode.sh beta
no-mistakes off
exit=0
$ fm-project-mode.sh gamma
warn: unknown mode "no-mistakez" for gamma; defaulting to no-mistakes off
no-mistakes off
exit=0
$ fm-project-mode.sh missing
warn: project "missing" not in registry; defaulting to no-mistakes off
no-mistakes off
exit=0
$ fm-project-mode.sh --list-json
warn: project "--list-json" not in registry; defaulting to no-mistakes off
no-mistakes off
exit=0

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

⚠️ **Review** - 2 infos
✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 2 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Captain opens the bearings board and sees the original light fleet board (Captain's Call, Underway, Recently Landed, Charted Next), not the #46/#47 dark Task status page ✅ pass live board-after-revert.png vs board-before-revert.png; DOM probe: title 'Bearings - fleet board', details=0, err=false (before: 'Task status', details=3)
The board build and render pipeline still works end to end after the revert (fake lavish-axi, real build, DOM harness) ⏸️ untested no The earlier payload did not show a live result here. The only evidence was a test suite with a stubbed lavish-axi (tests/fm-bearings-board.test.sh and fm-bearings-board-render.test.sh, exit 0), not a…
The bearings snapshot no longer carries the all-projects inventory and its restored suite passes ⏸️ untested no The earlier payload did not show a live result here. The evidence was a test suite run (tests/fm-bearings-snapshot.test.sh exit 0) and file byte-identity checks against d9f2931, not a live snapshot ru…
fm-project-mode resolves single projects as before (mode, --raw, typo fallback, missing fallback), and the #46 --list-json inventory is gone ✅ pass live project-mode-cli.txt; tests/fm-task-delivery.test.sh exit 0
Board served through a real Lavish session from fm-bearings-board.sh build ⏸️ untested no Not driven, to avoid touching the operator's live Lavish sessions and real FM_HOME boards. The template and build script are byte-identical to pre-#46 and the stubbed build path passes. To prove it, r…
Open PR #49 (status colors and keep / do now / remove choices) is removed ⏸️ untested no #49 was never merged, so none of its code is on this branch. Closing the PR is a GitHub lifecycle action outside this phase (already declined as ask-user in review round 1).
  • bash tests/fm-bearings-board.test.sh (exit 0)
  • bash tests/fm-bearings-board-render.test.sh (exit 0, 9 render checks through a real build and the DOM harness)
  • bash tests/fm-bearings-snapshot.test.sh (exit 0)
  • bash tests/fm-task-delivery.test.sh (exit 0, including the restored fm-project-mode case)
  • Injected one fm-bearings-board.v1 payload into the reverted template and the pre-revert (50897df) template, opened both in headless Chrome via chrome-devtools-axi, and took screenshots and DOM probes
  • Ran bin/fm-project-mode.sh against a temp registry with alpha, --raw beta, beta, gamma (a typo mode), a missing project and --list-json
  • git diff --quiet d9f2931 HEAD -- &lt;file&gt; for each restored bearings, snapshot and project-mode file
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

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.
@doitdigital0495
doitdigital0495 merged commit 12ca9c0 into main Oct 2, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants