You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Cut and publish Blueprint 4.1.0 from one exact converged release candidate #521
Cut and publish @kekkai/blueprint@4.1.0 from one exact, release-converged main candidate.
This is the single release-convergence ledger for 4.1.0. Completing this issue means all of the following are true:
the pending 4.1 changesets have been editorially consolidated into an accurate 4.1 release narrative;
the repository has a Changesets-generated 4.1.0 version commit on main;
that exact 4.1.0 main SHA has a verified CI-produced packed candidate;
the complete 4.1 live field matrix passes against that exact candidate with zero release blockers and records blueprint/field-convergence = success;
v4.1.0 points at that same converged SHA;
publication uses either the normal tag-push path or the explicitly authorized recovery path, while still publishing the exact converged candidate with provenance and creating the matching GitHub Release.
Do not split changeset cleanup, versioning, convergence, tag creation, or publication into separate release tickets. They are one outcome: 4.1.0 exists publicly only after one exact candidate has passed the complete release authority chain.
Current release-preparation baseline: main@26e04a40939f200a4e90288c4e92e281e960b4a0, package version 4.0.0.
Evidence
4.1 product scope is already implemented on main
The work intended for this minor release is complete:
#517 is the strongest lifecycle oracle before versioning. Its final replay used the accepted tree that later landed on main and proved, on a disposable sky-1945@3a3c50a adoption:
The two minor entries make the intended next version 4.1.0.
One known editorial correction is required before versioning: preserve-migrated-config-source.md currently says comments “stay as written”. #517 established the stricter truth: every comment is preserved, but a comment nested inside a retired module value may be re-emitted where that retired property stood. Release notes must not claim byte-position preservation that the product does not provide.
The final 4.1 framing should describe the release at product level before the generated change headings. The release story is:
Greenfield posture: proven-empty React/Vue projects can enter either LF or MF from the canonical preset governance without an invented domain model.
Lifecycle: adoption is no longer one-way; upgrade and remove are first-class lifecycle operations with provenance and fail-closed completion.
Evidence: deterministic migration does everything Blueprint can prove, semantic judgment remains explicit, and completion is bound to Doctor/Inspect plus real-adopter evidence rather than optimistic state changes.
Release authority already exists in the repository
.agents/docs/field-triage.md defines the release sequence:
changeset cleanup
→ npx changeset version
→ reviewed 4.1.0 version commit on main
→ successful exact-main CI candidate artifact
→ field repair(s), if needed, through the normal PR chain
→ successful final exact-main CI candidate artifact
→ full field convergence on that exact final candidate
→ blueprint/field-convergence = success on that exact SHA
→ publish that exact candidate either by normal tag push or, when its embedded release tooling is obsolete, by the reviewed recovery path
Release publication requires:
tag semver = package.json.version;
a valid Changesets version commit establishing the release version;
all pending .changeset/*.md consumed;
the final publish candidate to have successful exact-SHA field convergence authority;
a later tooling commit must not inherit or receive a copy of that candidate's field status;
npm provenance that truthfully identifies the actual publishing workflow and the original candidate artifact;
GitHub Release notes generated from the converged candidate's matching CHANGELOG.md section.
The Changesets version commit is the release-version origin, not the product freeze point. Field findings may be repaired afterwards within the same unpublished version. The final candidate that passes full field convergence is the product freeze point.
The release-convergence ticket is allowed to be the human-readable ledger. The exact commit status remains the machine authority.
Adopter upgrade assessment for 4.1
4.1 still requires adopter-side semantic work for a supported historical case after deterministic code has done everything it can prove.
The existing lifecycle catalog intentionally carries:
supportedFrom: 3.2.0;
deterministic legacy-unit-shape migration introduced in 4.0;
review-retired-module-private for configurations whose 3.2 source declared retired module.private;
LIFECYCLE_SINCE = 4.1.0.
Do not rewrite introducedIn to 4.1 merely because the lifecycle command ships in 4.1. The operation describes the historical semantic change it repairs. #517 proved that the 4.1 lifecycle can execute that historical responsibility correctly.
Before versioning, re-run the catalog/release assessment against the final main source. If no new semantic requirement exists beyond the current catalog, record that conclusion in this ticket instead of inventing an empty 4.1 operation.
Execution Protocol — Skills and GitHub Actions
This ticket deliberately spans preparation, versioning, live convergence, and publication, but one skill does not own the whole release. Handoffs are explicit.
Stage 0 — Shape is complete
Owner:shape-ticket
This issue is the shaped release contract. Shape does not edit release files, run field agents, create the version commit, tag, or publish.
Re-enter shape-ticket only for:
post-Accept review of a release-preparation/version PR;
a material release-contract question discovered during delivery that current repository evidence cannot resolve;
final decision-fidelity review after a repaired release candidate changes the shaped outcome.
Do not use Shape as the runner for routine release steps.
Stage 1 — Prepare Changesets and assemble the 4.1.0 version candidate
Owner:deliver-ticket
Trigger deliver-ticket when the owner asks to start/continue #521 release preparation.
Delivery must:
branch from current origin/main;
review and edit the pending 4.1 changesets;
perform the adopter-upgrade assessment;
run npx changeset version;
review package.json, package-lock.json, consumed changesets, and generated CHANGELOG.md;
hoist the 4.1 release-framing passage;
run focused checks needed for the release-input edits;
stage the complete version candidate and run the pre-commit fixer;
It must return ACCEPTED before the version candidate is committed.
If it returns CHANGES_REQUIRED, Delivery repairs the uncommitted candidate and requests Acceptance again under the normal two-round rule. A repaired candidate receives a new tree identity.
Commit and PR
After ACCEPTED, deliver-ticket must:
prove git write-tree still equals the accepted tree immediately before commit;
Do not manually substitute local full-suite reruns for this exact-head PR authority.
If CI finds a defect, deliver-ticket treats the repair as a new candidate:
repair
→ focused evidence
→ accept-ticket
→ commit exact accepted tree
→ push
→ new exact-head PR CI
Shaper handoff
After current-head PR CI is green and the committed tree is still the accepted tree:
Owner:shape-ticket
Shape performs decision-fidelity review of:
changeset semantics;
4.1 release framing;
adopter-upgrade assessment;
semver/version result;
no unapproved scope expansion.
Only after Shaper reports APPROVED may the version PR be merged.
GitHub cannot record a formal APPROVE when the repository owner reviews their own PR; in that case a PR review comment carrying the explicit Shaper APPROVED verdict is the durable review.
Stage 2 — Merge the version PR and establish the exact 4.1.0 main candidate
Owner:deliver-ticket for the merge/handoff only when the owner explicitly authorizes that merge. Otherwise the owner merges.
The merge commit on main becomes the only candidate eligible to start release convergence.
GitHub Actions automatically triggered by the main push
A. CI
Trigger:
push → main
Workflow:
.github/workflows/ci.yml
On a main push, CI runs the deterministic gates:
preflight;
Ubuntu;
Windows;
Node 18;
ESLint 10;
operational-contract proof;
documentation proof;
deterministic topology replay.
Mutation jobs are PR-only and therefore do not run on the main push.
If and only if those deterministic main gates succeed, the Pack exact main candidate job runs and creates:
That CI-produced candidate is the only package artifact allowed for final field convergence.
B. Docs
Trigger:
push → main
Workflow:
.github/workflows/docs.yml
It builds TypeDoc + VitePress, runs docs checks, and deploys GitHub Pages.
This is expected after the version merge. It is not the release gate and does not replace field convergence.
C. Evidence feed
Workflow:
.github/workflows/evidence-feed.yml
It triggers on a main push only whenworkers/evidence-feed/** or the workflow itself changed.
A normal version-only release PR should not trigger a production Worker deploy. Do not modify evidence-feed files merely to make a release action run.
D. Terrain
Workflow:
.github/workflows/terrain.yml
Terrain is weekly or workflow_dispatch only. It is explicitly an upstream-template drift detector and not part of the PR or release gate.
Do not manually run Terrain as a substitute for the 4.1 field matrix. Run it manually only when separately investigating upstream template drift.
Gate to leave Stage 2
Do not begin authoritative field convergence until:
the exact 4.1.0 main CI run is successful;
the blueprint-candidate-<SHA> artifact exists;
candidate.json identifies that same full main SHA and version 4.1.0.
If product/source or package inputs change after this point, stop. That creates a new product candidate and the older candidate remains historical evidence only. A later release-tooling-only commit does not become the product candidate and does not inherit field authority; after an older candidate has completed full convergence, such a tooling commit may publish that exact older candidate only through the Stage 5 recovery path.
Stage 3 — Select and run the full live release matrix
Scope owner:field-validation
Invoke field-validation after the exact successful 4.1.0 main candidate exists.
This skill owns only:
full versus affected judgment;
exact target roles;
preservation of this ticket’s required scenario set;
blast-radius reasoning after a repair.
For the initial/final 4.1 convergence, the answer is full convergence and the required set is the 16 scenarios authorized below.
field-validation does not stage candidates, invoke Agent CLIs, run Doctor/Inspect, write statuses, or publish.
Execution owner: repository field tooling + available live Agent runtime
Use the repository-owned candidate and field tooling to execute the selected scenarios.
For repository-owned greenfield controls, scripts/field-run.mjs already owns the starter fixture and supports:
For #521 release authority, Agent-vendor diversity is not a hard gate. The authority is the scenario contract, exact candidate identity, independent fresh execution, visible postconditions, and reviewed evidence. A/B repeats may use the same available Agent runtime as long as they use independent disposable target copies and do not reuse mutated state or hidden prior answers.
For the pinned real-world adoption, sky transformation, and 3.2 lifecycle roles, use the repository field harness where it fits or the ticket-authorized explicit/manual matrix when the harness does not encode that role. In either case:
every run uses the exact CI candidate;
A/B repeats use independent disposable target copies;
the report names the actual Agent/runtime used and does not relabel one runtime as another;
no registry package may replace the candidate;
post-Agent Doctor/Inspect stay visible;
native project gates and required positive/negative controls are recorded;
evidence must be durable, not left only in a temporary working directory.
2026-09-22 owner decision for 4.1: the earlier Codex+Claude pairing in this ticket was a diversity/stress-testing strategy, not a product compatibility guarantee. Requiring a paid external Agent vendor as a publication dependency makes release authority depend on account availability rather than Blueprint correctness. For this 4.1 release, two independent functional repeats per role are sufficient. This is a #521 release-contract clarification only; it does not change product source or the exact candidate bytes.
Because candidate 90d2a27c913ca95a29b498e94b90831534a06c92 already completed the 16 functional roles as independent A/B fresh runs, changing this ticket's authorization does not itself require another field execution. The existing 90d2a27 evidence may be recorded if each executed run maps one-to-one to the revised identifiers below and the reviewed report remains truthful about the single Agent runtime used.
This stage is not a GitHub Action. It is live Agent validation against the already-produced CI artifact.
Finding / repair loop
When a field finding appears:
classify it under the field-triage standard;
only a real release-blocking Blueprint defect enters repair;
use deliver-ticket for the repair PR;
repair PR follows the normal: accept-ticket → commit → PR CI → shape-ticket chain;
after merge, a new main SHA receives a new CI candidate;
invoke field-validation again to decide affected replay scope.
A successful affected replay records only repair evidence. It can never finish #521 and can never set final release authority.
After every blocker is repaired, run the complete 16-scenario full matrix again on one exact final candidate.
Stage 4 — Record field convergence on the exact 4.1.0 SHA
Owner: repository convergence recorder, after human review of the evidence.
Prepare the reviewed evidence JSON authorized by this ticket and run:
npm run field:converge -- record \
--candidate <downloaded-candidate>/candidate.json \
--evidence <round-evidence.json> \
--issue 521
This is not a GitHub Action. The recorder itself:
independently resolves/downloads the exact CI candidate;
verifies candidate identity;
verifies exact set equality for requiredScenarios and scenarios;
derives release-blocker count from the reviewed findings;
scope = full
result = success
matrixComplete = true
releaseBlockers = 0
candidateSha = exact 4.1.0 main SHA
An affected record can produce only pending or failure.
Gate to leave Stage 4
Before tagging, independently check that the exact target SHA has blueprint/field-convergence = success and that its linked #521 evidence comment names the same full matrix and zero blockers.
Stage 5 — Publish the exact converged candidate
Owner: publication remains an explicit owner-authorized action. deliver-ticket may create/push a tag or invoke a publishing recovery run only when the owner explicitly authorizes publication.
The invariant is:
the bytes published to npm
=
the exact CI candidate that already has
blueprint/field-convergence = success
A newer release-tooling commit is not the product candidate and does not inherit the candidate's field status.
Path A — Normal tag-push publication
Use this when the converged candidate already contains the correct release workflow/gates.
Create:
v4.1.0
on the exact SHA that already has successful full field convergence and push the tag.
The tag-triggered .github/workflows/release.yml path:
creates GitHub Release notes from that candidate's CHANGELOG.md § 4.1.0.
Do not move the tag to a later tooling SHA merely to obtain newer release scripts. A later SHA has no field authority unless it independently completes convergence.
Path B — Recovery publication with newer release tooling
Use this only when the already converged candidate is valid but its embedded release workflow/gate is obsolete, so a normal tag-triggered run cannot publish it correctly.
The recovery entry is the workflow_dispatch path of the same .github/workflows/release.yml, executed from current main. It must keep these identities separate:
candidate SHA = product/release bytes with field authority
tooling SHA = newer main commit that performs recovery publication
Recovery requirements:
the candidate is an ancestor of the tooling SHA;
the candidate comes from a successful main CI run;
its unique exact-SHA CI artifact is still available and unexpired;
the artifact manifest, package identity, CI run, and tarball digest are independently reverified;
the newer Changesets and field gates are run against a clean detached checkout of the original candidate;
the exact candidate must still own the full successful blueprint/field-convergence status;
an existing stable tag must resolve to the candidate; if missing, it may be created only after verification;
publication uses the original downloaded CI tarball with no rebuild or repack;
provenance must distinguish the original candidate/run/artifact from the newer recovery tooling workflow/run;
the artifact, tag, and field authority are reverified immediately before npm publication;
any mismatch or unverifiable provenance stops publication;
GitHub Release notes come from the candidate's changelog;
the tooling SHA never receives a copied field-convergence status.
The recovery flow is two-step:
workflow_dispatch from main
candidate_sha=<validated candidate>
candidate_run_id=<candidate CI run>
tag=v4.1.0
publish=false
→ review verification result
then explicit owner authorization:
same inputs
publish=true
→ reverify
→ create/verify tag at candidate
→ publish original tgz with provenance
→ create GitHub Release
A successful publish=false run is verification evidence only. It does not authorize an automatic second run.
4.1.0 recovery authorization
For the current 4.1.0 release, #521 explicitly authorizes recovery publication of:
because that exact candidate already owns successful full field convergence and the old embedded Changesets gate incorrectly rejects post-version field repairs.
Required sequence for this release:
merge reviewed recovery tooling
→ run recovery with publish=false against 90d2a27c...
→ review that verification run
→ owner explicitly authorizes publication
→ rerun with publish=true using the exact same candidate/run/tag inputs
→ verify public npm + GitHub Release
No new field run is required solely because the recovery tooling lives on a newer SHA. The product candidate remains 90d2a27c...; the tooling commit is only the publisher.
If recovery itself requires changing the candidate bytes, package version, or field evidence, stop. That creates a new product candidate and returns to Stage 2/3/4.
Stage 6 — Public publication verification and issue closure
Owner: release delivery / owner verification.
After the successful publication workflow is green, whether normal tag-push publication or the authorized recovery path, verify externally:
npm public metadata resolves @kekkai/blueprint@4.1.0;
provenance is present as produced by the release workflow;
GitHub Release v4.1.0 exists;
its release notes correspond to CHANGELOG.md § 4.1.0;
tag v4.1.0 still resolves to the converged SHA.
Only then is #521 complete and may be closed as completed.
Action summary
Moment
Skill / owner
GitHub Action
Shape release contract
shape-ticket
none
Edit changesets + run changeset version
deliver-ticket
none yet
Review staged version tree
accept-ticket
none
Push version PR
deliver-ticket
CI via pull_request; includes mutation
Review green version PR
shape-ticket
no new Action
Merge version PR to main
explicit owner merge / authorized Delivery
CI via push main; deterministic gates + candidate pack. Docs via push main. Evidence-feed only if its paths changed
Select final live matrix
field-validation
none
Run full A/B live Agent matrix
repository field tooling + available Agent runtime(s)
none
Record convergence
field:converge recorder
writes commit status, not an Action
Repair a field blocker
deliver-ticket → accept-ticket → PR CI → shape-ticket
CI on repair PR, then CI/Docs again after merge
Publish converged candidate normally
explicit publication authority
Release (tag) via tag push
Verify obsolete-tooling recovery
explicit publication authority
Release (tag) via workflow_dispatch, publish=false
Publish through recovery after owner approval
explicit publication authority
same workflow, same candidate inputs, publish=true
1. Freeze and edit the release inputs before versioning
Treat the Changesets version commit as the release-version preparation point, not the product freeze point. The product freeze point is the final exact candidate that passes complete field convergence.
Before running npx changeset version:
re-read every pending changeset against current main;
remove stale implementation claims and duplicate narrative;
correct the source-preservation wording described above;
keep semver intent at minor → 4.1.0;
ensure the upgrade/remove entry reflects the final The upgrade → remove lifecycle dead-ends on a real 3.2 adoption #517 semantics: Doctor proves Blueprint/Vitest alias forms, source-preserving migration, deletion precedence, platform-neutral path identity, and comment-only references are not live wiring;
keep docs-only evidence-feed work out of package release claims unless it genuinely belongs in the package changelog;
add or identify one concise 4.1 release-framing passage that can be hoisted above Changesets’ generated Major/Minor/Patch headings in CHANGELOG.md.
Then run npx changeset version, review the generated package/version/lock/changelog diff, hoist the release framing, and make that assembled release candidate pass independent Acceptance before committing it under the repository’s current candidate lifecycle.
Do not tag a feature commit that still says 4.0.0.
2. Merge the 4.1.0 version candidate and bind release evidence to main CI
After the accepted version PR passes exact-head CI and Shaper review, merge it to main.
The successful main workflow for that exact SHA must produce the authoritative blueprint-candidate-<SHA> artifact and candidate.json.
Release field validation must consume that CI artifact. A locally rebuilt tarball or the #517 replay tarball is diagnostic evidence only.
Any later product/source commit creates a new candidate and does not inherit convergence authority. A later release-tooling-only commit may publish an older already-converged candidate only through the Stage 5 recovery path, and must publish that candidate's original verified CI artifact rather than treating the tooling SHA as a new product candidate.
3. Full 4.1 field matrix
4.1 changes both established adoption behavior and two new release-headline surfaces. The final matrix keeps the same 16 functional roles previously authorized, but release authority is now expressed as independent A/B execution rather than a Codex-vs-Claude vendor pairing.
The exact requiredScenarios for this release are:
Established real-world adoption controls
repeat-a/vue-pure-admin
repeat-b/vue-pure-admin
repeat-a/react-ddd-feature-folder
repeat-b/react-ddd-feature-folder
repeat-a/realworld-react-fsd
repeat-b/realworld-react-fsd
repeat-a/vue-vben-admin-web-antd
repeat-b/vue-vben-admin-web-antd
Pinned targets remain:
Vue Pure Admin — pure-admin/vue-pure-admin@8affa5e5db1e05532d8833359c5153545055fc9c
Each A/B pair must start from independent fresh disposable copies. These remain adoption controls, not topology-conversion requirements. Adopter debt, supported model boundaries, and environment limits are not Blueprint defects by themselves.
Bidirectional topology controls
repeat-a/sky-1945-lf-mf-lf
repeat-b/sky-1945-lf-mf-lf
Pin: taco3064/sky-1945@3a3c50a478338bc392bcaeaf4a13b7009a610998, prepared with the same valid LF authority used by the established transformation control.
Both repeats must independently execute Blueprint-generated LF → MF → LF guidance and verify the intermediate and restored states. Do not substitute a hand-authored final config.
4.1 greenfield runway controls
repeat-a/new-layer-first
repeat-b/new-layer-first
repeat-a/new-module-first
repeat-b/new-module-first
Use the repository-owned field starter so the exact candidate and live-Agent harness remain the authority.
These controls specifically prove #500’s changed posture:
the proven-empty starter takes the direct scaffold path rather than brownfield authoring;
LF starts from complete canonical preset governance;
MF starts from the same governance with modules: [], without inventing a domain module;
Doctor/Inspect and emitted enforcement agree with the generated config;
the executing Agent does not reinterpret the empty project into an unsupported architecture.
Framework-specific deterministic React/Vue coverage remains CI’s job; these live controls own the Agent-facing greenfield decision boundary rather than duplicating every fixture × runtime combination.
4.1 lifecycle controls
repeat-a/sky-1945-3.2-upgrade-remove
repeat-b/sky-1945-3.2-upgrade-remove
Start independently from sky-1945@3a3c50a478338bc392bcaeaf4a13b7009a610998, follow Blueprint’s own refusal to establish the supported 3.2 source, and use the exact 4.1.0 candidate throughout.
Each repeat must independently prove:
3.1 refusal changes nothing
→ establish 3.2 adoption
→ upgrade --dry-run changes nothing
→ upgrade performs deterministic migration and stops only for measured semantic work
→ Agent completes review-retired-module-private from the actual declaration site
→ upgrade completes only with inspect/doctor complete
→ migrated config retains defineBlueprint/preset/comments and remains semantically equivalent
→ native lint/test/build pass
→ unwire real Blueprint references
→ remove --dry-run reports no false self/comment conflict
→ remove deletes the Blueprint config and completes
→ native lint/test/build pass
None of #517’s original three workarounds may be used.
A successful pre-version #517 replay is a negative/positive oracle for this scenario, not release authority for the new version SHA.
4. Classify findings instead of flattening them
For every live scenario record:
candidate SHA/version/tarball digest/workflow;
exact target, repeat id, and actual Agent/runtime used;
material diff and architecture decision;
Doctor/Inspect/deps and emitted ESLint evidence as applicable;
native project gates;
Agent feedback;
every finding’s classification and releaseBlocking disposition.
A mechanical failure, false green, unsafe mutation, contradictory guidance, or Blueprint defect that prevents completion is release-blocking.
Adopter debt, an explicitly supported model boundary, an environment limit, or a known unverified alias form outside #517’s scope is not automatically release-blocking. It still must be visible in the report.
If a release-blocking defect is repaired, an affected replay may prove the repair but writes only pending/failure. The final authority still requires the complete 16-scenario matrix on one exact candidate.
For candidate 90d2a27c913ca95a29b498e94b90831534a06c92, the reviewed R5/final report's A/B runs may be mapped directly to these repeat-a/* and repeat-b/* identifiers. This ticket edit does not mutate the candidate and does not invalidate those executions.
5. Record convergence on this issue
The final reviewed evidence JSON must use:
scope: "full";
result: "success";
requiredScenarios equal to the exact 16 identifiers above;
scenarios equal to that same non-duplicated set;
zero findings with releaseBlocking: true;
a durable HTTPS report URL.
Record it with the repository-owned convergence recorder against this issue.
The resulting blueprint/field-convergence = success status must be on the exact 4.1.0 main SHA that will be tagged.
6. Prove publication
Only after exact-SHA convergence success, use one of the Stage 5 publication paths.
For normal publication, tag the exact converged SHA and let the tag-push job publish.
For the current 4.1 recovery case, use the owner-authorized workflow_dispatch path from newer main tooling while keeping the product candidate fixed at 90d2a27c913ca95a29b498e94b90831534a06c92. The recovery path must first pass with publish=false; only a separately authorized publish=true run may create/verify v4.1.0, publish the original CI tarball, and create the GitHub Release.
Both paths must preserve the same final invariants:
v4.1.0 resolves to the exact converged candidate SHA;
the Changesets/version-origin gate and exact-candidate field gate both pass;
npm publishes @kekkai/blueprint@4.1.0 with provenance;
GitHub Release v4.1.0 exists and uses CHANGELOG.md § 4.1.0 from the candidate;
public npm metadata resolves version 4.1.0.
Close this issue only after publication is observable. A green field matrix or verification-only recovery run without a successful publish is not completion.
Acceptance Criteria
Release inputs and versioning
All pending 4.1 package changesets are reviewed against current main and contain no stale or overstated claim.
The migrated-config changeset says comments are preserved without falsely claiming every comment remains at the same byte position.
The release changelog opens with a concise 4.1 product framing before generated change headings.
The adopter upgrade assessment is recorded: every provable migration stays deterministic, and any remaining semantic work is represented by the existing structured lifecycle catalog or a justified new operation.
npx changeset version produces @kekkai/blueprint@4.1.0, updates the lockfile and CHANGELOG.md, and consumes every pending package changeset.
The assembled version candidate receives independent Acceptance before its commit and passes exact-head CI / Shaper review before merge.
The accepted version change is merged to main and the exact successful main workflow produces a verified 4.1.0 candidate artifact.
Full release convergence
All 16 ticket-authorized required scenarios execute against the same exact 4.1.0 candidate.
Each of the four pinned real-world adopter controls completes twice as independent A/B runs from fresh disposable target copies.
The sky-1945 LF → MF → LF transformation control completes twice independently through Blueprint-generated guidance.
The repository-owned greenfield starter completes twice independently under layer-first and twice independently under module-first.
The evidence truthfully records the actual Agent/runtime used for every repeat; vendor/model diversity is useful supplementary evidence but is not a 4.1 publication gate.
Required Doctor/Inspect/deps, emitted ESLint controls, native gates, material diffs, Agent feedback, and evidence limitations are recorded for each applicable scenario.
Every observation has a reviewed classification and release-blocking disposition.
The final evidence is scope: full, result: success, matrix-complete, and has zero release blockers.
npm run field:converge -- record records the evidence on this issue and creates blueprint/field-convergence = success on the exact candidate SHA.
Publication
The publication path preserves the exact converged candidate; a newer tooling SHA does not inherit its field status.
For this 4.1 recovery, a publish=false workflow_dispatch run verifies candidate 90d2a27c913ca95a29b498e94b90831534a06c92, CI run 35738770473, tag v4.1.0, the original artifact digest, Changesets origin, and exact-SHA field authority.
The owner explicitly authorizes the subsequent publish=true run after reviewing the verification-only result.
The publishing run re-verifies the same candidate/run/tag inputs immediately before publication and publishes the original CI tarball without rebuild/repack.
v4.1.0 points to the exact converged candidate SHA.
npm publishes @kekkai/blueprint@4.1.0 with provenance that truthfully identifies both the original candidate artifact/run and the recovery publisher workflow/tooling SHA.
GitHub Release v4.1.0 exists and its notes come from the candidate's CHANGELOG.md § 4.1.0.
Public npm metadata resolves @kekkai/blueprint version 4.1.0.
This issue is closed only after those publication checks are true.
Out of Scope
New 4.1 product features after this release ticket begins. A newly discovered release-blocking correctness defect is repaired because it blocks this outcome; unrelated enhancement work waits for a later release.
Expanding the supported upgrade window below 3.2.0.
Making Doctor execute adopter Vite/Vitest configs or proving helper/wrapper-built aliases that the static model intentionally leaves unverified.
Treating adopter architecture debt or a documented model boundary as a release defect by itself.
Replacing the exact-main CI candidate with a local rebuild for convergence.
Treating an affected replay as final release authority.
Publishing an alpha/RC instead of the requested stable 4.1.0.
Introducing versioned documentation archives, a docs version picker, monorepo/Turbo migration, or other repository-organization work unrelated to cutting this release.
Goal
Cut and publish
@kekkai/blueprint@4.1.0from one exact, release-converged main candidate.This is the single release-convergence ledger for 4.1.0. Completing this issue means all of the following are true:
4.1.0version commit onmain;4.1.0main SHA has a verified CI-produced packed candidate;blueprint/field-convergence = success;v4.1.0points at that same converged SHA;Do not split changeset cleanup, versioning, convergence, tag creation, or publication into separate release tickets. They are one outcome: 4.1.0 exists publicly only after one exact candidate has passed the complete release authority chain.
Current release-preparation baseline:
main@26e04a40939f200a4e90288c4e92e281e960b4a0, package version4.0.0.Evidence
4.1 product scope is already implemented on main
The work intended for this minor release is complete:
modules: []runway;upgrade/ provenance-awareremovelifecycle;#517 is the strongest lifecycle oracle before versioning. Its final replay used the accepted tree that later landed on main and proved, on a disposable
sky-1945@3a3c50aadoption:without the three original workarounds: no literal-alias rewrite, no added
vitest.config.*, and no manual config deletion.That replay is a pre-release product oracle. It does not replace the final field convergence required on the Changesets-generated
4.1.0main SHA.Pending release inputs
mainstill reports package version4.0.0. The pending package changesets are:.changeset/greenfield-module-first-runway.md— minor.changeset/upgrade-remove-lifecycle.md— minor.changeset/enforce-documented-config-contract.md— patch.changeset/doctor-proves-written-alias.md— patch.changeset/preserve-migrated-config-source.md— patchThe two minor entries make the intended next version
4.1.0.One known editorial correction is required before versioning:
preserve-migrated-config-source.mdcurrently says comments “stay as written”. #517 established the stricter truth: every comment is preserved, but a comment nested inside a retiredmodulevalue may be re-emitted where that retired property stood. Release notes must not claim byte-position preservation that the product does not provide.The final 4.1 framing should describe the release at product level before the generated change headings. The release story is:
upgradeandremoveare first-class lifecycle operations with provenance and fail-closed completion.Release authority already exists in the repository
.agents/docs/field-triage.mddefines the release sequence:Release publication requires:
package.json.version;.changeset/*.mdconsumed;CHANGELOG.mdsection.The Changesets version commit is the release-version origin, not the product freeze point. Field findings may be repaired afterwards within the same unpublished version. The final candidate that passes full field convergence is the product freeze point.
The release-convergence ticket is allowed to be the human-readable ledger. The exact commit status remains the machine authority.
Adopter upgrade assessment for 4.1
4.1 still requires adopter-side semantic work for a supported historical case after deterministic code has done everything it can prove.
The existing lifecycle catalog intentionally carries:
supportedFrom: 3.2.0;legacy-unit-shapemigration introduced in 4.0;review-retired-module-privatefor configurations whose 3.2 source declared retiredmodule.private;LIFECYCLE_SINCE = 4.1.0.Do not rewrite
introducedInto 4.1 merely because the lifecycle command ships in 4.1. The operation describes the historical semantic change it repairs. #517 proved that the 4.1 lifecycle can execute that historical responsibility correctly.Before versioning, re-run the catalog/release assessment against the final main source. If no new semantic requirement exists beyond the current catalog, record that conclusion in this ticket instead of inventing an empty 4.1 operation.
Execution Protocol — Skills and GitHub Actions
This ticket deliberately spans preparation, versioning, live convergence, and publication, but one skill does not own the whole release. Handoffs are explicit.
Stage 0 — Shape is complete
Owner:
shape-ticketThis issue is the shaped release contract. Shape does not edit release files, run field agents, create the version commit, tag, or publish.
Re-enter
shape-ticketonly for:Do not use Shape as the runner for routine release steps.
Stage 1 — Prepare Changesets and assemble the 4.1.0 version candidate
Owner:
deliver-ticketTrigger
deliver-ticketwhen the owner asks to start/continue #521 release preparation.Delivery must:
origin/main;npx changeset version;package.json,package-lock.json, consumed changesets, and generatedCHANGELOG.md;git write-tree.At this point do not commit yet.
Acceptance handoff
Owner:
accept-ticketA fresh reviewer receives:
It must return
ACCEPTEDbefore the version candidate is committed.If it returns
CHANGES_REQUIRED, Delivery repairs the uncommitted candidate and requests Acceptance again under the normal two-round rule. A repaired candidate receives a new tree identity.Commit and PR
After
ACCEPTED,deliver-ticketmust:git write-treestill equals the accepted tree immediately before commit;HEAD^{tree}equals the accepted tree;GitHub Action automatically triggered here: CI
Trigger:
Workflow:
The PR CI owns:
PR verification.Do not manually substitute local full-suite reruns for this exact-head PR authority.
If CI finds a defect,
deliver-tickettreats the repair as a new candidate:Shaper handoff
After current-head PR CI is green and the committed tree is still the accepted tree:
Owner:
shape-ticketShape performs decision-fidelity review of:
Only after Shaper reports
APPROVEDmay the version PR be merged.Stage 2 — Merge the version PR and establish the exact 4.1.0 main candidate
Owner:
deliver-ticketfor the merge/handoff only when the owner explicitly authorizes that merge. Otherwise the owner merges.The merge commit on
mainbecomes the only candidate eligible to start release convergence.GitHub Actions automatically triggered by the main push
A. CI
Trigger:
Workflow:
On a main push, CI runs the deterministic gates:
Mutation jobs are PR-only and therefore do not run on the main push.
If and only if those deterministic main gates succeed, the
Pack exact main candidatejob runs and creates:with 30-day artifact retention.
That CI-produced candidate is the only package artifact allowed for final field convergence.
B. Docs
Trigger:
Workflow:
It builds TypeDoc + VitePress, runs docs checks, and deploys GitHub Pages.
This is expected after the version merge. It is not the release gate and does not replace field convergence.
C. Evidence feed
Workflow:
It triggers on a main push only when
workers/evidence-feed/**or the workflow itself changed.A normal version-only release PR should not trigger a production Worker deploy. Do not modify evidence-feed files merely to make a release action run.
D. Terrain
Workflow:
Terrain is weekly or
workflow_dispatchonly. It is explicitly an upstream-template drift detector and not part of the PR or release gate.Do not manually run Terrain as a substitute for the 4.1 field matrix. Run it manually only when separately investigating upstream template drift.
Gate to leave Stage 2
Do not begin authoritative field convergence until:
blueprint-candidate-<SHA>artifact exists;candidate.jsonidentifies that same full main SHA and version4.1.0.If product/source or package inputs change after this point, stop. That creates a new product candidate and the older candidate remains historical evidence only. A later release-tooling-only commit does not become the product candidate and does not inherit field authority; after an older candidate has completed full convergence, such a tooling commit may publish that exact older candidate only through the Stage 5 recovery path.
Stage 3 — Select and run the full live release matrix
Scope owner:
field-validationInvoke
field-validationafter the exact successful 4.1.0 main candidate exists.This skill owns only:
fullversusaffectedjudgment;For the initial/final 4.1 convergence, the answer is full convergence and the required set is the 16 scenarios authorized below.
field-validationdoes not stage candidates, invoke Agent CLIs, run Doctor/Inspect, write statuses, or publish.Execution owner: repository field tooling + available live Agent runtime
Use the repository-owned candidate and field tooling to execute the selected scenarios.
For repository-owned greenfield controls,
scripts/field-run.mjsalready owns the starter fixture and supports:For #521 release authority, Agent-vendor diversity is not a hard gate. The authority is the scenario contract, exact candidate identity, independent fresh execution, visible postconditions, and reviewed evidence. A/B repeats may use the same available Agent runtime as long as they use independent disposable target copies and do not reuse mutated state or hidden prior answers.
For the pinned real-world adoption, sky transformation, and 3.2 lifecycle roles, use the repository field harness where it fits or the ticket-authorized explicit/manual matrix when the harness does not encode that role. In either case:
2026-09-22 owner decision for 4.1: the earlier Codex+Claude pairing in this ticket was a diversity/stress-testing strategy, not a product compatibility guarantee. Requiring a paid external Agent vendor as a publication dependency makes release authority depend on account availability rather than Blueprint correctness. For this 4.1 release, two independent functional repeats per role are sufficient. This is a #521 release-contract clarification only; it does not change product source or the exact candidate bytes.
Because candidate
90d2a27c913ca95a29b498e94b90831534a06c92already completed the 16 functional roles as independent A/B fresh runs, changing this ticket's authorization does not itself require another field execution. The existing 90d2a27 evidence may be recorded if each executed run maps one-to-one to the revised identifiers below and the reviewed report remains truthful about the single Agent runtime used.This stage is not a GitHub Action. It is live Agent validation against the already-produced CI artifact.
Finding / repair loop
When a field finding appears:
deliver-ticketfor the repair PR;accept-ticket → commit → PR CI → shape-ticketchain;field-validationagain to decide affected replay scope.A successful affected replay records only repair evidence. It can never finish #521 and can never set final release authority.
After every blocker is repaired, run the complete 16-scenario full matrix again on one exact final candidate.
Stage 4 — Record field convergence on the exact 4.1.0 SHA
Owner: repository convergence recorder, after human review of the evidence.
Prepare the reviewed evidence JSON authorized by this ticket and run:
This is not a GitHub Action. The recorder itself:
requiredScenariosandscenarios;on the exact candidate SHA.
For final authority it must prove:
An
affectedrecord can produce onlypendingorfailure.Gate to leave Stage 4
Before tagging, independently check that the exact target SHA has
blueprint/field-convergence = successand that its linked #521 evidence comment names the same full matrix and zero blockers.Stage 5 — Publish the exact converged candidate
Owner: publication remains an explicit owner-authorized action.
deliver-ticketmay create/push a tag or invoke a publishing recovery run only when the owner explicitly authorizes publication.The invariant is:
A newer release-tooling commit is not the product candidate and does not inherit the candidate's field status.
Path A — Normal tag-push publication
Use this when the converged candidate already contains the correct release workflow/gates.
Create:
on the exact SHA that already has successful full field convergence and push the tag.
The tag-triggered
.github/workflows/release.ymlpath:dist:verify;package.json.version;blueprint/field-convergence = success;CHANGELOG.md § 4.1.0.Do not move the tag to a later tooling SHA merely to obtain newer release scripts. A later SHA has no field authority unless it independently completes convergence.
Path B — Recovery publication with newer release tooling
Use this only when the already converged candidate is valid but its embedded release workflow/gate is obsolete, so a normal tag-triggered run cannot publish it correctly.
The recovery entry is the
workflow_dispatchpath of the same.github/workflows/release.yml, executed from currentmain. It must keep these identities separate:Recovery requirements:
blueprint/field-convergencestatus;The recovery flow is two-step:
A successful
publish=falserun is verification evidence only. It does not authorize an automatic second run.4.1.0 recovery authorization
For the current 4.1.0 release, #521 explicitly authorizes recovery publication of:
because that exact candidate already owns successful full field convergence and the old embedded Changesets gate incorrectly rejects post-version field repairs.
Required sequence for this release:
No new field run is required solely because the recovery tooling lives on a newer SHA. The product candidate remains
90d2a27c...; the tooling commit is only the publisher.If recovery itself requires changing the candidate bytes, package version, or field evidence, stop. That creates a new product candidate and returns to Stage 2/3/4.
Stage 6 — Public publication verification and issue closure
Owner: release delivery / owner verification.
After the successful publication workflow is green, whether normal tag-push publication or the authorized recovery path, verify externally:
@kekkai/blueprint@4.1.0;v4.1.0exists;CHANGELOG.md § 4.1.0;v4.1.0still resolves to the converged SHA.Only then is #521 complete and may be closed as
completed.Action summary
shape-ticketchangeset versiondeliver-ticketaccept-ticketdeliver-ticketpull_request; includes mutationshape-ticketpush main; deterministic gates + candidate pack. Docs viapush main. Evidence-feed only if its paths changedfield-validationfield:convergerecorderdeliver-ticket → accept-ticket → PR CI → shape-ticketworkflow_dispatch,publish=falsepublish=trueImplementation Notes
1. Freeze and edit the release inputs before versioning
Treat the Changesets version commit as the release-version preparation point, not the product freeze point. The product freeze point is the final exact candidate that passes complete field convergence.
Before running
npx changeset version:4.1.0;CHANGELOG.md.Then run
npx changeset version, review the generated package/version/lock/changelog diff, hoist the release framing, and make that assembled release candidate pass independent Acceptance before committing it under the repository’s current candidate lifecycle.Do not tag a feature commit that still says
4.0.0.2. Merge the 4.1.0 version candidate and bind release evidence to main CI
After the accepted version PR passes exact-head CI and Shaper review, merge it to
main.The successful main workflow for that exact SHA must produce the authoritative
blueprint-candidate-<SHA>artifact andcandidate.json.Release field validation must consume that CI artifact. A locally rebuilt tarball or the #517 replay tarball is diagnostic evidence only.
Any later product/source commit creates a new candidate and does not inherit convergence authority. A later release-tooling-only commit may publish an older already-converged candidate only through the Stage 5 recovery path, and must publish that candidate's original verified CI artifact rather than treating the tooling SHA as a new product candidate.
3. Full 4.1 field matrix
4.1 changes both established adoption behavior and two new release-headline surfaces. The final matrix keeps the same 16 functional roles previously authorized, but release authority is now expressed as independent A/B execution rather than a Codex-vs-Claude vendor pairing.
The exact
requiredScenariosfor this release are:Established real-world adoption controls
repeat-a/vue-pure-adminrepeat-b/vue-pure-adminrepeat-a/react-ddd-feature-folderrepeat-b/react-ddd-feature-folderrepeat-a/realworld-react-fsdrepeat-b/realworld-react-fsdrepeat-a/vue-vben-admin-web-antdrepeat-b/vue-vben-admin-web-antdPinned targets remain:
pure-admin/vue-pure-admin@8affa5e5db1e05532d8833359c5153545055fc9cemunhoz/react-ddd-feature-folder-architecture@f8dd1f53819b23e6993dd0297ecba0eb654a4d72yurisldk/realworld-react-fsd@969709a379b13935b4e1caae0ad8cad548e5879avbenjs/vue-vben-admin@3f2d8bc1f2586a79f83d7b79c79ba818f800846a, applicationapps/web-antdEach A/B pair must start from independent fresh disposable copies. These remain adoption controls, not topology-conversion requirements. Adopter debt, supported model boundaries, and environment limits are not Blueprint defects by themselves.
Bidirectional topology controls
repeat-a/sky-1945-lf-mf-lfrepeat-b/sky-1945-lf-mf-lfPin:
taco3064/sky-1945@3a3c50a478338bc392bcaeaf4a13b7009a610998, prepared with the same valid LF authority used by the established transformation control.Both repeats must independently execute Blueprint-generated LF → MF → LF guidance and verify the intermediate and restored states. Do not substitute a hand-authored final config.
4.1 greenfield runway controls
repeat-a/new-layer-firstrepeat-b/new-layer-firstrepeat-a/new-module-firstrepeat-b/new-module-firstUse the repository-owned field starter so the exact candidate and live-Agent harness remain the authority.
These controls specifically prove #500’s changed posture:
modules: [], without inventing a domain module;Framework-specific deterministic React/Vue coverage remains CI’s job; these live controls own the Agent-facing greenfield decision boundary rather than duplicating every fixture × runtime combination.
4.1 lifecycle controls
repeat-a/sky-1945-3.2-upgrade-removerepeat-b/sky-1945-3.2-upgrade-removeStart independently from
sky-1945@3a3c50a478338bc392bcaeaf4a13b7009a610998, follow Blueprint’s own refusal to establish the supported 3.2 source, and use the exact4.1.0candidate throughout.Each repeat must independently prove:
None of #517’s original three workarounds may be used.
A successful pre-version #517 replay is a negative/positive oracle for this scenario, not release authority for the new version SHA.
4. Classify findings instead of flattening them
For every live scenario record:
releaseBlockingdisposition.A mechanical failure, false green, unsafe mutation, contradictory guidance, or Blueprint defect that prevents completion is release-blocking.
Adopter debt, an explicitly supported model boundary, an environment limit, or a known
unverifiedalias form outside #517’s scope is not automatically release-blocking. It still must be visible in the report.If a release-blocking defect is repaired, an affected replay may prove the repair but writes only pending/failure. The final authority still requires the complete 16-scenario matrix on one exact candidate.
For candidate
90d2a27c913ca95a29b498e94b90831534a06c92, the reviewed R5/final report's A/B runs may be mapped directly to theserepeat-a/*andrepeat-b/*identifiers. This ticket edit does not mutate the candidate and does not invalidate those executions.5. Record convergence on this issue
The final reviewed evidence JSON must use:
scope: "full";result: "success";requiredScenariosequal to the exact 16 identifiers above;scenariosequal to that same non-duplicated set;releaseBlocking: true;Record it with the repository-owned convergence recorder against this issue.
The resulting
blueprint/field-convergence = successstatus must be on the exact4.1.0main SHA that will be tagged.6. Prove publication
Only after exact-SHA convergence success, use one of the Stage 5 publication paths.
For normal publication, tag the exact converged SHA and let the tag-push job publish.
For the current 4.1 recovery case, use the owner-authorized
workflow_dispatchpath from newermaintooling while keeping the product candidate fixed at90d2a27c913ca95a29b498e94b90831534a06c92. The recovery path must first pass withpublish=false; only a separately authorizedpublish=truerun may create/verifyv4.1.0, publish the original CI tarball, and create the GitHub Release.Both paths must preserve the same final invariants:
v4.1.0resolves to the exact converged candidate SHA;@kekkai/blueprint@4.1.0with provenance;v4.1.0exists and usesCHANGELOG.md § 4.1.0from the candidate;4.1.0.Close this issue only after publication is observable. A green field matrix or verification-only recovery run without a successful publish is not completion.
Acceptance Criteria
Release inputs and versioning
npx changeset versionproduces@kekkai/blueprint@4.1.0, updates the lockfile andCHANGELOG.md, and consumes every pending package changeset.mainand the exact successful main workflow produces a verified4.1.0candidate artifact.Full release convergence
4.1.0candidate.scope: full,result: success, matrix-complete, and has zero release blockers.npm run field:converge -- recordrecords the evidence on this issue and createsblueprint/field-convergence = successon the exact candidate SHA.Publication
publish=falseworkflow_dispatch run verifies candidate90d2a27c913ca95a29b498e94b90831534a06c92, CI run35738770473, tagv4.1.0, the original artifact digest, Changesets origin, and exact-SHA field authority.publish=truerun after reviewing the verification-only result.v4.1.0points to the exact converged candidate SHA.@kekkai/blueprint@4.1.0with provenance that truthfully identifies both the original candidate artifact/run and the recovery publisher workflow/tooling SHA.v4.1.0exists and its notes come from the candidate'sCHANGELOG.md § 4.1.0.@kekkai/blueprintversion4.1.0.Out of Scope
unverified.4.1.0.