Skip to content

Releases: alexfordlabs/project-architect

v9.3.0

Choose a tag to compare

@alexfordlabs alexfordlabs released this 13 Jun 08:21
v9.3.0
5561047

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, and claude-opus-4-8 wherever an
    exact id is needed. This supersedes the v9.2.0 fable pin: 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-adrs and migrate no longer crash on an unquoted date. YAML
    parses an unquoted date: 2026-06-12 into a datetime.date, which json.dumps
    cannot serialize — reconcile-adrs crashed on every real project, and the same
    class in emit_frontmatter aborted migrate after 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 17 records the JSON int 17; 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 shared usable_pin predicate now drives
    both emission and the audit: an int is honored losslessly; a float
    (irrecoverably ambiguous — 3.10 parses to 3.1) is refused so the floor is
    used and check 36 flags it. set-decision also keeps stack.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 a docker-compose.yml with an orphan build: .. Serverless-backend
    matching is value-normalized, so display-name / hyphen variants are recognized.
  • package.json carries a valid npm name. A human-readable project.name
    ("Tiger Panther: The Game") is slugified ("tiger-panther-the-game") instead of
    an unpublishable manifest.
  • /upgrade-project no longer overwrites a doc's format_version (the
    doc-format constant) with the state schema version.
  • /iterate-design, /re-architect, and /upgrade-project no 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, plus architecture.*, game.*, platforms.*,
    and feature-gate rows), and the decision-revisor now degrades gracefully
    (superseding-ADR affected_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

Choose a tag to compare

@alexfordlabs alexfordlabs released this 13 Jun 00:56
v9.2.0
169b36a

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-tracking fable alias; the Preflight model gate
    targets Fable-class (claude-fable-5 as 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's settings.json
    quality bar, golden-path ai.model, claude-code-integration's generated
    agent examples) name claude-fable-5. tests/test_v92_model_fable.sh pins
    all surfaces so an Opus-pinned dispatch can't silently return.
  • check_19 audit_freshness no 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-before locked_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_advance tolerates the preflight opener —
    pre-v9.2 SKILL.md instructed set-phase preflight, so real projects carry a
    PhaseAdvanced to=preflight in their append-only log forever; check_20
    treated it as an unknown phase and permanently blocked their audits.

Fixed

  • reconcile-adrs TypeError on mixed ADR id types — YAML parses an
    unquoted id: 0001 as the int 1; mixed with quoted-string ids from sibling
    files, the index sort crashed ('<' not supported between 'str' and 'int').
    Ids (and supersedes/superseded_by entries) 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 → Kickoff set-phase kickoff.

v9.1.0

Choose a tag to compare

@alexfordlabs alexfordlabs released this 13 Jun 00:23
v9.1.0
ccd9acd

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 and stack.versions.<token> was never recorded, the audit flags it with
    the exact set-decision remediation. A floor fallback can no longer ship
    silently. Applicability comes from configs.applicable_pin_tokens — the SAME
    predicates generate-configs emits by, so obligation and emission cannot
    diverge. The auditor is now 36 checks.
  • bin/floor-check — release-time freshness audit for configs.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 devDependencies in generated package.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.typescript joins the canonical pin-token set
    (next, react, node, python, postgres, redis, biome,
    typescript) across decision-keys.md, SKILL Phase 4, research-scout § 1a,
    research-prompts, and the TECH_STACK template.
  • Golden-path expiry is honored — golden-path list now annotates any path
    whose valid_through has 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.FLOORS refreshed to newest stable as of 2026-06-13 and
    consolidated into one registry: next ^16.0.0 (was ^15.0.0), node 24
    (was 22), python 3.14 (was 3.11), postgres 18 (was 17), redis 8
    (was 7), biome 2.5.0 (was 1.9.4), typescript ^6.0.0 (new). Floors
    are a fallback only — research-resolved stack.versions.* pins always win.
  • gen_biome_json is 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-level organizeImports. Previously the 1.x-only shape was
    emitted unconditionally — a hard config error under any 2.x binary. The
    linter block stays on rules.recommended: true, valid across 1.x and all
    2.x (the rules.preset alias is 2.5-only; live-validated against 2.4.15).
  • generate-configs no longer emits a silent node Dockerfile for every
    stack
    — emission rides the new shared dockerfile_language predicate:
    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.json now ships whenever package.json does (its build script
    runs tsc).
  • Check 23 dependency_freshness scans 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.md migrated to the canonical stack.* namespace —
    its tables still used pre-v8 keys (database.engine, frontend.framework),
    so decision-revisor lookups for canonical keys (stack.database.engine)
    missed every stack row; ai.* rows renamed to their canonical equivalents
    and rows added for stack.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 superseded stack.frontend.version key (removed from decision-keys.md
    too); ai.model examples bumped claude-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.json 1.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.sh pins 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

Choose a tag to compare

@alexfordlabs alexfordlabs released this 11 Jun 08:34
v9.0.0
12d4211

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

  • LICENSE is now the Apache License, Version 2.0 (was MIT).
  • NOTICE rewritten 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.license examples, golden-path descriptions) are intentionally
    unchanged — they describe the user's project, not this one.
  • plugin.json declares "license": "Apache-2.0".

v8.2.1

Choose a tag to compare

@alexfordlabs alexfordlabs released this 11 Jun 08:02

v8.2.1 — 2026-06-11

Licensing & provenance. Documentation-only patch; no behavior change.

Added

  • NOTICE file. 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

Choose a tag to compare

@alexfordlabs alexfordlabs released this 05 Jun 21:23
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 ==/!= and IN [...] condition forms).
  • More config versions are state-driven. pyproject.toml, docker-compose.yml, and biome.json now read their pins from the stack.versions.* namespace (postgres, redis, biome) — and research-scout is 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's mobile_app / desktop_app / ml_project / embedded_system, so those archetypes silently received a smaller document set. Corrected.
  • pyproject.toml now agrees with the Dockerfile on Python. requires-python and the ruff target-version track the same researched Python pin the Dockerfile already used, instead of a frozen 3.11.

v8.1.2

Choose a tag to compare

@alexfordlabs alexfordlabs released this 01 Jun 04:15
v8.1.2
40cac4b

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.sh is now portable. It asserted the on-disk presence of the gitignored CHANGELOG.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

Choose a tag to compare

@alexfordlabs alexfordlabs released this 01 Jun 04:06
v8.1.1
d6f3afa

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-project and /re-architect are runnable again. Both commands invoked the v7 architect-ledger binary (removed at the v8 cutover) with a flag architect-brain rejects; they now call architect-brain detect and their prose is reconciled to its real {situation, schema_version, state_layout} output (the below_floor / newer_than_plugin / can_rederive signals are orchestrator-derived, per the canonical flow docs).
  • Plugin version is single-sourced from plugin.json. architect_brain.__version__ (and the --version output) had drifted to a hardcoded 8.0.0; it now resolves from .claude-plugin/plugin.json, and the migrator stamps that resolved version into migrated ADR/doc plugin_version frontmatter 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 bare skills/… paths were unresolvable (a silent template-read failure → fabricated structure). document-author now receives a catalog_path INPUT, and agent-common.md makes a bare relative reference path a hard BLOCKER.

Added

  • Continuous integration. A GitHub Actions workflow runs the full suite (bash harness + the architect_brain Python suite) across Python 3.10–3.13 on every push and PR, plus shellcheck and a full-tree gitleaks secret scan; a release-guard job refuses any tag whose number disagrees with plugin.json or 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-commands install in the README install path.

v8.1.0 — enforcement + coherence

Choose a tag to compare

@alexfordlabs alexfordlabs released this 01 Jun 00:30
v8.1.0

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 whose DecisionMade events are all orchestrator-sourced (zero by:"user") — the signature of a skipped interview, previously invisible in the ledger. The orchestrator now records AskUserQuestion answers 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 new stack.versions.* namespace, and makes document-catalog.md's previously-dangling TECH_STACK.md dependency resolve.
  • stack.versions.* decision namespace. research-scout § 1a delivers each newest-stable pin (e.g. stack.versions.next); the Stack phase records them; generate-configs reads them via configs._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 LockSet refuses (exit 1) unless the latest recorded AuditCompleted verdict is clean (--force overrides); check_19 audit_freshness now reads the vetting audit's result, not just its timestamp. A lock can no longer be placed atop a blocked (or absent) audit.
  • generate-configs versions come from researched state, not frozen constants. gen_package_json / gen_dockerfile read stack.versions.* (conservative floors as fallback); output stays deterministic.
  • The 4-tier auditor is now 35 checks (was 34).
  • AuditCompleted ledger entries record worst_severity + the --ack reason. 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_docs precision. 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-brain checks its interpreter floor (python3 present + ≥ 3.10) and exits with a clean message; main() wraps subcommand dispatch, so a corrupt events.jsonl / projection yields a clean architect-brain: <Type>: <msg> + exit 1 instead of a JSONDecodeError traceback (argparse --help / usage still exit normally).
  • architecture-specialist recorded decisions via the wrong invocation — the bare python3 -m architect_brain … (a ModuleNotFoundError in a subagent with no PYTHONPATH) is now the ${CLAUDE_PLUGIN_ROOT}/bin/architect-brain wrapper.
  • research-prompts.md renumbered to the v8 phase ladder (was pre-v8 "Phase 0/1/2/2.5/3", with the Stack prompt before pattern-validation).