Releases: wfukatsu/nexus-architect
Release list
v0.38.1
Fixed
--layering=cleanafter its first real run onec-monolith(order-service). The
specification, the API layer, the interactors, the contract tests and the conformance check all
came out (unit 140 / integration 28 / acceptance 30 / contract 42 green apart from the design
contradictions the run surfaced), and 27 places where the skills left the clean style to the
generator's judgment are now stated:execute(<Op>InputData)as the boundary method,
void present(<Op>OutputData)with a request-scoped presenter, domain-free data records with
the domain →OutputDatacopy moved to the interactor (two mapper halves, two owners), use cases
without anoperationId(saga / recovery / workers) having no output boundary, shared
collaborators allowed inusecase/and the transaction-opening rule stated by package rather than
class suffix, participant operations joining rather than opening, exception types the handler
branches on living inusecase/, the component scan coveringapi/, the behaviour-visible
consequence of a presenter with no business judgment, and — the biggest gap — a style switch on an
already-generated service described as the migration it is, withgenerate-scalardb-code
repairing JaCoCo, ArchUnit and the scan.generate-api-codenow starts the context after
compiling (a Boot 4 / Jackson 3 property key had left a compiling application unable to start),
boxesrequiredscalars so@NotNullcan fire, and keeps schema key names on collision;
generate-contract-testsadds the one-boundary-one-interactor and single-presenter ArchUnit
rules, pinsapi-contract-map.jsoninto the test tree, allows a separatecontractTestsource
set when JUnit platforms collide, fixes its duplicated step number, and reports a red suite as a
completed run with causes;verify-implementationchecks the clean dependency rule and the
component scan itself, records where the inherited contract map disagreed with the code, and names
a delegate's missing inputs.
v0.38.0
Added
/architect:design-implementation --layering=ddd|clean.cleanrecords Clean Architecture
vocabulary for the application layer — one Use Case (input boundary) + Interactor per
operationId,InputData/OutputDatarecords, an output boundary and a Presenter under
api/presenter/, theusecase/package in place ofapplication/. The choice is written once as
layering_stylein the frontmatter ofapi-layer-spec.md(seeded byoptions.layering_style) and
read from there bygenerate-api-code,generate-graphql-code,generate-scalardb-code,
generate-contract-tests(ArchUnit: controllers bound to boundaries, interactors never importing
api/orinfrastructure/, presenters importing no domain type),generate-acceptance-tests
andverify-implementation— no generator takes a flag of its own. Repository ports keep their
DDD name and domain ownership under both styles, since the aggregate manifest, the Fakes and the
coverage / mutation thresholds are keyed on them. Documented indocs/ddd-coverage.md.
Changed
- AI code quality gate: what the second
order-servicegate run taught. Amajorfinding without
a recorded owner and decision keeps the verdict at FAIL rather than CONDITIONAL; SAST evidence is
files and rules scanned, with 0 files reported asnot-configured(the usual cause: a
git-ignored tree scanned without--no-git-ignore); the mutation report's timestamp is the proof
it re-ran, equivalent mutants are re-read from the current run and their acceptance is a recorded
decision; coverage aggregated over several test tasks is reported per layer against the §6 budget;
and two dependency-scanner traps are named — classifier-suffixed jar versions Trivy compares
without the suffix, and transitive findings cleared by a looked-upconstraintspin, never by
suppressing the advisory.
v0.37.2
Changed
- Documentation brought in line with the TDD workflow and the test skills.
docs/getting-started
(en/ja) gains the characterization step on the legacy path, what gate stages 2 and 4 hold the
scaffold to, and the delivery path described as test-driven (walking-skeleton Issue, the
test:→feat:→refactor:series, Fakes and injectedClock, reproduce-first fixes);
README's delivery paragraph says the same;docs/architect-input-requirements(en/ja) lists a
runnable legacy system — or a test-only datasource substitution — as an input for
characterization tests;docs/scalardb-development(en/ja) documents the scaffold's test tree;
OMNIGENT's quality-gate section names the stage 2/4 tasks and the clean-build rule; the
skill-reference rows forexport-backlog,implement-backlogandreview-issuedescribe the
current behaviour.
v0.37.1
What the first real run of the v0.37.0 test skills on the ec-monolith sample taught. The run
itself worked — order-service generated with unit 99/99, integrationTest 21/21 over an
in-process ScalarDB, PIT 96 %, 32 characterization fixtures pinning 6/6 entry points of the legacy
order module, 30/30 Gherkin scenarios bound — and the gate returned FAIL for the right reasons:
two acceptance scenarios red because three design artefacts disagree on one rejection slug, and
a transitive CRITICAL CVE. The fixes below are to the skills, not to the sample.
Fixed
generate-characterization-tests. A test-only environment substitution (an H2 profile when
thedocker-composedatabase is absent) is not a modification of the system — allowed, with its
boundary reported; the recording mechanism is now specified (-Precordmode, two runs, a
mask-derivation script); non-determinism inside a string is normalized at observation time
under a named rule; a defective outer seam is pinned together with the next one in; defects
with noDEBT-id get@ObservedDefect("CHAR-…")and a follow-up; the standalone output root
is defined.generate-scalardb-code. The blind-write scenario isPut/Insert—Updateon an
unread record performs an implicit read and commits on 3.19; a multi-serviceTX-is tested
for this service's part with Fake participants asserting the binding; Cluster transaction
propagation is named as unproven by the SQLite backend; the run summary has a path; outbound
ports and Fakes are this skill's, the HTTP client adapters aregenerate-api-code's (new
Outbound Clients section there).generate-acceptance-tests.@SelectPackagesrather than the classpath-resource selector
the engine warns against;@wipgoes on the pinned copy only; the three red cases are kept
apart — not implemented (@wip), unobservable at the chosen driver (@wip+PendingException),
contradicted by the code (a finding, never@wip); theRULE-/EX-criterion is conditional
on an example map; the driver default follows the contract map; fixtures are fixed builders
with arbitrary-supplied defaults; the coverage report is per service; features another service
owns are reported out of scope.- Quality gate /
verify-implementation. Every gate command runs from a clean build state —
an UP-TO-DATE Gradle task exited 0 having run 0 tests;trivy fson the fat jar scanned 0
packages, so dependency scanning without OSV-Scanner uses Trivyrootfsover the extracted
libs; an equivalent mutant is recorded as such only with evidence; a stage-4 red caused by the
design contradicting itself stays FAIL and goes to the design for a decision; stages 5–6 put
tool identifiers (CVE ids) inblocking; an absent API layer makes the contract map's unmapped
operationsinfo, not criticals; the project's package coverage rule decides while per-file
figures are reported; the test-first record isnot-applicablewithout a work item. .gitignorecoversgraphify-out/.
v0.37.0
A second pass over the toolkit with test-driven development as the premise, closing what the
v0.36.0 rules declared but did not connect, and the areas they did not reach.
Added
- Transaction-scenario integration suite.
generate-scalardb-codenow emits one*ITper
TX-entry — happy path, OCC conflict, blind write, 2PC failure and saga compensation where the
design uses them, indeterminate commit — over an in-process SQLite-backed ScalarDB, with an
integrationTesttask (failOnNoMatchingTests), so stage 4 of the quality gate has a suite
behind it instead of a permanentnot-configured.samples/scalardb-transaction-tests/is
the reference shape. /architect:generate-acceptance-tests. Cucumber-JVM step definitions for the Gherkin
scenarios inreports/07_test-specs/bdd-scenarios/(RULE-/EX-tag bound), anapior
applicationdriver over the Fakes with a fixedClock,@wipon scenarios whose item has not
landed (excluded from pass/fail, counted), anacceptanceTesttask and
reports/07_test-specs/acceptance-test-coverage.md— the ATDD outer loop of
rules/tdd-workflow.md§3 made executable. Twenty-first extension-tier skill (108 commands).- Suite policies.
rules/tdd-workflow.md§6: a runtime budget per layer (unit ≤ 60 s,
contract ≤ 3 min, integration / acceptance / characterization ≤ 10 min — over budget is a
majorwith the slowest ten named), tests per layer reported, a flaky-test quarantine
(@Tag("flaky"), counted and aged,majorafter 14 days, automatic retry never enabled on a
gate task) and ubiquitous-language test naming; the gate records all of it, and
review-consistency's terminology dimension checks test and scenario names against the glossary. - Tests in
/scalardb:*and/product:generate-frontend.scaffoldlays outsrc/test/
(repository port +InMemory*RepositoryFake, unit test,ScalarDbTestBackend,*IT) and the
integrationTesttask;build-appwrites each operation's tests before its service code;
review-codegains a Tests item (real engine, OCC / blind write, testable without a database,
weakened tests).generate-frontendemits Vitest + Testing Library tests over composed stories,
page routing tests, a Playwright story-flow smoke andvitest.config.tsthresholds.
Changed
review-issuereproduces before fixing. Every behavioural blocker gets a
test: reproduce <blocker>commit shown failing before itsfix:commit; non-behavioural
blockers say why they skipped it.export-backlogemits the walking skeleton. Onewalking-skeletonIssue per new service,
first in its Sub-Epic, cited by every sibling as its prerequisite.- Characterization gate connected.
implement-backlogrecords thecharacterizationTest
baseline before a transformation-step item starts (red baseline → stop and generate the net);
stage 4 of the gate andverify-implementationrun it after, and a fixture edited in between is
a decision on the Issue. docs/ddd-coverage(.ja).md. The three remaining △/× TDD rows are ◎; rows added for the
integration suite, reproduce-first fixes and frontend tests.
v0.36.0
Closes the gap a DDD × TDD review of the toolkit found: the tests it generated were exhaustive
but nothing made them drive the code, nothing measured whether they would fail if the code were
wrong, and nothing pinned a legacy module before a transformation step touched it.
Added
rules/tdd-workflow.md. Merge-bound code is written test-first as a Red → Green → Refactor
commit series per unit (test:naming the tests that failed,feat:,refactor:editing no
test), verifiable from the branch log; the ATDD outer loop (Gherkin scenario, else contract test,
else invariant example) and the walking skeleton; the structure that makes test-first possible —
one in-memory Fake per repository port, injectedClock/ id generator, transactions opened by
the application service; the exemptions; and what the gate records.implement-backlogSteps
4/5/7 and its acceptance criteria follow it,design-implementationspecifies the testability
constraints,generate-scalardb-codeemits the Fakes under**/fakes/, and
generate-contract-testsadds the ArchUnit rules (nonow()/randomUUID()in the domain).- Test quality in the quality gate. Stage 2 of
rules/ai-code-quality-gate.mdnow measures
line/branch coverage of the changed files (JaCoCo, 90/80 ondomain/+application/, 70
elsewhere), the mutation score of the touched domain packages (PIT, 80 % — and one surviving
mutant on an invariant-enforcing or guard line fails the stage by name), and the test-first
record per unit (reported, never thresholded). The gate JSON carriescoverage,mutationand
test_first;options.quality_gateoverrides the thresholds per project;
verify-implementation, the CI workflowgenerate-infra-codeemits and the build files
generate-scalardb-codewrites are wired to the new tasks. /architect:generate-characterization-tests. Golden-master tests recorded from the
running legacy system — a seam inventory per module, fixtures whose every value the code
produced (a second run finds and masks non-determinism),@KnownDefect(DEBT-xx)markers that
pin a bug without blessing it, andreports/07_test-specs/characterization-test-coverage.mdby
entry point.design-microservicesnow requires every transformation-plan step to name its
characterization gate. Registered as the twentieth extension-tier skill (107 commands).docs/ddd-coverage.md§ Test-driven development. The TDD practices with their status, and
the gaps that remain visible as rows: suite runtime budget, flaky-test policy, test naming from
the ubiquitous language.
v0.35.1
v0.35.0
What the first full pass over the sample project after v0.34 surfaced — design-implementation,
generate-test-specs, a review-consistency re-run, review-synthesizer, report and
review-report — and what it changed in the toolkit.
Added
tools/build-report.py./architect:reportno longer re-authorsfull-report.htmlby hand
on every run: the consolidated HTML report is built by a tool — one article per source document
with stable ids, phase sections forbefore/,01–04,06_implementation,07_test-specs
(Gherkin.featurefiles as code) andreview/, an executive summary from
review-synthesis.jsonand the Open Questions store (or a clean "review not yet run" state),
Mermaid inlined from the docs-sitenode_modules(cache, then CDN fallback), bilingual chrome
fromoptions.output_language, a single pageh1with documents ath3and their bodies
fromh4.tools/build_report.test.pyguards the rendering contract (35 checks); the report
skill's Input Sources table gained the two new directories.
Fixed
- Body H1 in generated documents. The
design-aggregateanddesign-state-machinetemplates
and theapi-style-decisions.mdprojection repeated the frontmatter title as a body#,
againstrules/output-conventions.md(nine documents per project — review-consistency
CON-110). The templates andtools/lib/api_style_decisions.pydrop it, the committed reference
set is regenerated, andreference-set.test.pyasserts that bodies start at##. - Docs site. Gherkin
.featurefiles underreports/07_test-specs/bdd-scenarios/render as
code pages instead of being copied topublic/as static files.
v0.34.1
Two blume validate findings from the first run of tools/docs-site.sh over a full report set.
Fixed
- Docs site. A section-number anchor in a report link (
scalardb-schema.md#9.5— the shape
rules/architecture-decision-records.mdallows inupstream) is not a Blume heading slug and
produced a broken link on every ADR provenance line; a purely numeric anchor now resolves to the
page. Nested report directories (adr/,aggregates/,state-machines/, …) get distinct
sidebar orders instead of all falling back to alphabetical, and a directory that has its own
index page is labelled by that page's title so the sidebar and the page agree.
v0.34.0
Added
- Report documentation site.
tools/docs-site.shserves a project'sreports/tree as a
local, searchable documentation site on Blume (Astro; Node ≥ 22.12):
one page per report with Mermaid rendered, the OpenAPI / AsyncAPI specs mounted as Blume's API
reference (/api/<service>,/events/<name>), the consolidatedfull-report.htmlserved
as-is, and a landing page built fromwork/pipeline-progress.json(options, every phase with
its status and links to its outputs).sync,dev(re-syncs asreports/changes),build,
preview,validate(internal links),clean. Nothing inreports/is modified: the site is
a stage rebuilt on every run, and every generated directory undertools/docs-site/is
git-ignored. tools/docs-site/sync_reports.py— the conversion: reports become MDX (Blume renders Mermaid
only in.mdx);{…}and a bare<outside code are escaped; numeric phase prefixes are
dropped from routes (01_analysis/x.md→/analysis/x) so cross-report links can be
rewritten; links to project files the site cannot serve (samples/…,work/context.md)
become plain text; each report's own frontmatter is kept under a declarednexuskey (Blume
rejects unknown keys and its built-inid/statuscollide with the ADR shape); top-level
directories are sidebar groups in pipeline order, pages inside follow the manifest's
declared-output order.docs/docs-site.md(+_ja), with pointers from README,docs/getting-startedand CLAUDE.md.