Skip to content

feat: add safe actionable Lavish decision boards - #11

Merged
ruby-dlee merged 26 commits into
mainfrom
fm/lavish-board-w7
Jul 22, 2026
Merged

feat: add safe actionable Lavish decision boards#11
ruby-dlee merged 26 commits into
mainfrom
fm/lavish-board-w7

Conversation

@ruby-dlee

@ruby-dlee ruby-dlee commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Intent

Make captain-facing Lavish decision boards correct by construction in the shared lavish-decision-boards skill and bundled generic template, while teaching how to build and read a board rather than mandating when Lavish must be used. Preserve all three safety items: choices stay local and the queue stays empty until one explicit Send answers click; that click validates every decision form, fails loudly on missing or duplicate keys, creates one complete explicit-submit batch envelope with the full expected-key manifest and nonempty answers, locks against duplicate clicks, queues exactly once, and immediately sends; Firstmate acts only after the tool-authoritative connection signal confirms genuine connection and only on an unambiguous explicit batch whose manifest and nonempty structured answers match exactly, rejecting every partial, empty, duplicate, extra, unmarked, ambiguous, lifecycle, disconnect, flicker, re-poll, or audit return; and expected multi-minute connection lag must be waited through without acting, re-serving, reopening, abandoning, or thrashing. Also require every decision board to present the actionable plan rather than bare status: include every in-flight item, each real remaining path to done with gate owner or condition and concrete downstream consequence, capacity-aware lane/harness/model distribution based on current capacity and quota without hardcoded values, explicit pacing and concurrency limits that protect fleet health, and a clear split between work proceeding autonomously under standing rules and items genuinely requiring captain action. Keep SKILL.md under 100 lines, retain the validated layout-safe asset and Chrome/exact-board audit workflow, preserve simple yes/no chat routing and bearings, and keep the PR scoped to the skill, its bundled asset, and the existing AGENTS.md section 13 trigger.

What Changed

  • Add an internal skill for building actionable, layout-audited Lavish decision boards and safely accepting captain responses only after a genuine connection and complete explicit batch.
  • Bundle a layout-safe HTML template that keeps choices local, validates every decision key and answer, submits one manifested batch, and prevents duplicate sends.
  • Register the skill’s trigger in AGENTS.md for captain-facing decision and structured-feedback boards.

Risk Assessment

✅ Low: Captain, the one-line fix clears the stale alert immediately before the validated, locked batch queue write while preserving the existing submission, manifest, connection, layout, and scope invariants.

Testing

The supplied full baseline had already passed; focused browser validation rendered the shipped template through the real Lavish Editor, cleared its layout gate, exercised required-answer and configuration failures, proved choices remain local until explicit send, and verified one complete manifest-matched batch queues and sends exactly once under rapid duplicate clicks. No issues were found.

  • Evidence: Rendered Lavish decision board after layout audit cleared (local file: /var/folders/y_/bfdbj_vx20l9b9tw7crgkzwm0000gn/T/no-mistakes-evidence/01KY4AEYJJZ23XR99JGCMHJNRN/lavish-board-window.png)
Evidence: Tool-authoritative explicit submission
Real Lavish poll: status=feedback; prompts=1; submission=explicit-send-batch; expectedQuestionKeys=[decision-key]; expectedCount=1; one matching nonempty answer.

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 1 issue found → auto-fixed (2) ✅
  • ⚠️ .agents/skills/lavish-decision-boards/assets/lavish-board-template.html:158 - Incomplete answers only call reportValidity() and then return. For an allowed <select> without required, or a control whose name differs from data-lavish-question, native validity can pass while FormData.get(key) is empty, so Send silently does nothing. Show an explicit error and validate control-name/key correspondence before returning.

🔧 Fix: Captain: validate Lavish decision controls before submission
1 warning still open:

  • ⚠️ .agents/skills/lavish-decision-boards/assets/lavish-board-template.html:188 - After an incomplete attempt sets the global Answer required alert, a later valid submission queues and sends successfully but never clears that alert. The board can therefore show a red failure beside Sent explicitly, potentially prompting an unnecessary reload or resubmission. Clear the stale alert when the form becomes valid or immediately before the successful queue write.

🔧 Fix: Captain: clear stale Lavish submission alerts
✅ Re-checked - no issues remain.

✅ **Test** - passed

✅ No issues found.

  • command -v tmux >/dev/null || { echo "tmux is required for e2e tests" >&2; exit 1; }; tmux -V; rc=0; for t in tests/*.test.sh; do echo "== $t =="; bash "$t" || rc=1; done; uv run --directory tools/agent-fleet --locked pytest || rc=1; uv run --directory tools/agent-fleet --locked python -m compileall -q src || rc=1; exit "$rc"
  • Provided baseline had already passed: command -v tmux >/dev/null || { echo "tmux is required for e2e tests" >&2; exit 1; }; tmux -V; rc=0; for t in tests/*.test.sh; do echo "== $t =="; bash "$t" || rc=1; done; uv run --directory tools/agent-fleet --locked pytest || rc=1; uv run --directory tools/agent-fleet --locked python -m compileall -q src || rc=1; exit "$rc".
  • Verified scope and skill size with git diff --name-only bf7c5ad167514cba879cb095c091fe1627549ccc..5a0fc280fca34cbee7c1a1f019faf849e16b1997 and wc -l .agents/skills/lavish-decision-boards/SKILL.md.
  • Served the shipped asset with LAVISH_AXI_NO_OPEN=1 ~/.local/bin/lavish-axi .agents/skills/lavish-decision-boards/assets/lavish-board-template.html --no-open and opened its exact session URL in a dedicated Chrome window.
  • Ran ~/.local/bin/lavish-axi poll .../lavish-board-template.html and bounded CHROME_DEVTOOLS_AXI_SESSION=lavish-board-w7 ~/.local/bin/chrome-devtools-axi snapshot checks until the layout curtain cleared without a layout-issue indicator.
  • Used Chrome clicks for empty submission, local option selection, and explicit submission; the empty form failed visibly, selection made no queue/send calls, and the real poll returned one complete explicit-send-batch.
  • Instrumented the direct artifact with chrome-devtools-axi eval to prove a rapid b.click(); b.click() produces exactly one queue/send pair, disables the button, and sets the in-flight lock.
  • Instrumented a two-form board to verify the full two-key manifest and exactly two matching nonempty answers were included in the single batch.
  • Instrumented missing-key and duplicate-key variants to verify loud configuration errors, a disabled send button, and zero queue/send calls.
  • Captured the rendered window with screencapture -x -l 115537 .../lavish-board-window.png, ended the Lavish session, stopped the Chrome DevTools session, removed duplicate captures, and confirmed git status --short was clean.
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

@ruby-dlee ruby-dlee changed the title feat: add actionable Lavish decision boards feat(skills): add actionable Lavish decision boards Jul 22, 2026
@ruby-dlee
ruby-dlee force-pushed the fm/lavish-board-w7 branch from c4b4e7b to 9c0ea77 Compare July 22, 2026 06:33
@ruby-dlee ruby-dlee changed the title feat(skills): add actionable Lavish decision boards feat: add safe Lavish decision board workflow Jul 22, 2026
@ruby-dlee ruby-dlee changed the title feat: add safe Lavish decision board workflow feat: add safe actionable Lavish decision boards Jul 22, 2026
@ruby-dlee

Copy link
Copy Markdown
Owner Author

I reviewed the skill and template against all three board-safety hard rejects and the actionability hard reject. The template keeps selection changes local, validates the complete form/key set, creates one manifest-matched explicit-send-batch, acquires its one-shot lock before the sole queue write, and immediately sends from that explicit handler (assets/lavish-board-template.html:121-197). The skill requires a genuine tool-authoritative connection, waits through expected multi-minute lag without session thrash, and treats poll returns as non-actionable unless exactly one complete explicit batch passes manifest/answer validation (SKILL.md:46-68). It also requires every in-flight item, full paths/gates/consequences, capacity-aware lane/harness/model distribution, pacing limits, and a clear autonomous-versus-decision split (SKILL.md:32-38). The trigger governs how to build a Lavish decision surface without mandating that every decision use one, and the asset contains no fleet, project, or machine specifics.

Verdict: ready.

@ruby-dlee
ruby-dlee merged commit 609cf8b into main Jul 22, 2026
5 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.

1 participant