iampawan/pocketfm-manifest
PocketFM's portable PRD-to-production workflow: Ready Check, contracts, implementation, verification, launch, and postmortems.
Changelog
All notable changes to Manifest. Versions follow semver. Install a
specific version by tag rather than tracking main, so your team gets
reproducible behavior:
/plugin install manifest@manifest # pulls the tagged release in the marketplace
Every findings file records the pluginVersion that produced it (see
CRITIC-PROTOCOL.md), so you can always tell which version verified a
given contract.
[0.43.0] - Portable contract and delivery cores
Expands the portable MCP from individual gates into executable lifecycle state machines that any connected agent can use consistently.
- Contract core: pickup planning, deterministic validation, full verification artifact generation, status, and confirmation-gated/idempotent Jira sync plans.
- Delivery core: resumable implementation state, PR-to-AC verification, schema-gated code-review artifacts, and hard-capped contract/self-review/PR fix loops.
- Jira and GitHub credentials stay with the connected agent. The shared MCP emits stable connector calls and state patches; it never stores secrets or silently performs external writes.
- Adds direct tests for every core operation, invalid critic output, Jira update versus create behavior, PR evidence gaps, implementation resume, and cap exhaustion.
[0.26.1] — Fix: the pinned Ready Check panel now reliably self-updates
The Cowork sidebar panel is a saved snapshot — Cowork never re-reads the plugin
file, so the panel only refreshes when the skill calls update_artifact. Two bugs
kept that from happening: the reconciliation ran only on /ready-check panel, and
it tried to read the build number "from the artifact's path" (impossible), so a
newer build was never detected.
- The
ready-checkskill now reconciles the panel on every Cowork run (create if missing; update when the bundledready-check-buildis newer), reading the build number from the file's<meta>tag — not the path. A pre-build-tag artifact is treated as stale and refreshed. - Documented the real model: "auto" means "on your next
/ready-check," and the panel is only ever as new as the installed plugin — so a stale panel usually means the plugin itself needs updating first. - Panel version label + build bumped (build 70) to match.
[0.42.0] — One-command setup for any platform
Makes 0.41's portability actually reachable — generating AGENTS.md was possible,
now it's offered during setup and documented for every tool.
docs/INSTALL.md— step-by-step install for Claude Code, Cowork, Cursor, Codex, Gemini CLI / Antigravity, Copilot, Windsurf / Aider / Zed, CI, and "no AI tool at all". Every command in it was executed and verified, including the documented exit codes (0valid ·1stale ·2unverifiable).setup-initnow offers to installAGENTS.mdinto the repo (Step 6c). It respects zero-footprint mode (never writes to a team repo the user opted out of) and appends rather than overwrites an existingAGENTS.md— someone else's agent config is their document.AGENTS.mdanddocs/INSTALL.mdadded to the docs hub; README now points non-Claude users to the install guide up front.
[0.41.0] — Works outside Claude: Cursor, Codex, Gemini CLI, Copilot, CI
Not everyone on the team has Claude. Manifest's value was already portable — the gates are plain Node — but nothing told other tools how to use them.
AGENTS.md, the Linux-Foundation-stewarded standard read natively by Codex, Cursor, Copilot, Gemini CLI, Aider, Windsurf and Zed. One file at repo root and Manifest works in all of them.- Generated, not hand-maintained —
scripts/build-agents-md.mjsbuilds it from the engine'sRUBRICandplugin.json, so it can't drift.--checkfails if it's stale; an eval test enforces the same. Deliberately compact (~157 lines): the core PM/dev workflows only, since every tool loads it into context on every run. - Cross-tool trust. A gate code minted by a PM in Gemini verifies identically for
a dev in Cursor and for CI — it's a hash computed by Node, not a model judgement.
Verified end-to-end using only the documented commands: score → 11/11 → write-back
→ freeze → hand-off → verify
VALID→ tamper →STALE. - Ready Check needs nothing installed. Confirmed
ready-check.mjshas zero dependencies — a single file plus Node 18+ is the whole PM-side gate. (Only the contract/repo tooling needsjs-yaml.) AGENTS.md says so, lowering the barrier for non-dev teammates. - Teammates with no AI tool at all can still clear the gate via
gate/prd-readiness-gate.htmlin a plain browser — same rubric, same code format.
[0.40.0] — The PRD stays complete, and anyone can verify a hand-off
0.30.x made hand-offs tamper-evident. This release closes the two gaps that were left: answers a PM gave in chat never made it back into the PRD, and verifying a hand-off was awkward enough that people wouldn't bother.
The PRD no longer goes stale behind the hand-off
- Answers given in chat are written back into the PRD. When a PM unblocks a gap
by replying ("here are the analytics events"), that answer used to live only in
the conversation and the hand-off — the Confluence/JIRA doc stayed incomplete, so
a dev reading the PRD never saw it.
--addendum <answers.json> [by]renders just the newly-supplied items (flaggedaddedInReview), stamped with the gate code, to append to the source page/ticket. Never overwrites — the PRD is the PM's document — and the skill asks first. - Write-back can't cause a false alarm. Appending changes the document's bytes,
which would otherwise trip
STALE-SOURCE. Two defences: the skill writes back before minting the hand-off and re-fetches the version, and--hashnow strips any Ready Check addendum (stripAddendum) so appending — even twice — leaves the content hash byte-identical, while a genuine edit to the PRD body still tripsSTALE-SOURCE. (The gate code was never at risk: it hashes the answers, not the document.)
Verifying a hand-off is now trivial
- Verify from the link — nothing to paste.
--verifyaccepts a whole ticket or page dump and locates the hand-off block inside it (extractHandoff), so a dev can point at the ticket instead of hand-copying and risking a clipped block. - A gate code alone now explains itself. Pasting only
RC-XXX-######used to return a confusingNOT-READY; it now reportsUNVERIFIABLEwith the reason — the code is a hash of the answers, so without the• [id] …list there is nothing to check it against. - Three routes, none needing the panel: paste in chat (
/ready-check verify),/contract pickup(automatic), orready-check.mjs --verifyin a terminal.
37 engine tests (was 34), including regressions pinning "append ≠ drift, real edit = drift" and block-extraction from a noisy ticket.
[0.30.2] — Verifiable hand-offs: catch hand-written blocks, Confluence tiny links, real freeze pins
A real hand-off turned up in the wild with no PRD-Hash, a Source: line missing
its version, and no answered-items list. --verify reported a confusing
NOT-READY; the truth was that the block had been hand-written by the agent
instead of emitted by --handoff, so there was nothing to verify it against.
--verifynow names the real problem. If a block claims PASSED but has no• [id] …item list, it reportsUNVERIFIABLE — not produced by --handoff(exit 2) and calls out the missing freeze stamp / PRD-Hash, instead of a misleading NOT-READY.- Every hand-off now says how to check it — a "Check by hand:
ready-check.mjs --verify <block>.txt" line, in the engine and both gates. - Half-stamps fail loudly.
--handoffwarns whenfreezeis set butsource.versionis missing — that combination doesn't parse, so drift-detection would be silently skipped. - Skill hard rule: never hand-write, retype, reformat, or summarise the hand-off — it must be the verbatim engine output, with a self-check list before pasting.
- Confluence tiny links now work. The
…/wiki/x/<id>form PMs copy from the Share button has no numeric page id, and the fetch required/pages/<digits>— so those links were rejected outright. Both fetch paths now accept either shape (getConfluencePagetakes a tiny-link id aspageIddirectly). - Confluence had no usable version to freeze against. This MCP returns only a
relative
lastModified("yesterday at 5:35 AM"), whose meaning drifts with time — pinning it would give false STALEs. New--hash <file>computes a content hash of the fetched body to use assource.version; re-fetch + re-hash at pickup catches any edit. (JIRA still uses the issue'supdatedtimestamp.) - Verified end-to-end on a live PRD (
…/wiki/x/Z4IElg): 11/11 → gate code →VALID; weakened metric →STALE; widened scope →STALE; page edited →STALE-SOURCE; Figma changed →STALE-DESIGN; nothing changed →VALID.
[0.30.1] — Tamper-evidence hardened: N/A reasons are hashed, chat hand-offs are frozen
Two integrity gaps found while auditing the hand-off after the chat-first change.
- An N/A justification could be rewritten without invalidating the gate code.
nahashed as the bare tokenna, ignoring its reason — so "N/A — internal service" could be edited in the hand-off and still verify asvalid. N/A now hashes with its reason (like waivers), in the engine and both JS ports; engine↔panel parity re-verified. ⚠ This changes the code for any PRD containing an N/A item — previously-minted codes with N/A goSTALEand need a re-check. - Chat hand-offs carried no freeze stamp.
--handoffhad no way to receive the fetched source version, soSource:/PRD-Hash:were omitted and pickup silently skipped the "PRD document edited after sign-off" check.--handoff <answers.json> [freeze.json]now accepts it, and the skill passes it whenever the PRD came from a fetched source. - Verified end-to-end: untouched → VALID; answer edited → STALE; N/A reason edited → STALE; code swapped → STALE; source doc bumped v12→v13 → STALE-SOURCE.
[0.30.0] — A genuinely panel-like scorecard in chat (progress bar, gaps-first, fix-by-reply)
Builds on the chat-first direction with a much more UI/UX-friendly scorecard.
- Redesigned scorecard (
ready-check.mjs --scorecard): a visual progress bar (▓▓▓░░░░░░░░ 3/11), a gaps-first "To fix" list — numbered, each with a concrete prompt (e.g. "Success metric — a number + window ("+6% in 4 weeks")") so the PM knows exactly what to write — then grouped Answered / N/A / Waived sections with each item's value, and the gate code on a pass. Optional items show as "+ Also noted". - Fix by number or free text. The card ends with a reply hint; the PM answers "2: …; 4: …" or in plain language, the skill folds it in and re-renders, and the bar fills. Read like a panel, fix like a chat.
- Rubric gained
shortlabels + per-itemaskprompts to power the card. - Panel version synced to 0.30.0 (build 78); 33 engine tests green.
[0.27.0] — Chat is the front door: a live, panel-like scorecard you fix by replying
The most reliable Ready Check experience is /ready-check <link> in chat — it has
full connector access, the real model, and none of the sandbox limits that made
the sidebar panel flaky. So the chat flow now feels like the panel.
- Scorecard renderer (
ready-check.mjs --scorecard) — a clean, deterministic, panel-like status: the verdict, every item's state (✓ answered / ◦ N/A / ≈ waived / ✗ needed) with its answer, and exactly what's left to add. Same format for every PM. - Edit-by-reply loop — the skill shows the scorecard, lists only the gaps with concrete prompts, and the PM fixes them by just replying ("metric is +6% in 4 weeks", or "N/A: writer — internal service"). The skill folds it in, re-renders, and the score climbs — read like a panel, fix like a chat.
- Panel repositioned as optional. The sidebar artifact stays for PMs who want
an always-open surface, but chat is now the recommended path; when the panel
misbehaves, the answer is "run
/ready-check <link>in chat." - Short rubric labels added for the scorecard; 33 engine tests (was 32).
[0.26.7] — Robust per-user Atlassian: the connector id is baked into the panel
0.26.6 removed the hardcoded id and had the panel read its connector from the artifact's runtime metadata — but that can be stripped from the rendered page, resolving the id to empty and breaking link-fetch (even for the person it used to work for).
- The connector id is now baked into each user's panel. The skill discovers
the user's Atlassian prefix and replaces a
__RC_ATLASSIAN_MCP__token in the panel HTML before creating/updating the artifact — no dependency on runtime DOM/metadata. Resolution order: manuallocalStorageoverride → baked id → best-effort metadata discovery. If none resolve, the panel cleanly prompts to paste the text or use/ready-checkin chat (never a wrong hardcoded id). - The skill re-bakes + re-grants the correct per-user tools on every panel reconcile, so a panel created with the wrong/empty connector gets corrected.
- Panel build → 76.
[0.26.6] — Fix: panel link-fetch worked for only one user (hardcoded connector id)
Some users saw "couldn't fetch that page/link" even with Atlassian connected, while others (the person whose id was baked in) were fine.
- Cause: the panel's Atlassian connector id was a hardcoded constant — one specific user's connector-id hash. That id is unique per user, so the panel called a tool id that doesn't exist in anyone else's session and the fetch failed.
- Fix: the panel now self-discovers its Atlassian prefix from the tools the
artifact was actually granted (Cowork lists them in
#cowork-artifact-meta, populated per user when the skill creates the panel), falling back to a manualsetAtlassianConnector()/ localStorage override. No hardcoded id. - The
ready-checkskill now re-passes the freshly-discoveredmcp_toolson every panel reconcile, so a panel first created with the wrong/empty tool list (or before Atlassian was connected) gets the correct per-user connector re-granted. - Panel build → 75.
[0.26.5] — Simpler + stable: drafts count, and the analysis is cached per PRD
Replaces 0.26.4's "confirm every field before it counts" model, which was deterministic but confusing (a fully-analyzed PRD showed 0/11 until the PM clicked through every field).
- Drafts count again — answers the review pulls from your PRD count toward the score immediately (each still marked ✨ to skim/edit), so you see a real score right after a check, not 0/11.
- Determinism comes from a per-PRD cache instead. The analysis is cached by the PRD's content hash, so re-checking the same PRD returns the same result every time — the score can't drift 10 → 8 → 6. Edit the PRD text to force a re-analysis.
- Instant, bridge-proof re-checks — a cached PRD re-checks with no LLM call, so re-checking works even when the in-panel AI bridge is flaky. Only complete analyses are cached (a timed-out partial run isn't), so a flaky first pass can be retried rather than frozen.
- Quality is preserved by the edge-case findings + editable ✨ fields, not by a gate that shows 0/11. Panel build → 74.
[0.26.4] — Deterministic score: AI suggestions no longer count until confirmed
Fixes a critical bug where re-checking the same PRD returned different scores (10/11, then 8/11, then 6/11). Cause: the LLM review auto-filled the 11 fields and those drafts counted toward the score immediately — but an LLM extracts a different set of fields each run (and long-PRD chunks sometimes time out and fill fewer), so the score drifted even though the PRD was unchanged.
- The score is now a pure function of confirmed answers. AI-drafted answers are suggestions (marked ✨) that do not count toward the score or the gate code until the PM confirms them (one click "Confirm all", or edit any field). Re-running the review only re-proposes text for still-blank fields — it never moves the number on its own. This restores the gate's stated rule ("only confirmed answers count; presence of text is not readiness") and makes the score reproducible for a given set of confirmed answers.
- Suggestion copy updated to say plainly that drafts don't count until confirmed; the confirm buttons read "Confirm — count it" / "Confirm all — count these".
- Panel build → 73.
[0.26.3] — Panel: self-documenting identity banner after a check
- After a PRD is checked, the panel shows a banner at the top with which PRD this was — the feature title, a live verdict (READY + gate code, or "Not ready · N/M"), the source (JIRA key + version / Confluence page + version / Figma / pasted text), the time checked, and a short content hash of the PRD. A screenshot of the result is now self-documenting — you can tell exactly what output belongs to what PRD. The banner clears when the PRD box is cleared.
- Panel build → 72.
[0.26.2] — Fix: panel no longer carries a previous PRD's data across reloads
- Stale-data fix (the recurring one). The panel used to persist the PRD +
answers to
localStorageand restore them on every reload. After a reload the in-memory source fingerprint reset to null, so the new-PRD guard couldn't fire and the previous PRD's answers leaked into the next one. The panel now opens on a clean slate — no cross-reload persistence — and clearing the PRD box wipes all prior answers immediately. (Answers still live in memory for the whole working session; only a full reload starts fresh.) - The version chip tooltip now tells a panel-only PM how to pull the latest build ("refreshes the next time you run /ready-check in chat").
- Panel build bumped to 71; panel version label → 0.26.2.
[0.26.0] — Ready Check works for every PRD; N/A is no longer a free pass
Fixes PM feedback that Ready Check felt frontend-only, let PMs skate past items via N/A, and (in the Cowork panel) leaked a previous run's results.
- Stack-neutral rubric. All 11 items now read for frontend, backend, API,
data, and infra PRDs —
design= design or interface/contract spec,states= user or caller (response/status codes),flows= screens/endpoints/jobs,scope= platforms or services,l10n= copy or response format,writer= writers/creators or downstream consumers,events= analytics or telemetry. Synced across the engine (scripts/ready-check.mjs), both gates (gate/ready-check-cowork.html,gate/prd-readiness-gate.html),reference/READY-CHECK-RUBRIC.md, and the skill. Backend PRDs clear by answering the backend way — not by skipping UI. - N/A now requires a reason. A bare
{na:true}no longer clears a skippable item; it must carry a reason (≥3 chars) that rides into the hand-off for dev to accept or push back. Closes the "just tick N/A" escape. The gate-code hash is unchanged (an N/A still hashes asna), so all three encodings stay in parity — verified engine↔panel. Skill now steers PMs to the backend-equivalent answer before any skip. - Fresh fetch, every run (skill). Ready Check must fetch the source given now, echo back the key/title before judging, discard a previous PRD when a new one is given, and never emit a verdict from an earlier run — fixing "it showed results for the previous PRD" and "it answered immediately from a prior run."
- Panel: no stale results. The Cowork panel resets answers + review when the PRD source changes, and invalidates the prior verdict as the field is edited.
- Panel: link fetching. Broader Atlassian URL recognition (sharable/Rovo links
and links with a little surrounding text), louder fetch-failure messages, and the
connector prefix is no longer a shipped constant — it's discovered by the skill
and overridable via
setAtlassianConnector()/localStorage.
[0.25.0] — JIRA: sharable links in, tickets out, kept live
The tracker now mirrors the whole lifecycle. New canonical reference
reference/JIRA-SYNC.md defines all of it; the skills point to it.
- Accepts any JIRA sharable link. Not just
browse/KEY— board, deep, and "Share → Copy link" URLs (…?selectedIssue=KEY,…/jira/software/.../issues/KEY) all resolve. The key is pulled by scanning the URL for the first[A-Z][A-Z0-9]+-\d+. Wired intocontract-new,contract-pickup, andready-check(which alsoToolSearch-discovers the deferred Atlassian tool before ever saying "not connected"). The Cowork panel already parsed these. - Auto-generates tickets at planning (opt-in), before implementation. The dev
chooses when: at
/contract pickup(early — update the source ticket, or create one for visibility), at/contract promote(canonical — epic + AC sub-tasks), at/contract decompose(epic + a child issue per child), or anytime on demand ("create the JIRA ticket"). It's idempotent — the key is stored in frontmatter, so a later step updates the same ticket instead of creating a second one. Tickets carry full detail — problem/goal, ACs as a checklist, design link, success metric, the gate code,duedate= SLA, labels, owner assigned, anddependsOn→ "is blocked by" links so the DAG shows in JIRA. Confirms the project key first; prefers updating the source ticket over creating a duplicate. Keys are stored in frontmatter. - Keeps tickets live during implementation.
implementtransitions the ticket → In Progress on start, posts batched progress comments, flags blockers (comment +blockedlabel + transition, @-mentioning the PM and noting the paused SLA for PM-answer blockers), and moves it → In Review on PR. Verify / launch steps comment their verdicts; a leaf child goes → Done on land. Transitions use the ticket's real workflow (never hard-coded IDs). - Degrades cleanly. No Atlassian connector, or the dev declines → the work proceeds and the skip is reported; the tracker never blocks the actual work.
Fixes
- Analytics events no longer missed on long PRDs. On a long Confluence PRD,
the smart review chunks the text and reviews chunks in parallel; if the chunk
holding the events section timed out or the model didn't map its table onto the
eventsfield, the events were silently dropped. Now a deterministic backstop extracts event names from an explicit "Analytics Events / Events to Capture / Instrumentation" section (high-precision — needs a section header + real event ids), the review prompt calls that section out, and the panel warns when a chunk fails instead of showing a field blank with no reason. The offline page's auto-fill uses the same extractor, so both surfaces filleventswith the real event names rather than a bare heading line.
[0.24.0] — Offline page refreshed for 2026; Cowork connector-discovery fix
- Fix: "Atlassian isn't connected" false negative in Cowork. Connector tools
are deferred in Cowork (not in the tool list until loaded via
ToolSearch), so/ready-checkon a Confluence/JIRA link wrongly reported the connector absent and asked the PM to paste. Ready Check's Phase 1 now searches for the fetch tool first (getConfluencePage/getJiraIssue/ …) and only asks for a paste if ToolSearch genuinely returns nothing — it never claims "not connected" without checking. - Panel UX + UI redesign. Cleaner, more professional Cowork panel: a redesigned numbered flow map ("you do steps 1 & 3"), labeled example buttons and tighter step-1 hierarchy so the primary action dominates, a progress-filled stepper, bigger buttons, and a flat treatment — the gradient logo and button glow are gone. Both surfaces share one consistent, flat, indigo look; the panel's engine and logic are unchanged.
- Offline web page, refreshed for 2026.
gate/prd-readiness-gate.html(the no-sign-in browser version) gets the modern UI: an indigo palette with softer shadows/radius, the same top-of-page flow map, the Playbook (header modal + inline "strong vs. weak" on every question), "Your feature, in plain terms" renamed to "Your answers", and a note pointing to the Cowork panel //ready-checkfor the smart review and design audit. The deterministic engine (djb2 /normAnswers/gateCode/ hand-off) stays byte-identical to the panel andready-check.mjs, so a code minted offline still verifies dev-side (guarded byverify_all.mjs).
[0.23.0] — Ready Check panel: real gate, Playbook, Verify, draft-from-idea
-
Gate-focused panel + clear end-to-end flow. The panel is now purely the gate + hand-off (removed Generate-PRD / publish). Step 3 shows what happens next and a top-of-panel flow map makes the whole path explicit: PM Ready Check → hand-off → Dev
/contract pickup(deep findings) → PM fixes → grooming → Dev/contract promote→ build./ready-check(Level 1, text) and/contract pickup(Level 2, code) are complementary, not either/or. -
Auto-fill from the PRD. Since the PM wrote the PRD, AI-drafted answers fill the fields and count immediately, each marked ✨ to verify — no manual "keep".
-
FLOW.md— one "who runs what, when" map. A single authoritative reference for the whole lifecycle (PM → Dev → Lead → Auto): a step-by-step table (who, which command, the trigger, the output), a 30-second "which command do I run?" guide, the Level-1 vs Level-2 distinction, and how accountability is baked in. Linked from the README and/manifest. -
Multi-person feature rollup.
/contract decomposenow assigns each child anowner+repo(fromrepos.yml), so "2 FE / 1 BE" maps onto real children/people. New engineepicRollup(+--rollupCLI, 4 tests) computes per-child state (landed/blocked/ready/in-flight), who'sblockedBywhom, the critical path, and the feature is "landed" only when every child lands./status <epic>renders it — the one-glance view grouped by person, leading with the finish line and any cross-child block. -
PM accountability ledger. New engine helpers
ballLedger/effectiveSla(+--ledgerCLI, 6 tests): the SLA clock pauses while "blocked on PM", so a dev is never shown overdue for time a thin PRD left the ball with the PM. Pickup records the ball log + bounce count;/statusleads with who holds the ball and the effective (PM-paused) SLA. The gate code +promptedByare the PM's attributed sign-off; waivers are risks the PM explicitly accepted. -
Deterministic gate. The hand-off/gate code unlocks when every basic is confirmed — nothing else. The smart review (suggestions + gap findings) is a helper, not a gate: its findings are advice, and a slow/flaky review bridge can never lock the PM out. Presence of text no longer counts as readiness — only confirmed answers do — so the same answers always give the same result.
-
No more keyword-stuffing. Pasting a PRD no longer dumps raw heading fragments into the answer boxes. Only the smart review fills a field the PRD genuinely covers, blank-only, ≤16 words — so every filled answer is real.
-
Playbook. A "good vs weak" reference for all 13 fields — a header modal, and an inline "see example" on every field.
-
Verify a pass (dev). Paste a hand-off → authentic / tampered / not-ready / invalid. Give it the PRD as a JIRA/Confluence link and it fetches the live doc to check source-version drift and content hash — the same freeze check as
/contract pickup, in the panel. The engine verifier is ported in and parity-checked againstready-check.mjs. -
Hand-off carries a content hash (
PRD-Hash:) alongside the source-version and design-version pins, so edits are caught even within the same version. -
Draft-from-idea on-ramp. Describe an idea → a starter PRD skeleton drafts into the box (metrics/design left as explicit TODOs) to refine, then gate.
-
Readiness score ring (% of basics covered) and strong/weak sample framing; staged loading messages; connection status dot (green live / red not connected) replacing the old "live" text.
-
Figma design-freeze is live — the
figma-restget_file_versiontool is wired into the panel, pinningDesign-Version:at sign-off. -
Design audit. New
figma-restaudit_designtool reads the linked Figma file and flags design-readiness gaps — missing mobile/web frames (vs the PRD scope), missing error/empty/loading screens, and placeholder/unfinished copy. Placeholder copy + mobile-missing-when-scoped are blockers; missing states are warnings. Runs in the/ready-checkchat flow and, on the dev side, in/contract pickup(Phase 2c), which pairs the audit with a design freeze/drift check (get_file_versionvs the pinnedDesign-Version:→ STALE-DESIGN) and routes designer/PM-only gaps into the "PM must answer" bucket. The sandboxed panel can't reach a local connector, so it defers to these flows. 15 audit unit tests. -
Deterministic readiness score. The LLM's field-fills are now suggestions ("Use this" to keep) that never count toward the score or gate code until you confirm them. Same PRD + same confirmed answers ⇒ the same number every time, so PMs can trust it. The Figma link is pulled from the PRD deterministically. Answers persist across panel reloads. Determinism is covered by new harness checks (suggestions can't change the code or clear the gate).
-
Desktop-extension packaging.
figma-restships as an installable.mcpb(manifest with a keychain-encryptedFIGMA_TOKEN); the audit response drops the bulky per-screen list. The panel auto-detects the connector's tool namespace. -
Verification: 55-check parity + verify-port harness and 23 engine tests green.
[0.22.0] — Freeze the PRD & design after sign-off (+ Confluence, PRD generation, JIRA publish)
- Freeze the PRD. The hand-off pins the source doc's version
(
Source: jira|confluence <id> v<version>) + a content hash./contract pickuprunsready-check.mjs --verify-freeze→VALID / STALE-SOURCE / STALE-DESIGN / STALE-CONTENT, so a PRD edited after clearing is caught. - Freeze the design. A bundled, dependency-free
figma-restconnector (tools/figma-rest-mcp/, read-only Figma token) pins the Figma file version (Design-Version:); pickup flags a design changed after sign-off. Ships with the plugin viamcpServers— no npm install/publish. - Confluence + JIRA fetch in the panel — paste a page/issue link and it loads.
- Generate PRD + publish — a clean 11-section PRD from the answers; copy, or publish to JIRA (append to the linked ticket / create a new one).
- UX refresh — numbered steps, a staged PRD panel, indigo accent, clickable findings that jump to the field, rotating progress messages, hardened re-run and clipboard copy.
- Setup docs —
gate/SETUP.md(PM quick-start + admin),gate/FIGMA-TOKEN.md(2-minute token guide),gate/V0.22-FREEZE-SPEC.md. - Engine:
prdHash,verifyFreeze,renderPrd,--prd,--verify-freeze. 153 unit tests + cross-surface parity, all green.
[0.21.0] — Ready Check: a PM-side readiness gate before dev grooming
"Airport security for PRDs." A first, cheap gate the PM clears before engineering estimates — so dev stops chasing PMs for basics and stops eating the delay when a half-baked PRD moves mid-sprint.
- New
/ready-check <source>(alias/ready). Give any source — a JIRA / Notion / Doc / Slack / Figma URL, pasted text, an image, or a plain description — and Ready Check scores it against the Definition of Ready (11 required items), surfaces the blockers a PM can fix themselves in plain language, and (when ready) mints a gate code + a clean hand-off for dev. Runs identically in Claude Code and Cowork. - Deterministic engine
scripts/ready-check.mjs. Presence + specificity scoring, a tamper-evident gate code (djb2 over the normalized answers), and hand-off render/parse. Mirrorsvalidate.mjs: deterministic layer, with the skill's judgement layer on top. - "No code, no grooming" enforcement. The gate code is content-bound, so
ready-check.mjs --verify <handoff>returnsVALID | STALE | INVALID.contract-promoterecordsreadyCheck:and refuses a contract without a valid one. - Offline web page (
gate/prd-readiness-gate.html) for PMs with no Claude open — same rubric, same gate-code algorithm, so a web-minted code verifies dev-side. Cross-port parity is pinned byeval/ready-check.test.mjs. - Code-aware, no repo access. When
.manifest/.cache/code-context.jsonexists, Ready Check adds non-blocking notes (event-naming drift, extra surfaces a flow touches) from the published digest — no source credentials. - Live smart check with no backend (Cowork artifact).
gate/ready-check-cowork.htmlis a Cowork artifact: the deterministic gate runs in-page and the edge-case review is done by Claude live viawindow.cowork.askClaude— Cowork is the backend, no server or API key. Same gate-code algorithm as the engine, so codes still verify dev-side. - Edge-case checking moves to the PM. The skill's judgement pass runs the edge-cases critic (plus clarity / comms / instrumentation) to surface real missing cases, not just field presence. Depth scales with access: text-only → code-context cache → opt-in read-only repo access.
- Waivers. A PM can proceed without an item by waiving it with a written reason; the waiver is hashed into the code and surfaced in the hand-off for the dev to accept or push back. Empty waivers don't clear.
- Auto-verify on pickup.
/contract pickupverifies the Ready Check code itself — the dev runs nothing extra; the PM is the only one who handles it. - Practical extras. Dark mode, a Do's & Don'ts panel, a flat professional
UI, and two annotated example PRDs (
gate/examples/PRD-good-*,PRD-bad-*). - Cowork panel maturity. One-click "Check my PRD" (Claude extracts fields +
finds edge-case gaps in one pass), rotating progress messages, clickable
findings that jump to the field, waivers with justification, an empty-input
guard, robust clipboard copy, and a self-refresh build stamp. The connector
for optional JIRA-link fetching is a single
ATLASSIAN_MCPconfig line; set it per workspace, or leave empty to disable. - Generate the PRD + publish to JIRA.
renderPrd/ready-check.mjs --prdcomposes a clean 11-section PRD (with gate code + waivers) from the answers. The panel adds Generate PRD / Copy / Publish — publish updates a linked ticket (appends the PRD) or creates a new one from a project key. Same generation is available in Claude Code via the skill. - Rubric:
reference/READY-CHECK-RUBRIC.md. Level 2 (deep, code-grounded) is still/contract pickup, dev-side, after the gate is green.
[0.19.0] — self-tuning models: smart routing, advisor escalation, cost observability, and a learning loop
The system now chooses the right model for each task itself, escalates the hard calls to a stronger model, measures its own token cost, guards its own determinism, and learns from each incident — without anyone having to pick a model. The consistent rule: everything non-deterministic (model-choice variance, the advisor, token cost) is kept strictly out of the verdict path, so the "verdict is computed, not judged" property is unchanged.
Added
-
Smart per-critic model routing (
computeModelPlan). The validator now emits amodelPlanthat assigns each critic a model deterministically from the contract'ssizing— light critics on a fast model, heavy critics (regression/security/scalability) on a strong model only when the contract is large/risky (8+ behaviors, 3+ platforms, or an auth/billing/ migration flag). A trivial fix verifies cheap; an auth-flow change across three platforms automatically pulls the strong model onto the heavy critics. Nobody picks a model. Override per-critic withconventions.criticModelsinrepos.yml. Routing is pure code over an already-deterministic input, so it's reproducible — not an LLM classifier. -
/advisorescalation. The Implementer (the token-heaviest step) can pair a mid-tier main model with a strong advisor it consults at decision points — before committing to a plan, before declaring done, when a fix loop is stuck. Opt-in via theMANIFEST_ADVISOR_MODEL/MANIFEST_IMPLEMENTER_MODELrepo variables inpr-verify.yml(Anthropic-API only; unset = unchanged). Critics may also consult the advisor on borderlinewarning/infocalls only, opt-in viaconventions.criticAdvisor— never blockers (enforced; see below). -
Cost / token observability (
/manifest cost). A deterministic rollup (validate.mjs --cost) prices recorded tokenusagefromreference/model-pricing.jsonand reports spend by complexity, model tier, and critic, across both verify critics (findings.json) and the Implementer (<ID>.implement.json). This closes the loop on routing — you can measure whether tiering and the advisor actually saved money. Usage is observability only: never a gate or provenance input. -
Finding-stability / variance tracker (
recall.mjs --stability). Scores N repeated runs of a fixture — per-gap hit rate, run-to-run stdev of required recall, and a flaky-gap list — failing if a required gap drops belowstabilityThreshold. Guards the judgment layer against drift introduced by per-tier model routing. Opt-ineval.ymlsweep gated onMANIFEST_STABILITY_RUNS(off by default — it multiplies LLM cost by N). -
Postmortem → bug-pattern learning loop. When
/postmortemfinds a diff-detectable bug class, it proposes a candidate inreference/bug-patterns.candidates.md(staging — unenforced). A maintainer promotes accepted patterns intoBUG-PATTERNS.md, wherecode-reviewenforces them on every future diff, so the same class of bug can't ship twice. Safety: human-accept gate +warning-until-proven default. A deterministic catalog validator (--check-patterns,--next-pattern-id) guards structure (well-formed entries, unique + monotonic ids) and runs in CI. -
Context-compaction resilience for long Implementer runs. Multi-hour runs overflow the context window and the runtime auto-summarizes lossily. The Implementer now externalizes its working state to
<ID>.implement-state.json(AC status, files touched, decisions), checkpoints after every behavior, and re-reads spec/plan/state files as ground truth instead of trusting summarized memory.validate.mjs --implement-status <ID>recovers what's done and what's left in ~100 tokens after a summarization and makes runs resumable. Schema + status unit-tested. -
Compact critic rule digest (
CRITIC-RULES.md) — cuts input tokens ×N. The ~9 critics fanned out per verify each re-read the fullCRITIC-PROTOCOL.md(≈290 lines) every run. They now load a compact digest (~70 lines) with only what's needed to emit valid output — schema, severity enum, ID prefixes, determinism caps, anti-patterns, framing, the advisor constraint. The full protocol stays the source of truth for orchestrator/maintainer concerns (provenance, cost, model pinning); a test enforces the digest can't drift from the validator's enum/prefixes/caps. The orchestrator also passes critics the spec content, not the machine provenance/sidecars.
Changed
-
Findings provenance schema → v2 (
protocolVersion1 → 2).verifiedWithnow records a per-tiermodelsmap +complexityinstead of a singlemodelscalar, because critics run on different models. Documented inCRITIC-PROTOCOL.md. Compatibility: this bump invalidates v1 verify caches by design — a findings file written under the old schema can't say which model produced each finding, so the next verify re-runs. No action needed; it self-corrects on first re-verify. -
The promotability gate stays deterministic even with the advisor.
validateFindingsnow rejects any advisor-influenced finding (metadata.advisorConsulted: true) that is ablocker. Advisor escalation is structurally confined to the advisory layer, so the gate (zero open blockers) is never influenced by a non-deterministic call. Enforced in code and gated by--check-findingsin CI, not just documented.
Notes
- Token
usageblocks populate only when the runtime exposes per-subagent token counts; when unavailable the block is omitted and everything else is unaffected. - Design rationale for the whole release is in
docs/proposals/model-tiering-and-advisor.mdanddocs/proposals/next-features-roadmap.md.
[0.18.2] — code quality hardening + dashboard-style PRs + plain-English comments
Driven by Cursor BugBot findings on the first Manifest-shipped PRs.
Three categories of bug were slipping past code-review and getting
caught in PR review instead. This patch closes them at three layers
(spec, implementer, critic) and reshapes the PR body so reviewers
read a single dashboard, not scattered comments.
Changed
-
critic-edge-cases: new state-machine consistency check. Catches contracts that contradict themselves about the same state transition (e.g. "only tap/Esc/blur ends the session" alongside "errors stop the session"). For every named transition the contract mentions, the critic now enumerates every statement about it and flags disagreements as blockers when the spec is genuinely undecidable. The "rapid double-action" finding also escalates from warning to blocker when no concrete guard (AC / outOfScope) is named — race conditions on rapid clicks were the second Cursor-flagged pattern. -
code-review: three new high-recurrence patterns added to the checklist. Each catches a real Cursor-flagged class:- Empty catch followed by state mutation / analytics / side effects that assume the try block succeeded → blocker.
useStateflag used as a race guard (handler reads stale state across rapid double-clicks) → warning withuseRef/disabledfix suggestion.- No-op error handling (caught and not re-thrown, logged, or surfaced) → warning, blocker when hiding user-visible failure.
-
code-review: findings now require plain-English fields. Output schema gainsplainTitle,whatHappens,whyItMatters,theFix,codeSnippetalongside the legacymessage/suggestion. Findings render in the four-part style fromreference/PR-COMMENT-STYLE.md— a busy reviewer (or a PM, or a junior dev) can act on a finding in 10 seconds. No more "useState flag used as concurrency guard" as the lead. -
implement: pre-write reconnaissance is mandatory. Before creating any file or symbol, the implementer must (a) grep for existing matches in the target repo, (b) read 1–3 sibling files in the target folder to learn conventions, (c) consult.manifest/.cache/code-context.jsonfor existing events / i18n / flags / shared modules / similar past contracts. The recon findings go into the PR body so the reviewer can see what was checked. This is the single change that prevents duplicate-utility and convention-mismatch bugs. -
implement: mandatory pre-push self-review pass. The implementer now runs thecode-reviewcritic on its own diff before the first push. Max 2 fix iterations to clear blockers in-place; if anything remains, push with a self-review comment naming the open issues. Catches the empty-catch / race / no-op-error class before CI does. The implementer's own self-review summary becomes a section in the PR body so the reviewer can see what was caught and fixed. -
implement: PR body becomes a dashboard. New required template with sections: "What this PR does" (plain English), Contract + SLA + acceptance criteria count, Mermaid diagram of the change, Files changed (one-liner per file), AC coverage map, "What I read before writing code" (recon report), Self-review summary, How to test locally, Risk callouts. A reviewer with 30 seconds knows what / why / what to look at; a reviewer with 5 minutes can merge confidently without opening other tabs. -
reference/BUG-PATTERNS.md— new living catalog of bug shapes. Every external reviewer finding (Cursor BugBot, human reviewer, postmortem) that wasn't already caught is permanently added as aBP-NNNentry. The implementer reads the catalog before writing (pre-empts every pattern); thecode-reviewcritic checks the catalog on every diff. The catalog is one-way ratchet — patterns never get caught twice. Seeded with three entries from recent Cursor findings (empty-catch + side-effects, useState-as-race- guard, no-op error handling) plus two adjacent (analytics-before- success, state-after-unmount) and one common React (missing effect deps). -
reference/RECOMMENDED-LINT-RULES.md— copy-paste lint configs per stack. Most of BUG-PATTERNS is mechanically catchable by the right linter rules at the right severity. Document gives the exact ESLint / Dart analyzer / golangci-lint / ruff blocks plus TypeScript / mypy strictness flags. Repos that adopt all four sections typically see Cursor findings drop by ~70% within a few PRs — the catalog patterns get rejected at editor save time. -
Self-review must re-scan the FULL catalog on every iteration. This is the structural fix to the "Cursor finds new things each round" problem. Fixing one finding often introduces (or reveals) another. The implementer's pre-push loop now runs
code-reviewwith the entire BUG-PATTERNS catalog on each iteration — not just the previous round's class. Convergence: by iteration 2, every pattern has been scanned; round 3 catches only genuinely-new issues, not the next-shape-in-line. -
Self-review is tunable, default on. New
repos.ymlkeys:selfReview: on | off | auto—autoruns only when the diff has ≥selfReviewMinChangedLineschanged lines (default 0; set higher to skip on small diffs).selfReviewMaxIterations: 2— cap on fix rounds before pushing with a self-review comment that names the unresolved issues. Cost note (in the example config + this release's docs): self- review adds ~30s – 3min per implementation run and ~1.5–2× the agent compute (code-reviewruns once pre-push and once in CI). Net wall-clock is a win when external reviewers would otherwise catch ≥1 thing per PR; a small overhead on PRs that would have been clean anyway. Tunable so teams can dial up the threshold or turn off if the overhead doesn't pay off for their diff sizes.
-
reference/PR-COMMENT-STYLE.md— new shared style guide. Every PR comment (critic finding, verify-pr coverage, implementer self-review, fix-pr explanation, bug-triage update) follows the same four-part structure: plain-English title with emoji · what happens · why it matters · the fix with code snippet · file:line. Length budgets enforce concision (blocker ≤ 150 words; warning ≤ 80; info ≤ 1 line). -
workflows/pr-verify.yml: optional stack-native static checks. Added a commented-out block with the canonical lint / typecheck / test commands per stack (Node / Flutter / Go). Repos whose own CI already runs these can leave it off; repos relying on Manifest can uncomment the block for their stack and get strict pre-AI checks on every PR push.
Why these are 0.18.2, not 0.18.1
0.18.1 fixed the pickup skill (the Spec entry). 0.18.2 fixes the implementer + reviewer skills (the Build phase). Different code paths, different bugs, different commit. The motivating Cursor findings on UWS-502 voice-dictation PRs all landed in the implementer's output and should never have reached the reviewer's queue in their original form.
Migration
None. All changes are additive (new critic patterns, new schema fields, new SKILL.md sections, a new reference doc). Existing contracts and PRs keep working. Repos relying on the pre-0.18.2 PR-body template will see a richer body on the next implementer run — no config flip needed.
[0.18.1] — pickup skill hardening from first real-run feedback
First end-to-end test of /contract pickup surfaced three real
gaps. All closed in this patch — no API changes, no new dependencies,
no migration. Existing 0.18.0 contracts and config keep working.
Changed
-
Phase 2 now runs the full critic set inline, unambiguously. The 0.18.0 skill prose left room for the agent to draft the contract, run only
critic-code-context, and then suggest/contract verifyas a follow-up — which happened in the first real run. The skill is now explicit: pickup IS the verify. In Phase 2 the agent runs the validator + all the standard judgment critics selected per content (edge-cases / regression / security / instrumentation / comms-completeness / platform-parity / scalability / perf-budget)critic-code-contextin one parallel batch, and writes.findings.{md,json}exactly ascontract-verifywould. New anti-patterns explicitly forbid suggesting/contract verifyas a next step and producing a card with only Bucket A.
-
Phase 1.0 preflight — no more silent degradation without
repos.yml. 0.18.0 ran pickup happily without.manifest/repos.ymland reassured the dev "fine here — automation is inert." That hid a real loss: cross-repo regression scan, cached auto-fill, PM-channel routing, and the answer-watcher all needrepos.yml. The skill now gates Phase 1 on the file. If missing, the agent stops, lists the four affected features explicitly, and offers to run/manifest setup(~30 seconds) or proceed withpickup.degradedMode: truerecorded in the contract frontmatter so the rest of the pipeline knows. Same gate when a critical MCP isn't connected for the pasted source. Anti-pattern added: don't say "fine here" — surface the loss, let the dev decide. -
Card output reframed for someone reading their first pickup. 0.18.0 led with the contract ID (
SC-001), bucket letters, and file paths as table columns — fine for someone who already knew the codebase, opaque otherwise. New rules: feature title in plain English leads (contract ID drops to a small metadata row); bucket headlines in plain English ("Agent filled in 4 from your code" instead of "Bucket A — auto-filled from code"); every technical reference gets a plain-English line above it; file paths drop to↳ refs:footnotes; jargon gets a parenthesized gloss the first time it appears; question IDs (Q-N) stay in frontmatter and never surface in the human card.
Why these are 0.18.1, not 0.18.0
0.18.0 shipped the design + scaffolding. 0.18.1 closes the gaps the
first real run exposed. The skill prose was the difference between
"works on paper" and "behaves the way the docs claim" — that's a
behavioral change worth a version bump even though no .json schema
or workflow file changed.
[0.18.0] — dev-centric pickup flow (opt-in)
A new mental model for the most common real-world case: the PM writes a PRD elsewhere (JIRA / Google Doc / Slack / Notion / paste / screenshot) and walks away, and the dev has to make it build-ready on their own — using code, history, and dependency context the PM doesn't have. Manifest does the code archaeology for the dev and surfaces only the decisions that need a human.
The PM stays in their normal tool. They never have to touch Manifest — questions go out as one batched JIRA comment / Slack DM in the dev's voice; answers materialize as AC edits with provenance comments.
This release ships the design + scaffolding for the flow. It's
opt-in per repo via pickup.enabled: true in repos.yml; without
the flag, /contract pickup falls back to /contract new with a
notice. Existing flows (/contract new, verify, promote, implement,
canary, launch) are unchanged.
Added
/contract pickup <source>— new subcommand for the dev-centric flow. Source can be any URL (JIRA, Google Doc, Linear, Notion, Confluence, Slack message link, GitHub issue, Figma), pasted text, or a dropped image. Fetches via the right MCP, follows linked docs one level deep, pulls related history (past contracts, postmortems, recent Sentry, active concurrent work). See skills/contract-pickup/SKILL.md.- Three-bucket gap sorter. Every gap in the PRD lands in exactly one of: A. agent fills from code/history (one-tap accept), B. dev decides (engineering judgment), C. only PM can answer (drafted as a PM-facing question). Dev burns through A in seconds, walks B with judgment, sends batched C questions to the PM.
critic-code-context— new dev-side critic that produces the Bucket A auto-fill proposals (perfBudget from stack defaults, event names from the existing catalog, copy from i18n keys, AC patterns from similar landed contracts) and Bucket B dev-decides items (rolled-back history, dependency budgets, shared modules, locale/device branches the codebase already handles). See skills/critic-code-context/SKILL.md.- PM-channel question posting. Drafted questions go to the PM
via the channel the source came from (JIRA comment, Slack
reply-in-thread, Notion comment, Google Doc suggestion) in the
dev's voice. Optional
— <dev> (via Manifest)footer for audit (pickup.identifyAgentinrepos.yml). - Answer watcher. Polls the PM channel for replies; on
detection, parses the answer, applies it as an AC edit with a
provenance comment (
<!-- From: Q-N · <PM> · <date> -->), moves the question to the sidecar<ID>.qa.mdlog, and re-verifies incrementally. Implementation on non-blocking behaviors can run in parallel. ROADMAP.mdat the repo root — captures the broader vision (development / customer support / operations agents) and the impact-ordered immediate priority list this release is one piece of.
Configuration
New pickup block in repos.yml:
pickup:
enabled: true # opt in
identifyAgent: true # "(via Manifest)" footer on PM-facing posts
defaultChannel: jira # or: slack | notion | gdoc
blockingByDefault: false # questions are non-blocking unless dev flags
cacheTTL: 24h # codebase analysis cache lifetime
Cache builder + answer watcher (closed mid-cycle)
What started as deferred made it into this release:
scripts/build-code-context.mjs— idempotent, atomically-writing cache builder. Scans target repos for event catalog, i18n keys, flags, shared modules; indexes past contracts by surface area; flags rolled-back / partial history. Output goes to.manifest/.cache/code-context.json. Sub-second lookups after the first build. Runnable locally (node scripts/build-code-context.mjs) or on cron viaworkflows/code-context-build.yml.scripts/answer-watcher.mjs— polls PM channels for replies to open pickup-flow questions. Stateless detector that emits a JSON report; the contract-pickup skill consumes the report and applies AC edits + provenance comments + qa.md updates. Runnable locally or on the 15-minute cron inworkflows/answer-watch.yml.
Known gaps (still deferred)
- Answer-watcher channel adapters are stubs — they log what they
would call but return
mcp-unavailableby default. Production detection needs either (a) running from inside Claude Code / Cowork with the relevant MCP, or (b) a thin REST proxy on the MCP host. v0.18 ships the detection harness + report schema; production wiring lands in a follow-up. - Cross-repo scanning in the cache builder uses the
path:field fromrepos.yml. GitHub-only entries (no localpath:) are skipped for now — pulling source via the GitHub MCP is a follow-up. - Slack message-link parsing covers the common URL shape; exotic workspace URLs may need a follow-up patch.
Mental model — when to use which entry point
- PM authors in Manifest (rare today, but the ideal) →
/contract new. Same as before. Conversational; PM owns the contract. - PM authored elsewhere; dev picks it up (the common case) →
/contract pickup <source>. Dev owns the contract; PM stays in their tool.
[0.17.0] — see your diagrams + findings tell you HOW to fix
Added
/contract diagram <ID>(scripts/render-diagram.mjs) — renders a contract's Mermaid blocks into a standalone<ID>.diagram.htmlyou open in any browser, so you can SEE the diagram even when the.mdisn't on GitHub and you're deciding from your IDE. Dependency-free (Mermaid via CDN at view time). Docs also point to IDE markdown preview, which renders Mermaid natively/with an extension. 5 new tests.- Diagrams are now optional — add one only when a branching/state flow makes the contract clearer; skipped by default for simple/bug-fix changes (no more forced flowchart).
Changed
- Findings now tell you HOW, not just what. The deterministic
validator's
suggestionstrings are concrete paste-in templates — e.g. a missing AC suggests- AC<n> (B2): Given …, when …, then …; a missing commsStates gives the four-state skeleton with guidance. CRITIC-PROTOCOL now requires every criticsuggestionto show the shape of the fix and where to make it, not just name the gap.
[0.16.0] — migrate existing contracts to the new layout
Added
scripts/migrate-contract.mjs+/contract migrate <ID>— a deterministic reformat that brings an existing contract to the v0.15 grouped frontmatter (YOU-AUTHOR / MANIFEST-MANAGES), addschangeTypeif absent, and leaves the body untouched. Preserves every value — managed state (timestamps, status,landed,bugFollowups) and any unknown fields — and is idempotent. Refuses frozen<ID>.r<N>.mdsnapshots. 6 new tests (88 total).- Loads frontmatter with
JSON_SCHEMAso ISO timestamps stay verbatim strings — the default schema parses them toDateand re-emits...000Z, which would silently rewrite every timestamp. (Caught by a preservation test.)
[0.15.0] — author-friendly contracts (what to edit, where, what to remove)
The findings got readable in 0.14.0; this does the same for the contract the author actually edits.
Changed
- Frontmatter split into two labelled groups in CONTRACT-FORMAT and
in what
contract-newscaffolds:# ── YOU AUTHOR (edit these) ──(justid,title,changeType,platforms,createdBy) and# ── MANIFEST MANAGES — don't edit ──(status, complexity, timestamps, fix counters, guard/rollout fields, bugFollowups). No more guessing which fields are yours. - New "Editing a contract" section — maps each findings location
(
B2,AC3,frontmatter, a section name) to exactly where in the file, says which sections you own, and clarifies what to remove:Out of scopeis where you defer work, drop a behavior by removing the whole block (a half-specified behavior is a blocker), and the optionalrollbackTriggers/rolloutPlanblocks are deletable. - Optional frontmatter blocks are now clearly marked optional/deletable rather than shown as if required.
[0.14.0] — readable findings (human-first .md)
Findings felt hard to read and people weren't sure how to edit them. Two fixes — one a clarification, one a format change:
Changed
- You never hand-edit
findings.md. It's the read-only output of verify; you edit the contract and re-verify (or/contract fix), which regenerates it. Stated up front in the file's own banner and the docs. findings.mdis now human-first; machine metadata moved to the.json. The.mdfrontmatter is tiny (readiness, promotable, counts) — the wall ofsha256:hashes,regressionScan,criticsRun, and normalization notes that used to greet the reader now live infindings.jsononly (where the--changedplanner and tooling read them). The body lists blockers in full with plain-English fixes, summarizes the advisory warnings/info (one line each, full text in the.json) instead of dumping dozens of paragraphs, demotes critic IDs to small trailing tags, and ends with "What to do next."- Critics now write in plain English. CRITIC-PROTOCOL requires
message/suggestionto read like a reviewer's note — jargon spelled out, location in human terms, ID not leading the sentence.
[0.13.0] — bounded contract verify→fix loop
The slow part of authoring was the manual round-trip: verify → "Claude,
fix it" → re-verify → a new blocker appears → repeat, each pass paying
full verify cost. New /contract fix <ID> collapses it.
Added
/contract fix <ID>(contract-verify fix mode) — runs verify, applies the fixes for all open blockers in one batch, re-verifies incrementally, and loops until 0 blockers or a 3-pass cap (maxFixIterations), then reports a promotable contract. Targets blockers only (warnings stay advisory); on the cap it stops and hands back the remaining blockers instead of churning. One command instead of N hand-driven passes.- Key rule that kills the "re-verify finds new blockers" whack-a-mole: when a fix adds a behavior/AC, it's added complete (all required fields at once) so the next pass doesn't block on the fragment just added — the #1 source of cascading blockers.
- New
verifyFixIterationsfrontmatter counter (distinct from the PR loop'sfixIterations; both capped bymaxFixIterations).
[0.12.0] — solo / zero-footprint mode
Added
- Solo / zero-footprint mode (GUIDE §1f + a setup-init choice) — use
Manifest as an individual contributor without adding a single file,
workflow, or Action to a team's repo. Contracts +
repos.ymllive in a separate repo you own (or a local-only folder) and point at the team repo by itsgithub:slug via your existing read access; you run the skills (/contract,/code-review,/implement) locally and open a normal PR. The team sees nothing Manifest-related.setup-initnow asks team-vs-solo and, in solo mode, writes config elsewhere and skips workflow installation entirely. No format changes — adopt the full CI loop later if the team wants it.
[0.11.0] — native iOS / Android deploy verification
verify-deployment could verify web, Flutter, and backend, but native
Swift/Kotlin apps fell through (the Flutter sub-mode is keyed on
languages: [dart]), so a native contract had no runnable sub-mode.
Added
- Sub-mode D: native mobile in
verify-deployment— iOS (Swift,xcodebuild test) and Android (Kotlin,gradlew test/connectedAndroidTest), with three checkpoints: pre-release (CI sim/emulator), internal-track (Firebase Test Lab real-device matrix), and prod (telemetry: Firebase Analytics + Crashlytics crash-free % + Performance). Recognizes that native ships via store staged rollout (no feature flag): arollbackverdict means halt the staged rollout, not flip a flag. Implementer already supported native via STACK-PROFILES; this closes the verification half. - Native mobile CI guidance — GUIDE §3.4b plus headers in
pr-verify.yml/verify-deploy.yml: iOS jobs needruns-on: macos-latest+ Xcode setup; Android needs the SDK +setup-java; per-repo signing / Firebase Test Lab secrets. Covers the two-separate-features / two-repos / two-teams case (single-platform contracts in each repo, no shared specs repo or parity ceremony).
[0.10.0] — proportional scope (stop over-engineering small bugs)
Driven by a real run where a one-line bug fix grew into a 5-revision epic (a new analytics event, a 7-day shadow baseline, a flag with mount-time caching, 21 ACs). The critics were calibrated for net-new features and only ever ADD; nothing argued for cutting. Three fixes:
Added
changeType: feature | bug-fixfrontmatter (defaultfeature). Abug-fixcontract verifies LEAN:contract-verifyruns onlyminimality+ scopededge-cases+regression+security(if relevant); turns the instrumentation critic OFF and drops the success-metric / shadow-baseline requirement (a bug's metric is the regression test).contract-newsetsbug-fixfor bug intake and scaffolds without a success-metrics section or new events. The validator reportschangeTypein its output.critic-minimality(new, always-runs) — the counterweight that pushes back on disproportionate scope: feature-grade telemetry / shadow phases / flags / exhaustive speculative edge cases on a small change. EmitsMIN-findings atwarning(advisory). Added to the protocol's canonical names + ID prefixes.
Changed
- CRITIC-PROTOCOL framing: "handle OR explicitly defer." Every
critic's
suggestionmust let the author descope (move to Out of scope) rather than only "add handling for X" — so scope can't grow one finding at a time, and readiness no longer requires building everything a critic noticed. Critics calibrate tochangeType/complexityand bias toward deferral on bug fixes.
Why
A bug fix should verify against ~2-3 scoped critics, not a feature's
full suite. The UWS-257 contract under the old rules would now: skip
instrumentation entirely, drop the shadow baseline + success metric, and
get a minimality warning on the flag/analytics scope — i.e. ~80% smaller.
[0.9.0] — blockers are the only hard gate (no more endless verify)
Verify could feel endless because reaching verified required 0
warnings, and warnings are the LLM-variable findings that reshuffle
run-to-run. Now a dev clears a finite, stable set and ships.
Changed
promotable= zero open blockers is the real gate (computeReadinessnow returns it). Warnings and info are advisory — they refine thereadinesssignal but never block promotion.contract-promotenow gates onpromotable, notstatus: verified; it surfaces open warnings and proceeds (you can fix or acknowledge them, but you don't have to).- New
acknowledgedfinding status — a human reviews a warning and accepts it; it leaves the open set and never re-litigates. Added to the finding-status enum (open | resolved | dismissed | acknowledged) in bothvalidateFindingsandvalidateReviewFindings. contract-verifyand/statusnow lead withpromotableand list blockers (must-fix) separately from warnings (advisory); verify carriesacknowledged/dismissedstatuses forward across re-verifies.
Why it converges
Blockers (deterministic facts + serious judgment issues) are stable and finite → drive to zero. Warnings → fix or acknowledge → don't resurface. Unchanged content → caching + incremental re-verify reuse prior findings. So the loop terminates instead of chasing run-to-run variance. 4 new tests (82 total).
[0.8.0] — faster verify & re-verify
The deterministic validator was already <1s; the wall-clock is the LLM critics. This release makes verify do the smallest correct amount of work, especially on the edit→re-verify loop.
Added
- Incremental re-verify.
validate.mjsnow hashes each behavior (+ its ACs) and a global context bucket (fragmentHashes), plus anapiSurfaceHash. The new--changedmode emits a re-run plan: which localized critics to re-run over which changed behaviors, whether the cross-cutting critics need re-running, and whether regression shouldrescan/reason-only/reuse. Verify follows the plan and reuses prior findings for unchanged fragments — so fixing one finding re-runs one critic over one behavior, not the whole suite. 9 new tests (78 total). --fastverify —/contract verify <ID> --fastruns only edge-cases + security and skips the regression scan, for a quick draft-loop verdict. StampedverifyMode: fast; not promotable — contract-promote refuses a fast-only verify.- Regression scan caching. The slowest critic now reuses its repo
scan when the API surface + scanned repo head SHAs are unchanged
(recorded in the findings'
regressionScanblock); it only re-fetches on a real surface change. Prefers the cheapdeclaredscan depth while iterating, full depth on the final verify. - Model tiering — heavy critics (edge-cases/security/regression/
scalability) use a strong model, light ones a fast model; override via
conventions.criticModels.
Notes
- All wins are "run fewer critics over less input and reuse prior results" — individual LLM-critic latency is unchanged. Correctness is preserved: any structural change still re-runs the cross-cutting critics; only localized critics (comms/perf/platform/instrumentation) are scoped to changed behaviors.
[0.7.0] — contextual perfBudget / commsStates gating
Process proportional to the behavior, not blanket boilerplate.
Changed
commsStatesis now required only for user-facing behaviors. Server-only behaviors (platforms allserver/backend) are exempt — no more demanding four UI states for a backend job.perfBudgetgating is configurable viaconventions.perfBudgetinrepos.yml(orperfBudgetPolicyper contract):required(blocker),warn(warning — the new default, so a missing budget no longer blocks the pipeline), oroff. When checked, one relevant numeric field is enough (ttiMs for UI, p95LatencyMs for a network call) — a behavior with no network call needn't invent a p95. ATBD/ non-numeric value is flagged at the policy severity.- Renamed/rebranded the whole plugin Shipline → Manifest (name,
slugs,
.manifest/convention,/manifestcommand, repo reference).
Notes
- The two critic skills (
perf-budget,comms-completeness) now defer field-presence to the validator and focus on judgment (are budgets realistic; is error copy actionable). 6 new validator tests (69 total). - Rationale: the blanket "all three fields on every behavior" rule created friction for backend behaviors and teams without perf telemetry, contradicting "works with whatever infrastructure you have." The value is kept where it's cheap (user-facing UI states) and made opt-in where it isn't.
[0.6.0] — bug→fix loop closure (+ trigger fix)
Fixed
- Monitoring trigger never fired.
launch-monitor.ymlmatched contracts onprodRolloutAt:, but the contract format stores the rollout timestamp asprodRollout100At:— so the daily launch-report and bug-triage sweep silently found zero contracts. Corrected the field name (and the day-index computation that used it).
Added
- bug-triage now closes its loop. After filing/deduping a cluster it
routes the bug back into the pipeline: trivial/high-confidence (or any
S0/S1) can auto-enter the
/fixexpress lane; bigger ones draft a/contractstub. Guardrails: propose-by-default, auto-start only for high-confidence-trivial or S0/S1, ≤2 auto-starts per run, never auto-merge (the fix still goes through verify-pr + code-review + human approval). The route is seeded from the triage evidence (symptom, repro, suspect file + git-blame owner, contract context). - New
bugFollowupscontract frontmatter — links the routed ticket ↔ fix PR / new contract ↔ originating contract; an open follow-up tempers thelandedverdict. The cluster is markedroutedin the bug-log so the next nightly run doesn't re-route it.
Notes
- No new credentials required: routing reuses the scopes the Implementer
already declares (
github:contents:write/pull_requests:write) and the tracker MCP bug-triage already uses. Without write access it degrades to proposing the route in Slack / a PR comment.
[0.5.0] — recall harness, canary orchestrator, rollback ending
Fills the gaps a self-audit surfaced: the missing half of the reliability story, the described-but-unbuilt canary orchestrator, and the one place the end-to-end loop had no ending.
Added
- Critic recall harness —
eval/contracts/judgment-gaps.mdis a structurally-complete contract (zero deterministic findings) with planted judgment defects;eval/golden/judgment-gaps.expected.jsondeclares which critic must catch each.scripts/recall.mjsis a deterministic scorer (recall + schema check) with 7 unit tests; thecritic-recalljob ineval.ymlruns the verify skill against the fixture and scores it (skips cleanly without LLM creds). This is the drift defense RELIABILITY.md #2 asked for — a recall drop fails CI.contract-verifynow also emits a machine-readable.findings.json. - Canary orchestrator (recommend-and-approve) —
rolloutPlan(stages + bakeholdHours) inrepos.yml/ contract frontmatter;rollback-guardnow recommends the next ramp step on a healthy check;/canary <ID>shows the current stage + next step. The system never advances the flag — a human does. Fixed the GUIDE wording that implied an automated orchestrator existed. - Post-rollback / postmortem loop —
rollback-postmortemskill +/postmortem <ID>: recordslanded: rolled-back+rolledBackAt, writes a blameless postmortem from the contract timeline + guard reports + Sentry, and reopens the work as a follow-up (never closes it as done). The rollback ending the loop was missing.
Changed
- Workflow robustness.
launch-monitor.ymlandrollback-guard.ymlshare aconcurrency: manifest-state-writergroup and rebase before push, so concurrent crons no longer race on the specs repo. Launch-monitor gained missed-cron catch-up: it produces any reached-but-unwritten milestone report instead of requiring an exact day match (a delayed/skipped scheduled run no longer drops a report). - code-review gained a dependency / supply-chain check (avoidable new deps, unpinned ranges, typosquats, license flags, lockfile drift) when the diff touches a manifest/lockfile.
- New frontmatter:
currentRolloutPercent,rolledBackAt, optional per-contractrolloutPlan.
[0.4.0] — code review, the fix loop, and a rollout guard
Closes the two gaps between "the spec is good" and "the running feature is safe": code-level review of the diff, and a watcher on the rollout.
Added
code-reviewskill (PR stage) — reviews the diff for security, correctness, performance, and maintainability defects, distinct fromverify-pr's AC/contract conformance. EmitsCR-findings on the sharedblocker/warning/infoenum, schema-checked byvalidate.mjs --check-review; open blockers gate the merge. Runs inpr-verify.ymlalongside verify-pr;/code-review <PR>to run it manually. GUIDE ②.- Review→fix loop —
@claude /fix-pr <ID>runs the Implementer in fix-mode: it reads the opencode-review/verify-prfindings, fixes them narrowly, re-pushes, and CI re-verifies. Bounded bymaxFixIterations(default 3) then escalates to a human — no churn. rollback-guardskill +rollback-guard.yml— during the rollout window, samples Sentry errors, crash-free rate, and release adoption against the contract's budgets + optionalrollbackTriggers, and RECOMMENDSproceed | hold | recommend-rollback. It never executes a rollback — arecommend-rollbackposts a top-level Slack alert to the owner with the breached signal and the exact action./rollback-check <ID>to run on demand. GUIDE ③.- New contract frontmatter:
fixIterations/maxFixIterations(loop cap),guardVerdict/guardCheckedAt, and arollbackTriggersblock. CONTRACT-FORMAT updated. validate.mjsgainsvalidateReviewFindings+validateGuardVerdictwith--check-review/--check-guardCLI modes (exit codes gate CI: 2 = open review blockers, 3 = recommend-rollback). 11 new tests (56 total).
Notes
- The guard deliberately recommends rather than acts — pausing a canary,
flipping a flag, or reverting is a production change a human owns.
This matches
verify-deployment's long-standing "don't auto-rollback" stance.
[0.3.3] — lifecycle & retention
Added
- Archival/retention — landed contracts (day-28) auto-archive to
.manifest/archive/<year>/<ID>/; keeps contract + final report, prunes process exhaust (git history retains it).retention: keep-allto archive everything. Manual/contract archive <ID>. Keeps the active contracts folder lean as the team ships more features. GUIDE 1e.
[0.3.2] — central state (specs-repo model)
Added
- Dedicated specs-repo model for central state — one repo on one
mainbranch is a consistent source of truth (no per-branch divergence); also the home for cross-repo contracts. GUIDE 1d. - Advisory locks —
owner/lockedBy/lockedAt; verify and implement warn if someone else holds a recent lock (advisory, git is the arbiter).
Notes
- A real-time central service (locking + query API) remains a deferred v2+; the plugin is built so it would wrap the same contract format, not replace it.
[0.3.1] — content-hash caching
Added
- Content-hash caching —
/contract verifyskips the LLM critics when the contract content + plugin version are unchanged since the last verify (reuses prior findings). No-op re-runs (CI, habit, iterating on other files) now cost zero tokens.--forceoverrides.validate.mjs --cache-checkpowers it; 5 tests.
[0.3.0] — right-sized process + leaner critics
Process proportional to risk, end to end.
Added
- Express lane (
/fix+quick-fixskill) for trivial bugs and tiny changes — skips the contract ceremony (no critics/SLA/launch report), triages first and escalates to/contractif the change is bigger than trivial. Plus a deterministic stack detector (scripts/detect.mjs, 16 tests) and thesetup-initwizard that auto-generatesrepos.yml(no external code-index MCP needed). - Smart Large support —
/contract decomposeturns a Large contract into an epic with dependency-ordered Small/Medium children; migrations/auth flaggedhuman-led. Large is made tractable, not refused. - Stack-agnostic Implementer + STACK-PROFILES toolchain reference (web/mobile/backend; no assumed npm/Playwright).
- SLA countdown in every update —
validate.mjs --slaprints time- left / overdue; implement, verify-pr, verify-deploy, and promote all lead their updates with it (4 tests). - All times shown in IST + UTC (e.g.
13:30 IST / 08:00 UTC). /status [<ID>]— phase + SLA + readiness + next action for one contract, or a dashboard of everything in flight (overdue first). Deterministic viavalidate.mjs --status+derivePhase(6 tests).- Slack per-contract threading — one top-level message per contract
(the promote anchor); every later update threads under it via
slackThreadTs. One channel, no spam. Urgent items (overdue, rollback, auto-pause) also post a brief top-level alert.
Changed
- Critic set optimized.
critic-sizingremoved (the validator computes sizing deterministically — superseded record indocs/superseded-critic-sizing.md).platform-parity,scalability, andperf-budgetjudgment now run conditionally (only when relevant), cutting tokens and noise. Always-run core: edge-cases, regression, security. - Repo docs reorganized: root has 3 files; specs in
reference/, planning docs indocs/.
Fixed
- Validator skips behavior checks on
type: epiccontracts.
[0.2.0] — reliability hardening
The "make it real for teams" release. Addresses the production-grade gaps in the v0.1 prototype.
Added
- Deterministic validator (
scripts/validate.mjs) — real code for all mechanical checks (field presence, AC coverage, sizing, readiness, output-schema validation). Reproducible, free, unit-tested. - Shared critic protocol (
CRITIC-PROTOCOL.md) — single source for the closed severity enum (blocker/warning/info), output schema, ID prefixes, and anti-patterns. All 9 critics reference it. - Eval harness (
eval/) — golden contracts + unit tests for the validator. 13 tests, all passing. This is the regression gate that makes future changes safe. - Scope declarations — write-path skills declare
requiredScopes;/setupverifies actual granted scopes;contract-promoterefuses up front ifgithub:issues:writeis missing (no more silent tracking-issue failures). - Input preconditions —
verify-deploymentrefuses on null/empty target instead of emitting a misleadingholdverdict. - Provenance stamping — findings files record pluginVersion, model, protocolVersion, and contractHash for reproducibility.
- CI workflow (
workflows/eval.yml) — runs the eval suite on every change; fails the build on test failure or schema violation.
Changed
contract-verifyis now a two-layer orchestrator: deterministic validator first, then ONLY judgment critics (not all 9 as LLM calls). Lower cost, deterministic verdict.- Contract format requires explicit
AC1 (B1):behavior references so AC coverage is deterministically checkable. verify-deploymentis platform-aware (web / Flutter / backend).- Regression critic does cross-repo API dependency tracing.
Fixed
- Parser used
\Z(invalid in JS regex) as an end anchor, silently breaking AC→behavior parsing. Caught by the new eval harness. - Out-of-schema severities ("high", "medium") are now rejected by the validator instead of leaking through.
Known limitations (see RELIABILITY.md)
- Judgment-critic output still varies run-to-run (bounded by schema + protocol, but not bit-identical — inherent to LLMs).
- Content-hash caching designed, not yet implemented.
- True central state across branches not built (divergence is detectable via contractHash, not prevented).
- Model pinning depends on runtime support; the eval suite is the drift-detection mechanism.
[0.1.0] — prototype
- Initial plugin: 9 critic skills, contract lifecycle (new/verify/ promote), implement/verify/launch agents, GitHub Actions workflows, tutorial, setup-check, multi-repo config.
- All critics were LLM prompts (non-deterministic). Superseded by the two-layer architecture in 0.2.0.