Releases: cdeust/ai-architect-mcp-spec
Release list
v0.8.0
The
[0.7.0]section below was silently rewritten in place by the commit
that produced most of this release (a883cec, #71), attributing this
release's own not-yet-shipped identity completion to the already-tagged
v0.7.0— whose immutable GitHub Release body still carries the original
wording. Restored verbatim here; the corrected, actually-new text moves to
this section, where an upgrader reading release notes will actually see it.
Changed
-
BREAKING: the
prd-spec-generatorplugin identity and release alias are
gone.v0.7.0kept the product and Claude/Codex/Gemini plugins under the
prd-spec-generatorname while only the MCP Registry entry and primary
bundle moved toai-architect-mcp-spec; this release finishes the
migration started there. The product, full-pipeline skill,
Claude/Codex/Gemini plugins, MCPB asset, and Registry entry are now all
ai-architect-mcp-spec; noprd-spec-generatorplugin or.mcpbrelease
alias is retained. Existing callers must replace the
prd-spec-generator:generate-prdskill qualifier with
ai-architect-mcp-spec:generate-prd, and anyone depending on the
prd-spec-generator.mcpbrelease asset must switch to
ai-architect-mcp-spec.mcpb—release.ymlno longer publishes the legacy
alias or its checksum. The internal@prd-gen/*workspace packages,
PRD_GEN_*environment variables,.prd-gendata directory, andprd-gen
MCP server/tool namespace remain stable protocol and storage identifiers;
none of them was ever a published plugin or marketplace identity, so none
of them changes here. (#71) -
BREAKING: the affected-symbols sidecar is now emitted (with empty
arrays) whenevertechnical_specificationran and found zero claims,
instead of being omitted. A docs-only or infra-only PRD that legitimately
produces no code-level claims was previously indistinguishable, by file
presence alone, from "extraction never ran."ai-architect-mcp-codebase
stages/stage-6.mdkeys its regex-fallback decision on the sidecar
file's absence, not on an empty payload — a consumer relying on the old
omit-when-empty behavior to detect "extraction didn't run" will now see the
file present with empty arrays for a zero-claims PRD. The
technical_specificationprompt was also corrected to always emit the
affected-symbols block, since the previous prompt instructed the model to
omit it when nothing was touched, masking the zero-claims signal at the
source. Source:ai-architect-mcp-codebasestages/stage-6.md, "Zero-claims
case — not the same as absent" (§4.2), pinned at commit
92216cd90f8f26cb15348675fc6556b8293edfc1. (#80) -
ecosystem-adapters' upstream client is renamed
AutomatisedPipelineClient→AiArchitectCodebaseClient, matching the
upstream server's own rename (automatised-pipeline→
ai-architect-mcp-codebase), with its config type and source file renamed
to match. The class is exported from@prd-gen/ecosystem-adapters, but
that workspace package is"private": trueand has never been published —
it has no consumer outside this repo, so the rename is not breaking for any
external caller. Self-referential doc comments that still called this
projectprd-spec-generator(its own former name) were also corrected.
(#78, closes #75) -
@modelcontextprotocol/sdk1.29.0 → 1.30.0;mcp-server/index.jsrebuilt
from source against the updated types. Existing test suites pass
unmodified. (#79)
Fixed
- The codebase-intelligence tool prefix pointed at a revoked plugin
spelling.ai-architect-mcp-codebaserenamed its server key to
ai-architect(canonical since its own v0.9.0), so the correct prefix is
mcp__plugin_ai-architect-mcp-codebase_ai-architect__. This repo still
named the pre-rename spelling inSKILL.md,EXAMPLES.md, and
preflight.ts's remediation text; the host silently drops calls to an
unresolvable tool name rather than raising, socall_pipeline_tool
returned nothing and the pipeline continued as if the call had succeeded.
mcp-tool-prefixes.test.ts's hand-copied allowlist carried the same dead
spelling, so the gate that should have caught this would have rejected the
fix; the allowlist moved in the same commit as the two call sites it
guards. A stalecortex@cortex-pluginsreference in the same remediation
text (that plugin renamed tohypermnesia-mcpin v4.15.0) was corrected
alongside it rather than left as the next silent failure. (#73)
Security
- Raise
fast-urito 3.1.5, the first patched version for
GHSA-7p8r-x3mc-p8w7, and rebuild the committed MCP bundle. - Raise
honoto 4.12.34, the first patched version for
GHSA-8j4g-w8fx-2239, and rebuild the committed MCP bundle. A production-tree
pnpm auditreports zero remaining vulnerabilities after both updates.
Docs
- Add
CLAUDE.mdwiring this repo into the global zetetic agent rules
(~/.claude/rules/model-behavior.md,coding-standards.md). (#76)
Canonical .mcpb bundle
Artifact: ai-architect-mcp-spec.mcpb
SHA-256: 1e21c45f00b4eb3874ebf5290e52bf593aa38226b197d0c4a3dc261e54362b6a
v0.7.0
Added
-
Canonical distribution identity. The product and Claude/Codex/Gemini
plugins remainprd-spec-generator, while the official MCP Registry entry
and primary portable bundle becomeai-architect-mcp-specat version 0.7.0.
Repository-facing branding and URLs move to AI Architect MCP Spec at
cdeust/ai-architect-mcp-spec.
Releases retainprd-spec-generator.mcpbas a byte-identical compatibility
asset, and the existingprd-genserver/tool namespace remains unchanged.
The release procedure deprecates all versions of the former Registry entry
only after the new canonical entry is active. -
Portable Spec Verifier for Codex and Gemini CLI. Both host manifests now
launch the same opt-inverifierprofile, which advertises and accepts only
validate_prd_sectionandvalidate_prd_document. The sharedaudit-prd
andvalidate-specskills preserve the boundary between deterministic
structural conformance and semantic or factual correctness. The existing
Claude manifest still selects no profile, so its default 17-toolfull
surface is unchanged. Distribution tests pin manifest versions, launch
arguments, supported skill frontmatter, and that Claude compatibility
invariant.
Fixed
-
Registry checksum guard now validates the field consumers actually read.
Release automation and verification use the schema-definedfileSha256
property rather than agreeing circularly on an unusedfile_sha256field.
The checksum is omitted until the artifact exists, and both identity and
digest guards explicitly reject the former all-zero placeholder. -
Codex and Gemini verifier startup from immutable plugin installs. Their
host manifests now execute the bundled server directly instead of running a
first-launchnpm ciinside the installed plugin directory, which Codex
mounts read-only. Ajv is statically imported so esbuild carries it in the
bundle, and the portable-host smoke test makes the staged plugin root
read-only before exercising MCP initialize, tool discovery, and validation.
Claude Code remains the primary full-profile interface: its.mcp.json
launch path and 17-tool surface are unchanged and covered by regression
tests. The obsolete verifier-only dependency branch was removed from the
remaining Claude launcher after the portable hosts stopped invoking it. -
The server advertised the wrong version to every host that connected.
serverInfo.versionwas the literal0.4.0inpackages/mcp-server/src/index.ts
while package.json,.claude-plugin/plugin.json, manifest.json and server.json
all carried0.6.1— three releases of drift, read by every MCP client at
handshake and by the registry entry built from it. The number is no longer
written down twice:server-version.tsresolves it at startup from the
package.json that ships beside the running bundle (the plugin tree and the
staged .mcpb both carrymcp-server/package.json), falling back to the root
package.json for workspace runs, and returning an obviously-unresolved
sentinel rather than a plausible-looking number if neither can be read.
pnpm bundlestampsmcp-server/package.jsonfrom the root version
(scripts/stamp-bundle-version.mjs), and CI's bundle-freshness check now
diffs all ofmcp-server/, so an unstamped commit fails.The gate that should have caught this is fixed too:
smoke-mcpb.shprinted
serverInfo.versionin its OK line while asserting only that a serverInfo
existed, so the wrong version passed CI in green for three releases. It now
asserts the advertised version equals the one manifest.json declares — two
independent mirrors of the release, so the check can actually fail.
Added
- MCP prompts capability (#28):
prompts/list+prompts/getpublish the
pipeline ordering as enumerable protocol —run_prd_pipeline(context, request)
(coordinate_context_budget → start_pipeline → get_pipeline_state →
submit_action_result → plan_document_verification → conclude_verification) and
verify_prd_document(run_id). Each step's one-line summary is pulled from the
live registered-tool description (the same schematools/listadvertises), so
the ordering is not hand-copied a third time —packages/mcp-server/src/mcp-prompts.ts. - MCP tool profiles (#28):
full/agentprofiles (tool-profiles.ts)
selected by--profile/PRD_GEN_PROFILE.agentadvertises the 12
agent-facing generation/verification tools;fullexposes all 17 including the
internal diagnostics (get_config, read_skill_config, check_health,
get_quality_history, get_strategy_effectiveness). Per-profileinitialize
instructions. - resources/list interop shim (#28): the server now answers
resources/list
andresources/templates/listwith empty arrays and declares the resources
capability, so clients that probe resources regardless of declared capabilities
do not surface-32601as a failed connection (CBM upstream #958). Rationale
recorded at the use site inindex.tsper §8.
Security
-
Every known-vulnerable dependency is gone, and the audit ignore list is now
empty (#36, ScorecardVulnerabilitiesID). The tree carried 39 advisories
(1 critical, 12 high) andpnpm.auditConfig.ignoreGhsassuppressed 8 of them.
Both are now zero:pnpm auditreports{critical:0, high:0, moderate:0, low:0}with nothing suppressed. Floors come from each advisory's
first_patched_version, not from guesswork —vitest(critical
GHSA-5xrq-8626-4rwp,packages/benchmarkwas pinned at^2.0.0while the
rest of the repo ran^4),vite8.1.5,postcss8.5.23,hono4.12.32,
@hono/node-server2.0.5,fast-uri3.1.4,ip-address10.3.1,qs6.15.3,
body-parser2.3.0,js-yaml4.3.0,esbuild0.28.1,mathjs15.2.0.
Transitive floors are pinned viapnpm.overrides, each satisfying its
declaring parent's own range (@modelcontextprotocol/sdkis already at its
latest 1.29.0, so there was no upstream release to wait for).
The previous deferral said mathjs was "absent from the shipped .mcpb"; that
was false —grep -c mathjs mcp-server/index.jsreturns 730 on the bundle it
described — so the two-major bump was owed rather than optional. -
The plugin's runtime provisioning now verifies integrity hashes
(#36, ScorecardPinnedDependenciesID).bin/ensure-deps.shrannpm install --no-package-lockon the user's machine at first launch, so the shipped
plugin re-resolved^8.17.1to whatever it meant that day, unverified. It now
runsnpm ciagainst a committedmcp-server/package-lock.json(44 of 45
entries carry anintegrityhash). Scorecard's shell checker accepts exactly
this one form:isNpmUnpinnedDownloadtreats a command as pinned only when it
containsci, so pinning versions insidenpm install pkg@1.2.3satisfies
neither the checker nor the actual threat. -
Least-privilege
GITHUB_TOKENacross CI (#36, Scorecard
TokenPermissionsID):ci.ymldeclared no top-levelpermissions:block.
Per Scorecard's ownchecks/evaluation/permissions.go, that undeclared
top-level is what zeroed the check;release.yml's job-levelcontents: write— which creating a GitHub Release genuinely requires — costs nothing
because that file already declarescontents: readat top level.
Added
-
Property-based tests for
validateSection(#36, ScorecardFuzzingID):
six contract invariants underfast-check— never throws, score stays in
[0,1],rulesPassed/violations partitionrulesChecked,
hasCriticalViolationsagrees with the violation set, determinism, and
section-type echo. The function is fed LLM output, so its input space is "any
string a model might emit"; the two defectsregex-hardening.test.tsrecords
([:<≤<=]never matching<=, andtest_foomatching insidemytest_foo)
were both reachable by ordinary inputs nobody had written down. -
Dependabot (#36, Scorecard
DependencyUpdateToolID) fornpmand
github-actions. The second ecosystem matters as much as the first: every
uses:is pinned by commit SHA, and a SHA pin never ages out on its own, so
without it the repo trades a supply-chain risk for an unpatched-action risk.
Fixed
-
The
.mcpbbundle could not start.manifest.jsondeclares
server.mcp_config=node ${__dirname}/mcp-server/index.js, and the staged
tree carried nonode_modules: launching it exited immediately with
Cannot find module 'ajv'.bin/ensure-deps.shshipped inside the bundle but
nothing in the.mcpbever invoked it — that launcher belongs to the plugin
path (.mcp.json), which passes it explicitly. The.mcpbnow ships with its
runtime dependencies already provisioned from the committed lockfile
(--omit=optionalleaves out the platform-specificbetter-sqlite3, whose
absence is the already-declared Beta(7,3) prior fallback).The reason this survived a green suite is that the suite exercises the
workspace sources; nothing ever started the artifact users install. So
staging moved out ofrelease.ymlintoscripts/release/stage-mcpb.sh, and
scripts/release/smoke-mcpb.shstages the bundle and speaks MCP to it over
stdio, assertinginitializereturns aserverInfoandtools/listreturns
17 tools. It runs as themcpb smokeCI job on every push and as a gate
inrelease.ymlbefore packing. Verified to fail on the defect it exists to
catch: with provisioning removed it reportsSMOKE FAIL: no response to initialize — the server did not start.Both channels are now verified end-to-end from a clean tree: the plugin path
(ensure-deps.sh→npm ci→ 44 packages) and the.mcpbpath both reach
initialize OK → prd-gen 0.4.0, 17 tools. -
The ReDoS growth-ratio assertion no longer fails on an unchanged tree.
expectSubQuadratictimed everysmalls...
v0.6.1
Added
- README "Use with other MCP hosts" section (Gemini CLI, Codex, Cursor,
Windsurf, VS Code) — explicitly scoped to the standalone deterministic
spec-linter surface (validate_prd_section,validate_prd_document,
plus the direct-consumption planning/diagnostics tools). The full
action-driven pipeline remains host-dependent and is only supported on
Claude Code; the docs say so rather than overclaiming.
Fixed
- Docs aligned with measured reality (#25): test-count badges and prose
628/629 → 877 (vitest workspace count), pipeline step count 9 → 20
(11 PRD-generation steps + 9 opt-in implementation steps behind the
implementation_gatehuman gate), SKILL.md version refs (stale
3.2.0/3.1.0 → package version), and the "does not write code" claim
rewritten honestly: the server never edits source or pushes, but the
opt-in steps 12–20 do drive host subagents that write, test, and review
an implementation, gated byimplementation_gateandpr_gate. - De-flaked real-tsc oracle tests (#25 + this release): the subprocess
tests measure 0.3–3.9s solo (2026-07-22, darwin arm64) but exceeded
vitest's 5000ms default under full-suite parallel load, failing as
timeouts rather than code failures.vi.setConfig({ testTimeout: 30_000 })applied tocode-oracle.test.ts(#25) and
external-oracle.test.ts, with the measurement recorded at the use
site.findTscBinary'stsc --versionprobe timeout also raised
3s → 10s (TSC_PROBE_TIMEOUT_MS): the probe measures 1.6s wall solo,
so 3s left <2× headroom and madeisTscAvailable()flip
load-dependently — throwingOracleUnavailableErrorwith tsc
installed. - LICENSE is now the verbatim MIT text (#26): GitHub licensee reported
NOASSERTION because of the custom preamble and trailing citations note,
breaking license bots and the marketplace's validate-licenses CI. The
preamble, independence statement, and citations note moved verbatim to
the README license section. server.jsonmigrated from the 2025-07-09 snake_case schema to the
current 2025-12-11 camelCase registry schema
(registryType/fileSha256/websiteUrl) required bymcp-publisher
for official MCP registry publication (#26).
Note: no privacy-policy change in this release —
PRIVACY.mdhas
shipped since8decec5and is staged into the.mcpbbyrelease.yml.
.mcpb bundle
SHA-256: d6f0ce83456f65ffd7663966362612fa2224c7670dbc419d72db7cfccfc10815
v0.6.0
Added
- Claim tiering + model-diversity judge slots (
@prd-gen/verification).
A claim whose own text names a deterministically executable verification
method (grep/diff/time/kcov/exit-status/named gate) skips the judge panel
and gets a synthesized rule-tier verdict instead
({kind:"rule",name:"rule-tier"}); architecture-typed claims get one
judge per model inVerifyBudgetConfig.diversity_models(default
["haiku","sonnet"]) instead of N persona-prompted judges on one
underlying model.JudgeVerdict.modelrecords which model judged each
claim;10-verification-report.mdrenders a cross-model-agreement
summary. Measured on the calibration fixture: 30 → 23 judge invocations
(-23%). - Explicit verification acceptance policy at
implementation_gate.
VerificationPolicyConfig(block_on,min_subjective_sampled_ratio,
on_unsampled_below_ratio,on_cross_model_disagreement—
composition-root-injectable, default null uses
DEFAULT_VERIFICATION_POLICY) andevaluatePolicy(), a pure function
turning verification results intopass/needs_attention/blocked.
implementation_gatenow shapes its "Implement / PRD only" question from
that verdict — a bare "Implement" is never offered while blocked — and
records any human derogation onpost_specs.policy_derogation. - Host-side external-judge executor (
scripts/external-judge/). A
zero-dependency Node CLI (judge.mjs) that posts a judge prompt to an
OpenAI-compatible endpoint (Gemini via AI Studio, Mistral via La
Plateforme) when aspawn_subagentsinvocation names a non-Anthropic
model, plus a calibration harness (calibrate.mjs) gated on agreement
≥ 0.7. No API key configured produces an explicit skipped result, never
a fabricated verdict. - Bilingual (FR/EN) hard-output-rule detection: opt-out markers and
per-rule topic/keyword signal lists now recognize French phrasing via a
shared lexicon (rules/lexicon.ts); 12 previously English-only rule
checks (crypto, input validation, output encoding, structured logging,
alerting thresholds, API contract docs, deprecation strategy, etc.) gain
an explicit opt-out path, audited by
packages/validation/src/__tests__/opt-out-coverage.test.ts. - Budget-gated haiku judge panel for
self_checkverification
(PipelineState.verify_budget, composition-root-injected): default
panel reduced to 1 judge/claim (2 for architecture claims); a budget
gate asks the user (reduced sample / full fleet / skip verification)
when the invocation count exceeds a configurable cap (default 20). submit_action_result/start_pipelineresponse-size bound
(boundEnvelopeResponse): an oversizedspawn_subagentsaction has
every invocation's prompt replaced by an observableOmittedStub; the
full unbounded action is recoverable via
get_pipeline_state(run_id, format:"action").10-verification-report.mdnow written byimplementation_gatebefore
the implementation decision is asked, carrying per-claim judge verdicts
when available.- Root
pnpm linttypechecks every workspace package viatsc --noEmit
(lintscript added to all 9 TS packages) and runs in CI.
Fixed
- Root
lintscript was structurally broken:tsc --noEmitat the repo
root found notsconfig.json(onlytsconfig.base.jsonexists), so it
printed CLI help and exited non-zero — invisible because CI never ran
it. Fixed by delegating to each package's ownlintscript via
pnpm -r run lint; CI now runs the step so it cannot rot silently again. - Hard-output-rule false positives on French-language PRD sections
(technical_specification, cryptographic_standards, rate_limiting,
secure_communication, GDPR consent, distributed_tracing) that had
explicit, justified "non applicable" prose the English-only detector
could not recognize. test_traceability_integrity's test-function pattern only matched
Swift-stylefunc test_xxx(, so bash-defined tests (test_xxx() { },
function test_xxx() { }) were reported missing even when present.claim-extractor.ts's evidence-snippet window used a fixed ±N-line
radius that ignored claim boundaries, letting an adjacent claim's
wording bleed into the current claim's evidence and mis-tier it;
snippet()now stops at the neighboring claim's own start line.file-export.tswrote placeholder text for companion files whose
source section(s) produced no content; such files are now omitted
entirely, with the omission and its reason recorded in
00-run-notes.md(numbering stays stable).renderJudgeVerdictsstringified the structuredAgentIdentityjudge
field as"[object Object]"instead of"kind:name".
Fixed (release workflow)
release.ymlnever wrote the real.mcpbSHA-256 back into
server.json#/packages/0/file_sha256, leaving a permanent
000...000placeholder in every published release's manifest. The
workflow now patches the checksum after packing the.mcpband
pushes the single-file update back tomainas part of the same
release job, so this fix is already in effect for the v0.6.0 tag
itself. Fixes #23.
.mcpb bundle
SHA-256: c4897edab70e8a4db79dfc22167087891e3b62131dce1fe40280e9ed0f95d5e3