Repository navigation
Releases: alexfordlabs/project-architect
Release list
v9.3.0
v9.3.0 — 2026-06-13
Opus model pin + a second round of tiger-panther run-bug fixes.
Changed
- Every subagent is now pinned to the latest Opus Claude model —
model: opus
in all 7 agent frontmatters and every SKILL.md dispatch directive, the
re-architect and generated-project surfaces, andclaude-opus-4-8wherever an
exact id is needed. This supersedes the v9.2.0fablepin: a hardcoded model
the account lacks hard-fails with no fallback, so the reliable,
always-available top tier (the latest Opus 4.8, 1M context) is the dependable
choice. The Preflight model gate now targets a current Opus with 1M context
(a newer Fable/Mythos model also qualifies).tests/test_v93_model_opus.sh
pins every surface.
Fixed
reconcile-adrsandmigrateno longer crash on an unquoted date. YAML
parses an unquoteddate: 2026-06-12into adatetime.date, whichjson.dumps
cannot serialize —reconcile-adrscrashed on every real project, and the same
class inemit_frontmatterabortedmigrateafter its atomic state flip,
leaving a half-migrated project. Both paths now normalize date/datetime to ISO
text.- A recorded numeric version pin is honored, not silently dropped to the floor.
set-decision stack.versions.postgres 17records the JSON int17; the config
generators' string-only guard discarded it and shipped the plugin floor
(postgres:18) while audit check 36 still reported it "recorded" — the two
disagreed on the same value. A single sharedusable_pinpredicate now drives
both emission and the audit: an int is honored losslessly; a float
(irrecoverably ambiguous —3.10parses to3.1) is refused so the floor is
used and check 36 flags it.set-decisionalso keepsstack.versions.*
values as strings. - No spurious container artifacts for a serverless/edge or no-template stack.
A Supabase-edge-functions (Deno) backend no longer gets a node Dockerfile, and
a stack whose database has no Dockerfile template (e.g. rust + postgres) no
longer gets adocker-compose.ymlwith an orphanbuild: .. Serverless-backend
matching is value-normalized, so display-name / hyphen variants are recognized. package.jsoncarries a valid npm name. A human-readableproject.name
("Tiger Panther: The Game") is slugified ("tiger-panther-the-game") instead of
an unpublishable manifest./upgrade-projectno longer overwrites a doc'sformat_version(the
doc-format constant) with the state schema version./iterate-design,/re-architect, and/upgrade-projectno longer dead-end
on a recorded decision key the revision playbook didn't list. The revision
playbook was reconciled to the canonical decision-key namespace
(observability.*,testing.framework/testing.strategy,analytics.provider,
security.secrets_management, plusarchitecture.*,game.*,platforms.*,
and feature-gate rows), and thedecision-revisornow degrades gracefully
(superseding-ADRaffected_docs→ catalog type-anchored docs) instead of
hard-erroring on an uncovered key. A namespace-coherence test locks the
playbook against the registry.
v9.2.0
v9.2.0 — 2026-06-13
Latest-Fable everywhere + the three remaining tiger-panther run bugs.
Changed
- Every model surface now targets the latest Fable-class Claude model
(operator standing rule). All 7 subagent frontmatters and every SKILL.md
dispatch use the auto-trackingfablealias; the Preflight model gate
targets Fable-class (claude-fable-5as of this release; any newer
Fable/Mythos id qualifies), with a current Opus + 1M context as the accepted
floor; generated-artifact surfaces (claude-tooling-author'ssettings.json
quality bar, golden-pathai.model, claude-code-integration's generated
agent examples) nameclaude-fable-5.tests/test_v92_model_fable.shpins
all surfaces so an Opus-pinned dispatch can't silently return. - check_19
audit_freshnessno longer fails on clean post-lock re-audits —
SKILL Phase 9 (Tooling Execution) runs after lock and prescribes re-audits,
so "any post-lock audit = defect" made the skill contradict its own gate
(every post-Phase-9 audit went permanently red). New semantics: the lock
must be vetted by a CLEAN audit at-or-beforelocked_at(missing or blocked
vetting audit still fails), and a post-lock audit only fails when it is
itself BLOCKED (state degraded after lock). - check_20
no_oob_phase_advancetolerates thepreflightopener —
pre-v9.2 SKILL.md instructedset-phase preflight, so real projects carry a
PhaseAdvancedto=preflight in their append-only log forever; check_20
treated it as an unknown phase and permanently blocked their audits.
Fixed
reconcile-adrsTypeError on mixed ADR id types — YAML parses an
unquotedid: 0001as the int 1; mixed with quoted-string ids from sibling
files, the index sort crashed ('<' not supported between 'str' and 'int').
Ids (andsupersedes/superseded_byentries) now normalize to the
canonical zero-padded string form.- SKILL.md no longer instructs
set-phase preflight— preflight is the
banner-only opener and is not on check_20's phase ladder; the run's first
phase event is the Phase 0a → Kickoffset-phase kickoff.
v9.1.0
v9.1.0 — 2026-06-13
Latest-stable everywhere: the version-pin chain is now enforced end-to-end.
A live forensic audit of a scaffolded project found a generated biome.json
shipping a full major behind newest-stable because the pin chain had three
silent gaps: a stale generator floor, a research-obligation that didn't match
the emission condition, and an audit blind spot. All three classes are fixed,
plus every sibling defect a repo-wide scan surfaced.
Added
- New audit check 36
version_pins_recorded(WARNING) — for every pin
token the chosen stack makes applicable, if the generated artifact exists on
disk andstack.versions.<token>was never recorded, the audit flags it with
the exactset-decisionremediation. A floor fallback can no longer ship
silently. Applicability comes fromconfigs.applicable_pin_tokens— the SAME
predicatesgenerate-configsemits by, so obligation and emission cannot
diverge. The auditor is now 36 checks. bin/floor-check— release-time freshness audit forconfigs.FLOORS:
queries npm + endoflife.date and reports any floor that has drifted off the
newest stable line. Non-zero exit = bump the floors before tagging.- Pinned
devDependenciesin generatedpackage.json— every tool the
generated scripts invoke is now declared:@biomejs/biome(exact pin),
typescript,@types/node(tracks the node major), and on Next.js stacks
@types/react/@types/react-dom(track the react pin). Previously the
scripts referenced an undeclared global toolchain. stack.versions.typescriptjoins the canonical pin-token set
(next,react,node,python,postgres,redis,biome,
typescript) acrossdecision-keys.md, SKILL Phase 4, research-scout § 1a,
research-prompts, and the TECH_STACK template.- Golden-path expiry is honored —
golden-path listnow annotates any path
whosevalid_throughhas passed ([EXPIRED <date> — re-verify stack + versions]); previously the field was dead metadata and an expired bundle
would be offered as current forever.
Changed
configs.FLOORSrefreshed to newest stable as of 2026-06-13 and
consolidated into one registry: next^16.0.0(was^15.0.0), node24
(was22), python3.14(was3.11), postgres18(was17), redis8
(was7), biome2.5.0(was1.9.4), typescript^6.0.0(new). Floors
are a fallback only — research-resolvedstack.versions.*pins always win.gen_biome_jsonis version-aware — a 2.x pin (and the 2.x floor) emits
the Biome 2 shape (assist.actions.source.organizeImports); a 1.x pin emits
the legacy top-levelorganizeImports. Previously the 1.x-only shape was
emitted unconditionally — a hard config error under any 2.x binary. The
linter block stays onrules.recommended: true, valid across 1.x and all
2.x (therules.presetalias is 2.5-only; live-validated against 2.4.15).generate-configsno longer emits a silent nodeDockerfilefor every
stack — emission rides the new shareddockerfile_languagepredicate:
python and JS/TS stacks get their runtime's Dockerfile; rust/go/undecided
stacks get none (the old behavior based a rust project on a node image).
tsconfig.jsonnow ships wheneverpackage.jsondoes (its build script
runstsc).- Check 23
dependency_freshnessscans the whole tree — nested manifests
(web/package.json,crates/core/Cargo.toml, …) are now audited;
third-party/build dirs (node_modules,vendor,dist,target, …) are
pruned. Previously only root-level manifests were scanned, and a repo with
no root manifest was never scanned at all. revision-playbook.mdmigrated to the canonicalstack.*namespace —
its tables still used pre-v8 keys (database.engine,frontend.framework),
sodecision-revisorlookups for canonical keys (stack.database.engine)
missed every stack row;ai.*rows renamed to their canonical equivalents
and rows added forstack.frontend.language,stack.cache.engine, and
stack.versions.*.- Stale literals swept from decision surfaces: the
modern_saas_2026
golden path no longer hardcodes "Next.js 15" in its description nor seeds
the supersededstack.frontend.versionkey (removed fromdecision-keys.md
too);ai.modelexamples bumpedclaude-opus-4-7→claude-opus-4-8;
document-author's version-family example unstuck from "15.x"; the
STABILITY_AND_RFC template no longer asserts Go 1.22 as "the latest at time
of writing"; SKILL Phase 4 records pins via<resolved-pin>placeholders
instead of copy-able stale literals, and now enumerates all 8 tokens + all
5 consuming generators. - CI matrix extended to Python 3.14.
Fixed
- The tiger-panther-game defect chain (stale
biome.json1.9.4, invalid-shape
config for a 2.x pin, undeclared toolchain, unaudited nested manifest) is
fixed at every link;tests/test_v91_pin_coverage.shpins the four
obligation surfaces (research-scout, SKILL, decision-keys, configs.FLOORS)
to the same token set so they cannot drift apart again.
v9.0.0
v9.0.0 — 2026-06-11
Relicense: MIT → Apache License 2.0. No functional change. Rationale: the
NOTICE file's attribution becomes a binding redistribution condition (Apache-2.0
§4(d)); the license itself now states that no trade-name/trademark rights are
granted (§6); and users gain an explicit patent grant with defensive
termination (§3). Every version up to and including v8.2.1 remains MIT —
those grants are irrevocable for those versions; this change governs v9.0.0
onward.
Changed
LICENSEis now the Apache License, Version 2.0 (was MIT).NOTICErewritten for Apache-2.0 (§4(d) redistribution condition; §6
trade-name non-grant; MIT note for ≤ v8.2.1).- All 332 source attribution headers flipped
License: MIT→
License: Apache-2.0. Templates and defaults that set the user's
generated project license (e.g.SCAFFOLD_PLAN's MIT block,
stack.licenseexamples, golden-path descriptions) are intentionally
unchanged — they describe the user's project, not this one. plugin.jsondeclares"license": "Apache-2.0".
v8.2.1
v8.2.1 — 2026-06-11
Licensing & provenance. Documentation-only patch; no behavior change.
Added
NOTICEfile. Makes explicit the attribution the MIT license already requires (copyright + permission notice must travel with copies and substantial portions), claims the project's trade names ("project-architect", "Alex Ford Labs"), and records that authorship/provenance are independently archived (Software Heritage; third-party timestamped repositories) from the project's inception in February 2026 onward.
v8.2.0
v8.2.0 — 2026-06-05
Catalog & config-generation correctness. Additive fixes that make advertised project types reachable and make generated scaffolds track researched versions. No change to the 12-phase flow, the event-sourced state model, or the 35-check audit.
Added
- Three project types are now first-class:
web3,scientific,ar_vr. They were advertised and already shipped catalog documents and interview drill-downs, but were missing from the canonical type registry — so their signature documents (WEB3_SPECIFIC,SCIENTIFIC_COMPUTING,AR_VR_SPECIFIC) could never be selected. Registered, with a guard test pinning the catalog↔registry contract (scanning both the==/!=andIN [...]condition forms). - More config versions are state-driven.
pyproject.toml,docker-compose.yml, andbiome.jsonnow read their pins from thestack.versions.*namespace (postgres,redis,biome) — andresearch-scoutis instructed to record them — instead of frozen constants, so a researched pin flows into the scaffold.
Fixed
- Catalog type-literal typos. Four catalog conditions referenced
mobile/desktop/ai_ml/embedded, none of which match the registry'smobile_app/desktop_app/ml_project/embedded_system, so those archetypes silently received a smaller document set. Corrected. pyproject.tomlnow agrees with the Dockerfile on Python.requires-pythonand the rufftarget-versiontrack the same researched Python pin the Dockerfile already used, instead of a frozen3.11.
v8.1.2
v8.1.2 — 2026-06-01
CI green. A one-line follow-up to v8.1.1: the new CI's first run did its job and caught a non-portable test. No plugin behavior change.
Fixed
test_v7_changelog_curated.shis now portable. It asserted the on-disk presence of the gitignoredCHANGELOG.dev.md, which holds in the author's working tree but not in a fresh clone / CI checkout — so the suite was green locally yet red in CI. The existence check is now conditional (run only when the file is present); the real invariant — that the file is untracked, and the public CHANGELOG is curated — is still pinned, so a clean checkout stays green.
v8.1.1
v8.1.1 — 2026-06-01
Correctness + CI. A focused fix release: the two cross-version commands are runnable again, the plugin version is single-sourced, dispatched subagents can resolve their reference paths, and the repo now runs CI on itself. No change to the 12-phase flow, the event-sourced state model, or the 35-check audit.
Fixed
/upgrade-projectand/re-architectare runnable again. Both commands invoked the v7architect-ledgerbinary (removed at the v8 cutover) with a flagarchitect-brainrejects; they now callarchitect-brain detectand their prose is reconciled to its real{situation, schema_version, state_layout}output (thebelow_floor/newer_than_plugin/can_rederivesignals are orchestrator-derived, per the canonical flow docs).- Plugin version is single-sourced from
plugin.json.architect_brain.__version__(and the--versionoutput) had drifted to a hardcoded8.0.0; it now resolves from.claude-plugin/plugin.json, and the migrator stamps that resolved version into migrated ADR/docplugin_versionfrontmatter instead of a stale literal — so a release bump propagates everywhere automatically. - Dispatched subagents can resolve their reference paths. The template / catalog / integration-recipe / playbook paths handed to subagents are now absolute (
${CLAUDE_PLUGIN_ROOT}/…) — a dispatched agent runs in the user's project, so the previous bareskills/…paths were unresolvable (a silent template-read failure → fabricated structure).document-authornow receives acatalog_pathINPUT, andagent-common.mdmakes a bare relative reference path a hard BLOCKER.
Added
- Continuous integration. A GitHub Actions workflow runs the full suite (bash harness + the
architect_brainPython suite) across Python 3.10–3.13 on every push and PR, plusshellcheckand a full-treegitleakssecret scan; a release-guard job refuses any tag whose number disagrees withplugin.jsonor that lacks a CHANGELOG entry.
Changed
- CONTRIBUTING / README hygiene. Removed a dead test-plan link and stale "markdown-only" / marketplace claims; surfaced the hard Python 3.10+ prerequisite and the required
commit-commandsinstall in the README install path.
v8.1.0 — enforcement + coherence
v8.1.0 — 2026-06-01
Enforcement + coherence. Hardens the v8 gates that were still advisory prose, closes the version-pin pipeline end-to-end, and removes the raw-traceback / phantom-doc rough edges surfaced by a forensic review of a real bootstrap. The 12-phase flow and event-sourced state model are unchanged — this is additive features + behavioral hardening.
Added
- 35th audit check —
user_provenance(35, WARNING). Flags a LOCKED project whoseDecisionMadeevents are all orchestrator-sourced (zeroby:"user") — the signature of a skipped interview, previously invisible in the ledger. The orchestrator now recordsAskUserQuestionanswers with--by user(Kickoff / Vision / Architecture / Stack / CLI-gate); only derived/mechanical keys keep--by orchestrator. TECH_STACK.md— a real generated document (the catalog is now 107 documents). Surfaces the chosen stack plus a version-pins table fed by the newstack.versions.*namespace, and makesdocument-catalog.md's previously-danglingTECH_STACK.mddependency resolve.stack.versions.*decision namespace.research-scout§ 1a delivers each newest-stable pin (e.g.stack.versions.next); the Stack phase records them;generate-configsreads them viaconfigs._pin— so the scaffold ships current versions instead of plugin-baked floors.append-event --force— the audited escape hatch for the new mechanical LOCK gate.
Changed
- The LOCK gate is now mechanical, not advisory prose.
append-event --type LockSetrefuses (exit 1) unless the latest recordedAuditCompletedverdict isclean(--forceoverrides);check_19 audit_freshnessnow reads the vetting audit'sresult, not just its timestamp. A lock can no longer be placed atop ablocked(or absent) audit. generate-configsversions come from researched state, not frozen constants.gen_package_json/gen_dockerfilereadstack.versions.*(conservative floors as fallback); output stays deterministic.- The 4-tier auditor is now 35 checks (was 34).
AuditCompletedledger entries recordworst_severity+ the--ackreason. Two same-count audits ("3 failed / clean" vs "3 failed / blocked") are now distinguishable, and an acked-clean is distinguishable from a genuinely-clean run.check_03 decisions_in_docsprecision. Exempts operational/bookkeeping keys (git.*/scm.*/scaffold.*/carry_forward.*/memory_pointer) so the WARNING surfaces only substantive undocumented decisions. Severity unchanged.
Fixed
- No more raw tracebacks on a degraded state.
bin/architect-brainchecks its interpreter floor (python3 present + ≥ 3.10) and exits with a clean message;main()wraps subcommand dispatch, so a corruptevents.jsonl/ projection yields a cleanarchitect-brain: <Type>: <msg>+ exit 1 instead of aJSONDecodeErrortraceback (argparse--help/ usage still exit normally). architecture-specialistrecorded decisions via the wrong invocation — the barepython3 -m architect_brain …(aModuleNotFoundErrorin a subagent with noPYTHONPATH) is now the${CLAUDE_PLUGIN_ROOT}/bin/architect-brainwrapper.research-prompts.mdrenumbered to the v8 phase ladder (was pre-v8 "Phase 0/1/2/2.5/3", with the Stack prompt before pattern-validation).