Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,26 @@ All notable changes to the claude-plugins project will be documented in this fil

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Entries are listed newest-first; each plugin section is treated as released when merged to `main`.

### vibe v1.0.54

#### Changed
- Lessons from the reviews of the first two vibe feature pull requests in symphony-alpha (#8885 grouped list sections, #8886 bulk add tag), operator ruling, 2026-10-16. Each lands in the section that owns the behavior; where a rule already existed and was not followed, the owner now runs a concrete check and quotes its evidence.
- Guardrails reviewer: reuse (check 1) greps `packages/app/shared`, `shared/auth` and the existing `use-*` hooks before accepting a new hook, helper or inline query; copy (check 4) blocks a second spelling of wording a shared helper renders; conventions (check 7) block any `as` cast, stories included, and a URL, storage or route key literal that a shared constant exports or that web and Desktop spell separately; shared owner (check 8) runs a slot-without-an-owner check (two children each holding selection state behind the parent's slot, the ISS-12137 red flag), a private-copies check, and a leftovers check over every deleted, renamed or extracted file (pass-through files, re-export aliases, orphaned exports, unused props, one-arm loops); tests and checks (check 9) block a new gate, validator or widened shared test helper nobody asked for, report tests named after deleted modules, and in a pull-request turn block expected values computed by production code; Storybook (check 10) reads compile-only repairs word by word, blocks more than one Version History entry or a duplicate-key special case, blocks a whole-page flow filed as a Composite, and blocks every story ID the session lost and every reference to an old ID still in e2e specs, tests or docs. New check 13 inspects every main-sync merge for capability removal against main's side, and new check 14 reads the linked tickets' comments before a flag is retired and treats a recorded hold with no human answer as a blocking engineering decision.
- Adversarial reviewer: acceptance criteria are attacked per surface (each view, web and Desktop, and the mechanism the words require, such as a URL), selections must account for every selected row, gates follow host capability rather than page data and match on web and Desktop, and server enums are parsed per row for version-skewed clients.
- Storybook decomposer: PRD-required states go on the consumed component's stories, windowed fixtures come from the real paging helper, story names say only what the story shows and asserts, and handoff mode reports lost story IDs with the `rg` hits for each old ID and the Version History entries.
- Change worker: greps shared owners and existing hooks first, reads linked-ticket comments before deleting a flag, never resolves a main-sync conflict by removing what main ships, accounts for every selected row and settles unspecified handling through "Precedent before asking", cleans up every leftover of an extraction, keeps one Version History entry and prose-free compile-only repairs, and in a pull-request turn writes every missing test in its owning lane, with literal oracles, acceptance criterion lineage, and URL-synced tests through the real web and Desktop host adapters including a same-route link and Back.
- Verify worker: runs the Storybook preview sort-order tests when sidebar order or story titles change, runs touched e2e specs through the containerized `dagger call e-2-e` path, reads `.github/pr-test-event-tiers.md` before any claim about what CI runs, and checks the missing tests list for lineage, lanes and host adapters.
- `quality-loop.md`: each acceptance criterion carries a `Surfaces:` line and is met only when every surface on it has its own check; check lines name the surface.
- Nothing agent-written goes into public docs. The 2026-10-13 docs-draft exception is retired: no worker edits `apps/web/content/docs/` or the internal `docs/` folder in any phase, handoff only lists the existing pages a human needs to update on the ticket's Feature docs line, and `handoff-inventory.mjs` reports any docs change as outside the allowed paths in every phase.
- PR body files are named per ticket and read back right before `gh pr create` or `gh pr edit --body-file` (environment worker, seed PR worker and cl-execute), after one pull request's body overwrote another's in a shared scratchpad.

#### Fixed
- At session start an outdated plugin's version question comes first, on its own; the new session's endings line goes in the first reply after the person answers it, or in the very first reply when the version is current or unknown.

#### Tests
- `test_vibe_review_lessons_contract.py` (18 cases) pins each rule in its owning section and the version-question ordering; 17 fail on 1.0.53. The retired docs-draft contract tests are removed and the docs and acceptance criteria contract tests follow the new wording. `handoff-inventory.test.mjs` asserts a docs page is outside the allowed paths in every phase (fails on 1.0.53).
- Seven eval cases tagged `review-lessons` (Claude, and Codex through the runner), one per highest-value lesson: main-sync capability removal, Version History and compile-only prose, a stale story ID, the shared selection owner, a criterion checked on one surface only, an agent-drafted docs paragraph, and a flag retired against a hold. A new `pm-version-kept-then-endings-line` case and a grader on `pm-version-outdated-asks-keep-going-or-update` check the version-question ordering. One run each on this branch: Claude Sonnet 12 of 12 and Codex 9 of 9 on the new and version cases. On 1.0.53 the docs case fails on both harnesses; the other six review cases pass there too, because the prompt hands the reviewer the evidence the new checks collect, so on those cases they guard the behavior without separating the versions.

### vibe v1.0.53

#### Added
Expand Down
2 changes: 1 addition & 1 deletion plugins/vibe/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "vibe",
"description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows",
"version": "1.0.53",
"version": "1.0.54",
"dependencies": ["closedloop-core"],
"author": {"name": "ClosedLoop", "email": "support@closedloop.ai"}
}
2 changes: 1 addition & 1 deletion plugins/vibe/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "vibe",
"version": "1.0.53",
"version": "1.0.54",
"description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows",
"author": {"name": "ClosedLoop", "email": "support@closedloop.ai"},
"homepage": "https://github.com/closedloop-ai/claude-plugins",
Expand Down
24 changes: 17 additions & 7 deletions plugins/vibe/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,12 +275,12 @@ production values and local QA settings separate from each other and from the
unchanged machine-generated snapshot. Researched Product/Design/Scope Open
Questions carry sources and decision context, exclude settled answers and
engineering limitations, and state None when none remain.
The same writer edits existing product docs pages for the changed features
(`apps/web/content/docs/` only) on the branch, marked as agent drafts that
design or engineering approves before merge, and never creates a page; the
ticket lists them under Feature docs. Internal engineering docs under `docs/`
belong to engineering's pull request. This is a scoped exception to the
rule that agents do not author user-visible words. The writer also marks the
Nothing agent-written goes into public docs (operator ruling, 2026-10-16):
the writer edits nothing under `apps/web/content/docs/` nor the internal `docs/` folder and only
lists, under the ticket's Feature docs, the existing product docs pages that
describe a changed feature, for design or engineering to update; the handoff
inventory reports any docs change as outside the allowed paths in every
phase. The writer also marks the
rows the person accepted as Frozen Behavior in the session decision table that
the ticket attaches; `cl-execute` reads that attachment, keeps every frozen row
passing with tests in its pull request, and changes one only with that
Expand Down Expand Up @@ -388,9 +388,19 @@ question is asked only when neither settles it; visual QA is offered at a
visible milestone and not on a small edit, a polish request runs it before
handoff (against the criteria, or the design pack's review without them)
and skips it after the person declined; and the startup version check asks
"keep going or update" when outdated, says nothing when current, carries on
"keep going or update" when outdated (alone, with the new session's endings
line waiting for the first reply after that answer), says nothing when current, carries on
when GitHub cannot be reached, and asks for a reopen after updating.

The seven cases tagged `review-lessons` come from the reviews of two vibe
feature pull requests (operator ruling, 2026-10-16). Each rehearses one
handoff review decision from supplied session state: a main sync that turned
a shipped editable control read-only, an invented Version History entry and a
reworded compile-only repair, a stale story ID left in an e2e spec, two
children each wiring their own selection behind a shared slot, a criterion
checked on one view but not the board it names, an agent-drafted product docs
paragraph, and a flag retired while a linked ticket held it.

## Runtime Files

Version `1.0.14` contains 10 skills and 16 agents. It has no standalone
Expand Down
32 changes: 31 additions & 1 deletion plugins/vibe/agents/vibe-adversarial-reviewer.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: vibe-adversarial-reviewer
description: Separate adversarial reviewer for a vibe session's implemented diff at handoff, never during the build loop. Challenges ownership, dependencies, contract safety, states, regressions and web versus Desktop behavior with evidence. Read-only; reports confirmed findings and never implements its own fixes.
description: Separate adversarial reviewer for a vibe session's implemented diff at handoff, never during the build loop. Challenges ownership, dependencies, contract safety, states, regressions, acceptance criteria per surface, selections, gates and web versus Desktop behavior with evidence. Read-only; reports confirmed findings and never implements its own fixes.
model: opus
tools: Read, Grep, Glob, Bash, Skill
---
Expand Down Expand Up @@ -77,6 +77,36 @@ closedloop-graph is required, per `../skills/vibe/references/closedloop-graph.md
input on which the copies already behave differently. That divergence is
a finding; a copy that still agrees is the guardrails reviewer's, not
yours.
8. Acceptance criteria per surface (`quality-loop.md`, "Acceptance criteria
before ready"; operator ruling, 2026-10-16, after the board's collapse
state in symphony-alpha #8885 was not URL-backed although its criterion
required it): for each unsuperseded criterion, list every surface it
names (each view, such as list and board, and web and Desktop where their
adapters differ) and every mechanism word it uses (a URL, a saved view, a
reload, a link, Back). For each pair, find the code that delivers it on
that surface. A surface with no such code, or whose only `### Checks`
line traces a different surface, is a finding naming the criterion ID,
the surface and the missing path.
9. Selections and bulk actions: an action over selected rows must account
for every selected row, including the ones it cannot act on (ineligible,
another type, already done, offline). Trace a mixed selection through the
action: a row silently dropped, or a count that disagrees with what was
selected, is a finding. When the ticket and PRD do not say how ineligible
rows are shown, that is a product question the writer settles through
`quality-loop.md`, "Precedent before asking", escalating only when that
fails; never a guess you or the writer fills in.
10. Gates: an action is gated on the host's capability (the adapter or port
that says the host supports it), never on page data that happens to be
present; a gate that reads row data or a loaded list to decide whether
the host can act is a finding. For each new or changed action, list its
gates on web and on Desktop (flag, permission, capability, offline): a
gate one host has and the other lacks is a finding, quoting both.
11. Version skew: a server enum or status parsed for a whole response (one
`z.enum` over the array, a switch that throws) lets one unknown value from
a newer server break every row on an older client. Parse it per row with
a safe fallback for an unknown value (root `AGENTS.md`, Cross-Repo
Compatibility Requirements); a whole-response parse is a finding with the
unknown value that breaks it.

## Output

Expand Down
Loading
Loading