Skip to content

feat(vibe): Offer visual QA, check precedent and plugin version - #304

Merged
shafty023 merged 1 commit into
mainfrom
feat/vibe-visual-qa-precedent-version-check
Oct 16, 2026
Merged

shafty023 merged 1 commit into
mainfrom
feat/vibe-visual-qa-precedent-version-check

Conversation

@shafty023

Copy link
Copy Markdown
Collaborator

Purpose

Operator rulings, 2026-10-16, from a product meeting. Three additions to vibe sessions, in Claude Code and Codex alike:

  1. Visual QA checks a change against the acceptance criteria when the ticket or its PRD has them, and otherwise is the design pack's best-practice review (the repo's /visual-qa, $visual-qa against .claude/design/soul.md).
  2. When the product's behavior in a situation is unspecified, how a mature app handles the same situation is the default answer.
  3. A product question is asked only when neither the graph nor that precedent settles it: Asana first, then another established app with the same flow, then their public help centers. The source is recorded, and the research never touches the person's real data.
  4. Every $vibe start checks the plugin version, asks "keep going or update" when it is outdated, helps with the update, then asks for a reopen. It never blocks when the check cannot run.
  5. The orchestrator offers visual QA at each visible milestone, never on a small edit. The build loop is otherwise unchanged.
  6. "Looks good, make it polished" runs visual QA before handoff, unless the change shows nothing visible or the person already declined it for that version.

What changed

  • Version check (skills/vibe/scripts/plugin-version.mjs, vibe skill section 1 "Plugin version"). It compares the running plugin's own manifest (.codex-plugin in Codex, .claude-plugin in Claude Code) with the same file on claude-plugins main. Outdated prints the update commands: claude plugin marketplace update closedloop-ai and claude plugin update vibe@closedloop-ai in Claude Code. In Codex it is plugin marketplace upgrade closedloop-ai then plugin add for vibe and closedloop-core, or git pull --ff-only for a local folder marketplace, as INSTALL.md already documents. Commands were checked against both CLIs' --help. Any failure to learn the latest version (no network, 404, garbled, a 5 second timeout, a missing manifest) is unknown with exit 0, and the session carries on and says so. guardrails.md "Plugins and tooling" allows exactly this person-chosen update. The question runs once per conversation, outside session-questions.mjs.
  • Precedent check (skills/vibe/scripts/precedent-check.mjs, quality-loop.md "Precedent before asking"). One research brief and its safety rules for both harnesses.
    • Claude Code starts a separate headless claude -p --chrome --allowedTools "mcp__claude-in-chrome__*,WebFetch,WebSearch,Read,Write" run, because a session's Chrome tools are bound when it starts.
    • Codex prints the brief, and the orchestrator follows it in its own in-app Browser tab or with Computer Use. vibe-requirements-worker gains a precedent mode for the help centers when no browser can look.
    • The rules: nothing that exists is touched, test data goes only in a private zz vibe precedent check (temp) project with zz test tasks that is deleted and confirmed gone, and connect, invite, share, pay and settings flows are canceled at their confirmation step. Every state is verified before it is recorded, direct observation is kept apart from help centers, and an unsettled situation is reported undocumented.
    • The answer and its source go into the session decision table as a default, never a human ruling or copy.
  • Visual QA during the session (quality-loop.md new section). The offer comes at visible milestones, with exact wording for each basis and a visual-qa:<request ID> key in session-questions.mjs. A polish request runs it without asking, and a decline skips it. It runs between requests after a deploy, never inside a request's build, and its findings go to the same writer as one fix request. The handoff skill's visual QA uses the same basis.
  • Reconciled text. Sentences saying visual QA runs only at handoff are reworded in the vibe skill, guardrails.md, the change worker and the README. The reference check stays the loop's one exception. The communication rules now list the version check and the visual QA offer as allowed messages.
  • Release. vibe 1.0.52 to 1.0.53 (both manifests), CHANGELOG entry.

Conflicts with existing rules (resolved by following the literal ruling)

  • "Plugins and tooling" forbade any plugin update. Now: one exception, the update the person chooses at startup.
  • The 2026-10-13 lean-loop ruling said visual QA runs only at handoff. Now: also during the session on the person's opt-in or a polish request, outside the loop. test_vibe_test_repair_lean_loop_contract.py follows: "run at $handoff, never during the loop", and the QA skill names stay out of the lean loop section.
  • "A decision is settled only when it traces to a human statement." A precedent is recorded as a default, not a settled ruling, and a later human statement supersedes it.
  • Owned prototype sessions keep their canonical single design review at handoff, so the in-session offer applies to app sessions.

Commands run

uv run pytest plugins/ -q                      # 2352 passed, 3 skipped
node --test <every plugins/**/*.test.mjs>      # 412 pass (CI's node-tests job)
uv run ruff check . && uv run pyright          # clean
cd tools/plugin-manifests && npm test          # 6 pass
  • plugin-version.test.mjs (8 cases) and precedent-check.test.mjs (6 cases) cover outdated, current, newer and unreachable installs, both harnesses and the brief's rules.
  • test_vibe_visual_qa_precedent_version_contract.py (11 cases): all 11 fail on 1.0.52.

Evals: 15 new cases tagged precedent, visual-qa and version-check. They use Claude (claude plugin eval, Sonnet) and Codex (evals/codex/run.py), and the Codex count test moves to 48.

  • All 15 pass in both harnesses here.
  • On 1.0.52, the visual QA offer and polish cases, the outdated and unreachable version cases and the Asana-first case fail in both harnesses.
  • The graph-answered, no-precedent, small-edit, declined and current-version cases pass on 1.0.52 too, as expected.

- Every $vibe start compares the installed vibe with claude-plugins
  main (scripts/plugin-version.mjs), asks keep going or update when it
  is older, runs the harness's update commands on the person's choice
  and asks for a reopen; an unreachable check carries on and says so
- Product questions go through a precedent check first: Asana, then
  another established app with the same flow, then public help
  centers (scripts/precedent-check.mjs, a headless claude --chrome run
  in Claude Code, the in-app Browser in Codex), with safety rules for
  test data and the source recorded in the session decision table
- Visual QA is offered at each visible milestone and runs on a polish
  request, against the acceptance criteria when the ticket or PRD has
  them and the design pack's best-practice review otherwise; the
  build loop is otherwise unchanged
- vibe 1.0.53, contract tests, script tests and 15 eval cases

Testing: pytest plugins/ (2352 passed), node --test over plugins/
(412 pass), ruff and pyright clean, plugin-manifests tests; new eval
cases pass in Claude and Codex
Risks: the update path runs plugin commands, only on the person's
explicit choice
@shafty023
shafty023 merged commit af13de9 into main Oct 16, 2026
10 checks passed
@shafty023
shafty023 deleted the feat/vibe-visual-qa-precedent-version-check branch October 16, 2026 21:44
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