Skip to content

release: sync develop → main#245

Merged
orioltf merged 160 commits into
mainfrom
develop
Jun 9, 2026
Merged

release: sync develop → main#245
orioltf merged 160 commits into
mainfrom
develop

Conversation

@orioltf

@orioltf orioltf commented Jun 9, 2026

Copy link
Copy Markdown
Member

No description provided.

orioltf and others added 30 commits June 5, 2026 12:27
Adds the unic-spec-review plugin: an adversarial reviewer for web
specifications across Confluence (pages + comments), Figma (Dev Mode
MCP), the live system (Playwright MCP), and the local repo. Findings
are Confidence-scored and Six-Hats-tagged; an Approval Loop posts
selected Findings back to Confluence.

Scaffold only (command-only package.json, command stubs) plus the
design artifacts; command/agent logic is pending the PRD.

Why now: the design was fully grilled and locked, so the decisions are
captured before implementation drifts from them.

Includes:
- Plugin manifests + root marketplace registry entry
- /review-spec, /spec-doctor, /setup-confluence command stubs
- PRD (docs/issues/unic-spec-review) published as issue #200
- ADRs 0001-0004: vendoring/self-containment, similarity dedup,
  Six-Hats lens, inline-anchored comments
- CONTEXT.md domain vocabulary; CONTEXT-MAP.md + app:unic-spec-review
  area label documented

Self-containment is a hard requirement: the plugin vendors shared
Atlassian code (copy, not cross-import) and ships its own setup
command, so it is usable installed alone. See ADR-0001 and root
ADR-0025.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The command stubs and the AGENTS.md design heading said "pending PRD",
but the PRD (#200) is written. Reword to "pending implementation" and
link the PRD, so the stubs reflect that behaviour is defined and only
the command body awaits its implementation slice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
The new plugin was invisible to CI: it was absent from the paths-filter,
the changes-detection outputs, the test job's gating condition, the test
matrix, and release.yml's tag list. As a result its tests would never run
once they exist, verify:changelog would never run on its PRs, and the
release workflow would never auto-tag unic-spec-review@<version>.

Add unic-spec-review to all five places. While the plugin is command-only
the test/typecheck steps no-op via --if-present; verify:changelog runs now.

Why: onboarding a new plugin must wire it into CI/release, or coverage and
auto-tagging silently skip it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the ` — ` separators in the Shared vocabulary and Plugin
contexts lists with colons, per the org typography rule (no em dash).
Supersedes the convention-matching em dash added in b831cb8: the list is
now both org-compliant and internally consistent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The diff-based verify:changelog gate requires a CHANGELOG entry matching
plugin.json's version (0.1.0) when guarded plugin paths change; the
Unreleased-only scaffold failed CI. Add the 0.1.0 section.

The version header uses an em-dash date (`## [0.1.0] — 2026-06-05`)
because the release tooling mandates it: bump-version generates that
exact format and verify-changelog enforces ` — YYYY-MM-DD` on every
versioned header. This is the one tooling-required em dash; all prose
stays em-dash-free.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Record that CHANGELOG version headers must keep the `## [X.Y.Z] —
YYYY-MM-DD` format: pnpm bump generates it and verify:changelog enforces
` — YYYY-MM-DD` on every versioned header. Prevents a well-meaning
reformat of the separator from breaking CI and the release flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Workspace layout tree in AGENTS.md listed only five plugins; add
unic-spec-review so the layout matches apps/claude-code/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(unic-spec-review): scaffold plugin with PRD and ADRs
…age, Gaps agent, report)

Wire the first end-to-end /review-spec path so a real Confluence review can run
and serve as the foundation for later slices. The plugin was scaffold-only with
stub commands and no test harness.

Changes:
- Vendor atlassian-fetch.mjs and credentials.mjs from unic-pr-review (ADR-0001
  self-containment); only the missing-creds plugin name is changed
- Add pure modules: args (URL + --post parsing), link-classifier (URL routing +
  page id extraction), report-renderer (timestamped .spec-review/ report)
- Add gaps-agent (Gaps/Completeness dimension agent prompt)
- Implement /review-spec S1 orchestration and register the agent in plugin.json
- Restore the test harness: test/typecheck scripts, tsconfig.json, scripts/ and
  tests/ dirs; node:test unit tests cover every pure module with injected deps

Fixes #202

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(Windows compat)

path.split('/') is not cross-platform; Windows paths use backslash, so the
full path was returned unchanged, failing the regex assertion on Windows CI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Docs (H1, L1, L9, L10):
- AGENTS.md: update status banner to S1-implemented; add pnpm test/typecheck to Commands
- CONTEXT.md: update status banner to S1-implemented
- README.md: replace scaffolding note with S1-available message

Error handling (M2, M3):
- report-renderer.mjs: add shape validation (findings, timestamp) after JSON.parse
- report-renderer.mjs: wrap renderReport call in try/catch for FS errors (EPERM/ENOSPC)

Shell-quoting (M1):
- review-spec.md: use Write tool + argv[2] file-path approach for Step 6
- report-renderer.mjs: accept optional file path as process.argv[2] to avoid single-quote shell issues with apostrophes in page titles

Tests (M4, M5, M6, L6, L7):
- atlassian-fetch.test.mjs: add 403 auth-error test
- atlassian-fetch.test.mjs: add unsupported URL collectIntent test
- atlassian-fetch.test.mjs: add malformed creds collectIntent test
- report-renderer.test.mjs: add anchor quote-block rendering test
- link-classifier.test.mjs: add bare figma.com (no www) test

Comments (M7, L4, L8):
- atlassian-fetch.mjs: update module docstring from unic-pr-review domain vocabulary to spec-review context
- atlassian-fetch.mjs: replace "Intent Checker / ADR-0004" with "Gaps agent / /review-spec command" in 3 inline comments
- atlassian-fetch.mjs: add note that Jira exports are untested in this plugin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… URL parse pattern

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…m PRD

The org-level no-em-dash typography rule was removed, so the PRD line
citing it as a constraint on generated outputs is now stale. The
CHANGELOG em-dash format remains documented in AGENTS.md as a CI
requirement, independent of the org rule.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…elds

Filter arg parsing and link classification to http(s) only so ftp/file/mailto
tokens are dropped, and guard pageTitle/pageUrl in the report-renderer CLI entry
so missing values no longer render as literal undefined. Adds node:test coverage
for each path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…urface fetch errors

Write scratch report JSON into gitignored .spec-review/ instead of the
POSIX-only /tmp path (breaks on Windows CI), and surface the structured
errors[].kind/message from the fetch script so the real failure cause is shown.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ove em dashes

Drop the render-summary.mjs, doctor.mjs, and inaccurate ADR-0001 citations
from code comments, reword the CONTEXT.md status line so it no longer promises
an unused (S1) per-term marking, and replace em dashes with hyphens in authored
comments and messages per the org typography rule.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Close coverage gaps flagged in PR #210 review: env-over-file
credential precedence and the 800-char Confluence excerpt cap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Biome organizeImports ordering for node:test before node:url.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w-202-skeleton-tracer-bulle

feat(unic-spec-review): skeleton tracer bullet (classify URL, fetch page, Gaps agent, report)
…fluence, /spec-doctor)

The plugin had no way to set up credentials or verify prerequisites: both
command stubs were unimplemented and the script layer was absent. A user who
installed only unic-spec-review could not configure Confluence or preflight a
review without first installing another plugin.

Changes:
- Add parseArgs to scripts/lib/args.mjs (CLI parser for the setup wizard)
- Vendor scripts/setup-confluence.mjs by copying from unic-pr-review (no cross-import)
- Add scripts/spec-doctor.mjs: Confluence credential + connectivity preflight (injectable deps)
- Replace commands/setup-confluence.md stub with the full interactive wizard
- Replace commands/spec-doctor.md stub with the orchestrator (script + Figma/Playwright MCP checks; absent MCPs are loud explicit failures with remediation)
- Add unit tests for the wizard and the Confluence preflight logic; no live services
- Add CHANGELOG bullets under [Unreleased]

Refs #203

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add parseArgs test suite (7 cases) to args.test.mjs — covers all four
  behavioural branches including boolean flags and throw-on-missing-value
- Add runSpecDoctorCredentials HTTP-error test (401 via pingHttp)
- Remove dead CheckResult.skipped typedef property and formatLine skipped
  branch (YAGNI — nothing sets skipped: true in current code)
- Fix setup-confluence.mjs top-level catch to include err?.stack for
  better debugging parity with spec-doctor.mjs
- Fix process.env.HOME → require('os').homedir() in setup-confluence.md
  inline snippet for Windows-native portability
- Broaden args.mjs module description to cover both exported parsers

Tests: 101 pass / 0 fail (was 93)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Issue #203's acceptance criterion forbids em dashes in authored text
(except the mandated CHANGELOG version header). Copilot flagged the
user-facing strings; this sweeps the rest too - JSDoc comments, command
docs, spec-doctor/setup-confluence output, and test descriptions - so the
whole slice complies. Replaced every " — " separator with " - ".

The prior CHANGELOG note cited a now-removed org typography rule; reworded
to ground the change in this slice's own acceptance criterion.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Drop stale `:setup-jira` reference in writeConfluenceCreds JSDoc; that
  command exists in unic-pr-review (the vendoring source) but not in this
  plugin. Behavior unchanged.
- Add tests for two untested in-scope pure-logic branches: isEnvConfigured
  rejecting a present-but-empty env var, and checkConfluence's raw-string
  fallback when the configured url is unparseable.

Why: review surfaced a misleading vendored comment and two uncovered
branches in the pure logic the slice's acceptance criteria require tested.
No Critical/High findings; remaining suggestions are sub-threshold.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…mendment + PRD elevation)

Amend ADR-0008 to permit Y-det hybrid content-gated spawning for the
comment, errors, and types semantic gates (while keeping path classification
as the fast path). Records the bias-toward-spawn rationale and flags the
errors gate as the first Y-llm-promotion candidate.

Realigns PRD §Testing to explicitly name the three content-aware gates and
elevates the toolkit relationship from "loosely inspired" to a documented
behavioural-parity contract for code-analysis aspects, preserving the
clean-slate doctrine. Resolves the three-way contradiction between PRD :203,
ADR-0008, and the path-only implementation. Closes #212.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…w-203-setup-confluence-spec

feat(unic-spec-review): self-contained auth and preflight (/setup-confluence, /spec-doctor)
…st-pass model

Remove code-simplifier from the Phase 1 parallel fan-out and run it as a
Phase 2 post-pass only when Phase 1 yields no Critical/Important findings and
≥3 non-test source files changed (ADR-0013). Exports shouldRunPhase2() from
changed-file-analyser.mjs so the gate is unit-testable; adds 12 new tests
covering the three canonical AC scenarios plus edge cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ch (PR #5612)

Add tests/dedupe-ordering-regression.test.mjs as a parity/quality-regression
guard. The fixture encodes the unconditional ref/state reset placed before an
early-return guard pattern from AnalyticsTracker.tsx in PR #5612. Assertions
verify the pattern ordering and that a reference finding at confidence 70
(Minor band, 60-79 per ADR-0002) validates correctly via parseFinding.

unic-pr-review correctly surfaced this at Minor severity; pr-review v1.4.0
missed it (false negative). This fixture prevents that quality win from
silently regressing as the plugin evolves.

Closes #218

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
orioltf and others added 29 commits June 9, 2026 14:32
…227-fix-post-oneliner-and-s

fix(unic-pr-review): correct --post one-liner env form, extract tested cleanup helpers, fix state-dir ownership
- Split SKIP_CLEAN_POSTS branch so approved skip/flag overrides bypass
  the run-level gate (code-review MEDIUM: prose guarantee was violated)
- Mark ADR-0005 implemented in docs/adr/README.md (docs-impact MEDIUM)
- Fix badge table spacing: `'post'` AND `COMPARISON_INCOMPLETE` (LOW)
- Extend 10b fallback to cover exit-0 with absent results key (LOW)
- Wrap runDedupCli spawnSync in try/finally + rmSync cleanup (LOW)
- Strengthen error-JSON assertion to JSON.parse + typeof check (LOW)
- Add symmetric test for --comments-file missing (LOW)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…n CLI error tests

The dedup-matcher CLI validates both --findings-file and --comments-file flags
before attempting to read any file; a dummy path triggers the Usage error without
needing real file content.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… (no silently dropped Findings)

A --post run that partially fails left a surviving Approval Loop state
directory (ADR-0014), but a re-run routed to re-review (a prior Iteration
Marker exists), where an unchanged HEAD yields an empty delta diff, zero
Findings, and the Approval Loop is skipped — so every Finding that failed
to post was silently dropped. The Step 1.12 warning promised a retry that
was never implemented.

Implements the locked Write Retry design (ADR-0015):
- scripts/lib/write-outcomes.mjs — tested helper with checkWriteRetry
  (none/retry/stale classification + staleness guard), recordOutcomes
  (persist per-Finding postedMap + sticky summaryPosted, atomic write,
  before the success-gated cleanup), and filterUnposted (first-attempt
  no-op, retry subtracts posted-ok). Exposed via a real-script CLI
  dispatcher (env-before-node, no inline-eval ESM import of an absolute
  path) so it works on Windows.
- tests/write-outcomes.test.mjs — node:test coverage of all three exports
  incl. the stale-HEAD discard path and first-attempt no-op.
- commands/review-pr.md — Step 1.2a Write Retry check (short-circuits the
  Fetcher/mode-detection/fan-out and resumes the Approval Loop at the same
  Iteration), Step 1.11 deltas, Step 1.12 Writer input + Step 1.12a persist,
  and a rewritten Step 1.12 warning incl. cross-machine and HEAD-moved caveats.
- agents/ado-writer.md — first-review input accepts summaryAlreadyPosted;
  Step 3 skips when true. No other Writer behaviour changes.

Fixes #236

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…238)

ISSUE #238 forbids em dashes in authored text (only the CHANGELOG version
header may use one). The 10d override branch added an em dash; swap it for
the file's space-hyphen-space style.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- review-spec.md 10c: rewrite the empty dedup-badge bullet as "(no badge)"
  with spaced operators; the old leading empty code span rendered ambiguously
  and fought Prettier normalisation.
- dedup-matcher.mjs: comment why the CLI envelope's `truncated === true` is a
  deliberate soft default (Step 10a is the authoritative COMPARISON_INCOMPLETE
  source), so a future envelope consumer is not misled.
- dedup-matcher.test.mjs: cover the realistic `{ comments }`-without-`truncated`
  object shape (gating path), closing the gap between explicit true/false and
  the bare-array legacy case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w-238-gate-dedup-incomplete

feat(unic-spec-review): gate dedup posts when comparison is incomplete
- `filter` subcommand: use atomic tmp+rename write for APPROVED_FILE
  (prevents corruption on partial write / disk-full)
- `filter` subcommand: wrap APPROVED_FILE read in try-catch with clean error
- `record` subcommand: wrap recordOutcomes() call in try-catch with clean error
- review-pr.md: `CURRENT_ITERATION = WRITE_RETRY_STATE.iteration ?? 1` fallback
  (defensive against older state files missing the iteration field)
- write-outcomes.mjs: fix two JSDoc inaccuracies ("usage message" → "error message",
  "without touching" → "without mocking" the module system)
- README.md: update "without any local state" claim to acknowledge Write Retry
  state directory (ADR-0015)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A --post retry where the Review Summary failed in the prior attempt could
silently drop it (all inline Threads already posted → pruned approved set is
empty → Writer's zero-Findings short-circuit skips Step 3) or render it from
the reduced re-post subset (some inline failed → incomplete Summary). Both
violate ADR-0015 AC#1 ("posts the Summary only if it didn't already land").

Why: a single approvedPath fed both the inline Threads (Step 2) and the
Summary (Step 3a), so pruning it for inline dedup corrupted the Summary.

Fix: stop pruning the approved set. The orchestrator now keeps APPROVED_FILE
full and passes the Writer an alreadyPostedFindingIds inline-skip list; the
Writer skips those inline Threads but still renders the Summary from every
approved Finding. Replaces filterUnposted/the `filter` subcommand with
postedFindingIds/`posted-ids`. Amends ADR-0015 decision #4 accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…reactive fallback

Pin the posting body representation to Confluence storage format (converting
the agent-authored Markdown) and complete the "never dropped" guarantee with a
reactive footer fallback when Confluence rejects an inline anchor. Foundation
contract for #231 (rendering) and #232 (fallback), specced via grill-with-docs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ent re-review

Three review follow-ups on the Write Retry path:

- checkWriteRetry now returns `corrupt` (not `none`) when a state directory
  survived but its state.json is unreadable/invalid. A surviving dir means the
  prior --post did not complete, so treating it as "no prior attempt" silently
  re-entered the empty-delta re-review path that drops Findings (#236). The
  orchestrator prints a Notice and runs a normal review, symmetric with `stale`.
- recordOutcomes throws a clear TypeError on a non-array inlineResults so a
  malformed Writer result reports its real cause, not a generic persistence miss.
- Step 1.12 HEAD-moved caveat: a discarded stale state runs a normal review
  (re-review only if a prior comment already carried the Iteration Marker), not
  always a re-review.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…236-write-retry-partial-ite

fix(unic-pr-review): Write Retry completes a partial --post Iteration (no silently dropped Findings)
…, not wiki

Add a vendored, dependency-free md-to-storage converter (bold/italic, inline
code, links, bullet/ordered lists, fenced code blocks via ac:structured-macro;
unrecognised constructs degrade to HTML-escaped literal text, never malformed
XHTML). Build the comment body piecewise: only finding.body goes through the
converter; the title line and attribution footer are emitted as storage
fragments with escaped interpolated values so recognizeFooter() keeps matching.
Switch postConfluenceComment from representation:'wiki' to 'storage'. Adds
table-driven node:test coverage (per-construct, HTML-injection safety, degrade,
footer round-trip) plus a representation guard in atlassian-fetch.test.mjs.

Resolves #231.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bump plugin version to 0.1.10 (guarded-file change required by the issue)
and apply Biome organize-imports + formatting to the md-to-storage converter
test and confluence-writer, which were committed unformatted and failed the
root CI check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fixed:
- Balanced-paren scan for link URLs with nested parentheses (L1)
- CRLF normalization at top of mdToStorage for Windows compatibility (M1)
- escapeHtml(String(finding.confidence)) for consistency (L4)
- finding.body null/undefined guard at CLI boundary (L5)
- withFooter JSDoc noting reactive wiki fallback (#232) intent (L3)
- findInlineEnd JSDoc: success return + from param description + known limitation note (L2, L7)
- ADR README: ADR-0004 status line now names md-to-storage.mjs (L8)
- AGENTS.md: write-path status lists Markdown-to-storage conversion (L9)

Tests added:
- Bold inside bullet list item (H1)
- Inline code inside ordered list item (H1)
- CRLF line endings (M1)
- Empty string inputs for escapeHtml, convertInline, mdToStorage (L6)
- Parenthesised URL (link balanced-paren scan) (L1)
- Word-internal underscore known limitation (H2)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…w-231-markdown-to-storage-r

feat(unic-spec-review): post Finding body as Confluence storage XHTML, not wiki
…ifier + Write Retry

The mermaid was stale after the toolkit-parity rollout:
- code-simplifier moved out of the Step 7 parallel fan-out into a conditional
  Phase 2 post-pass gate (ADR-0013) — runs after Phase 1, before the re-review
  Coordinator, only when 0 Critical/Important findings AND >=3 source files.
- type-design-analyzer label now reflects its content gate (type files OR
  type-level changes, #215).
- Added the Write Retry branch (ADR-0015): a --post re-run with surviving local
  state and matching HEAD resumes saved Approval state and re-posts only the
  failed Findings/Summary.

Prose was already accurate; diagram only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ts an inline anchor

When our resolver counts a unique anchor match but Confluence's stored-body
model disagrees, Confluence rejects the inline POST with HTTP 400 and the
Finding was posted nowhere — breaking the ADR-0004 "never dropped" guarantee
with a raw API error. The writer now retries rejected inline anchors as a
page-level footer comment, while auth/not-found/network errors still fail loud.

Changes:
- atlassian-fetch: add FetchError kind 'rejected' for HTTP 400 (server reachable,
  refused our selection); 401/403→auth-error, 404→not-found, 5xx/network→unreachable
  unchanged. Update FetchErrorKind typedef + doc comment.
- confluence-writer: extract injectable postFinding({pageId,finding,creds,fetch})
  returning {id,type,reason}; retry footer only on kind:'rejected'; main() is a
  thin argv/file/exit wrapper.
- review-spec: third anchoring line for reason 'inline-rejected'.
- tests: HTTP-400→rejected + full classification map in atlassian-fetch.test.mjs;
  new confluence-writer.test.mjs (inline-400→footer, inline-401/network→fail loud
  no footer call, footer-500→fail loud, resolver-footer→footer only).

Fixes #232

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ci)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add FindingInput typedef to postFinding (replaces `any`)
- Update PostFindingResult.id doc: note empty-string sentinel
- Add happy-path inline-success test (type:inline reason:null)
- Note removal of `created` field from CLI stdout in CHANGELOG

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e repetition

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Improvements distilled from the unic-spec-review rollout:
- Monitor keys completion on watched run IDs (was a global active count
  that lingered between serial slices and stalled on unrelated rollouts);
  fires [done] only after a run goes active->absent.
- Dispatch prompt gains verification discipline: re-run typecheck AND test
  after every edit (CI runs test then typecheck); fix JSDoc on param rename;
  don't report done unless gh pr checks is green.
- Standing rule: verify CI on GitHub, not the workflow's summary/exit code
  (both proved unreliable - false green and false failure observed).
- New monitor signals (LIMIT, VERIFY-SKIP) and a clean re-run runbook for
  usage-limit deaths and verify-pr-base cascade-skips.
- Note workspace path casing check (UNIC vs unic).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w-232-reactive-footer-fallb

fix(unic-spec-review): reactive footer fallback when Confluence rejects an inline anchor
… unic-pr-review

The README still advertised Figma/live-system as deferred and lacked
prerequisites/commands/credentials sections. Rewrite it to reflect the
completed rollout (eleven-agent fan-out, fail-loud MCP checks, traversal,
storage-XHTML posting, reactive footer fallback, dedup incompleteness gate)
and mirror the unic-pr-review README structure: Prerequisites, Installation,
Quick start, How it works (mermaid of the real review-spec flow), Commands,
Credential file, env overrides, Version history.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Generated via /team-onboarding from 30-day usage, then hand-tuned: refreshed
work-type/skill stats, checklist updated for the shipped unic-pr-review and
unic-spec-review plugins plus optional Figma/Playwright MCPs, and Team Tips
+ Get Started filled in (Gitflow, verification loop, scripted versioning,
spec-first flow, trust-CI-not-self-report). Shareable at the onboard link.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@orioltf orioltf merged commit 606e2cb into main Jun 9, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant