Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/archcontext-organization-runner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ on:
description: ArchContext runtime version expected by this workflow release.
required: false
type: string
default: "0.4.0"
default: "0.4.1"
fail_on:
description: Whether a failing deterministic gate should fail the job.
required: false
Expand Down
2 changes: 1 addition & 1 deletion actions/review-action/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ inputs:
runtime-version:
description: ArchContext runtime version expected by this action release.
required: false
default: "0.4.0"
default: "0.4.1"
runtime-artifact-url:
description: HTTPS URL for the pinned ArchContext runtime artifact.
required: true
Expand Down
12 changes: 12 additions & 0 deletions deploy/release-checklists/archctx-0.4.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# archctx 0.4.1 release checklist

Scope: publish the additive `ProjectionRequestV1.acceptedChange` bridge required by repo-harness architecture refresh handling. This patch does not change the v1 protocol identifiers or the Node engine range.

- [ ] `bun run verify` passes under Node `>=24 <26`.
- [ ] `archctx` and `archctx-contracts` package versions are exactly `0.4.1`.
- [ ] Focused projection contract and CLI tests prove unresolved and accepted major-change paths.
- [ ] Pull request is merged to `main`; Claude review is waived by the user's explicit instruction.
- [ ] Publish `archctx-contracts@0.4.1` and read back version, integrity, and shasum.
- [ ] Publish `archctx@0.4.1` and read back version, integrity, shasum, Node engine, and exact CodeGraph dependency.
- [ ] Clean-room Node 24 smoke returns the `0.4.1` capabilities handshake.
- [ ] Update repo-harness to exact `archctx@0.4.1` and `archctx-contracts@0.4.1`, then prove the accepted refresh signal end to end.
4 changes: 2 additions & 2 deletions docs/examples/github-hosted-runner-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ jobs:
trust-level: organization
fail-on: blocking
fork-pr-mode: unsupported
runtime-version: "0.4.0"
runtime-artifact-url: https://archcontext.repoharness.com/releases/archctx-0.4.0.tgz
runtime-version: "0.4.1"
runtime-artifact-url: https://archcontext.repoharness.com/releases/archctx-0.4.1.tgz
runtime-artifact-digest: sha256:<release-digest>
expected-repository: <owner/name from Challenge>
expected-head-sha: ${{ github.event.pull_request.head.sha }}
Expand Down
4 changes: 2 additions & 2 deletions docs/examples/reusable-organization-runner-caller.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ jobs:
expected_repository: ${{ github.repository }}
expected_head_sha: ${{ github.event.pull_request.head.sha }}
expected_head_tree_oid: <head tree OID from Challenge>
runtime_artifact_url: https://archcontext.repoharness.com/releases/archctx-0.4.0.tgz
runtime_artifact_url: https://archcontext.repoharness.com/releases/archctx-0.4.1.tgz
runtime_artifact_digest: sha256:<release-digest>
runtime_version: "0.4.0"
runtime_version: "0.4.1"
fail_on: blocking
fork_pr_mode: unsupported
6 changes: 3 additions & 3 deletions docs/runbooks/personal-user-install.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Personal User Install

This runbook is the current individual-user install path for `archctx@0.4.0`.
This runbook is the current individual-user install path for `archctx@0.4.1`.
Team collaboration, design-partner rollout, opt-in beta cohorts, and shared organization rollout evidence are deferred.

## Scope

- Target user: one local developer using ArchContext on their own repository.
- Required release artifact: public npm package `archctx@0.4.0` (`latest`).
- Required release artifact: public npm package `archctx@0.4.1` (`latest`).
- Runtime: Node.js 24.x or 25.x, npm, and git must be available on `PATH`.
- Not required for this path: GitHub App installation, ArchContext Cloud token, Cloudflare deploy access, or LLM provider credentials.
- Do not treat this runbook as approved for a published package version until `docs/verification/fg6-release-distribution-readback.json` is verified for that exact version.
Expand All @@ -26,7 +26,7 @@ archctx --help
For pinned reproduction of the current verified release:

```bash
npm install -g archctx@0.4.0
npm install -g archctx@0.4.1
```

The npm package is the generated public `archctx` artifact. The repository root package `archcontext` and workspace packages remain private source manifests for building and verifying that artifact.
Expand Down
4 changes: 2 additions & 2 deletions docs/runbooks/trusted-runner.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ jobs:
trust-level: organization
fail-on: blocking
fork-pr-mode: unsupported
runtime-version: "0.4.0"
runtime-artifact-url: https://archcontext.repoharness.com/releases/archctx-0.4.0.tgz
runtime-version: "0.4.1"
runtime-artifact-url: https://archcontext.repoharness.com/releases/archctx-0.4.1.tgz
runtime-artifact-digest: sha256:<release-digest>
expected-repository: <owner/name from Challenge>
expected-head-sha: <head SHA from Challenge>
Expand Down
4 changes: 2 additions & 2 deletions docs/verification/fg4-deterministic-conclusion-readback.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"environment": "process-fixture",
"status": "verified",
"ok": true,
"generatedAt": "2026-08-09T01:53:27.571Z",
"generatedAt": "2026-08-09T19:01:30.486Z",
"evidence": {
"processLevelFixture": true,
"providerEnvCleared": {
Expand All @@ -14,7 +14,7 @@
},
"deterministicGate": {
"llmProviderConfigured": false,
"modelDigest": "sha256:c1c68a62e938fed39ee93a3ef5597a8281f2e7a4a5d03dbcb56e75f944e9a77c",
"modelDigest": "sha256:ff2e3ae2764b615e6152d9bff09d7170da4dcc2485d398044d4716f233ae493f",
"result": "pass",
"reviewDigestMatchesAttestation": true
},
Expand Down
4 changes: 2 additions & 2 deletions docs/verification/fg6-no-provider-deterministic-readback.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"environment": "staging-release-readback",
"status": "verified",
"ok": true,
"generatedAt": "2026-08-09T01:53:27.613Z",
"generatedAt": "2026-08-09T19:01:30.532Z",
"sources": {
"localNoCloudSource": "docs/verification/fg6-local-no-cloud-readback.json",
"runnerSource": "docs/verification/fg4-github-hosted-runner-readback.json",
Expand Down Expand Up @@ -55,7 +55,7 @@
},
"deterministicGate": {
"llmProviderConfigured": false,
"modelDigest": "sha256:c1c68a62e938fed39ee93a3ef5597a8281f2e7a4a5d03dbcb56e75f944e9a77c",
"modelDigest": "sha256:ff2e3ae2764b615e6152d9bff09d7170da4dcc2485d398044d4716f233ae493f",
"result": "pass",
"reviewDigestMatchesAttestation": true
},
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "archcontext",
"version": "0.4.0",
"version": "0.4.1",
"private": true,
"type": "module",
"packageManager": "bun@1.3.10",
Expand Down
2 changes: 1 addition & 1 deletion packages/cloud/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@archcontext/cloud",
"version": "0.4.0",
"version": "0.4.1",
"private": true,
"type": "module",
"exports": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schemaVersion": "archcontext.capabilities/v1",
"package": { "name": "archctx", "version": "0.4.0" },
"package": { "name": "archctx", "version": "0.4.1" },
"protocols": {
"projectionRequest": "archcontext.projection-request/v1",
"projectionResult": "archcontext.projection-result/v1",
Expand Down
10 changes: 5 additions & 5 deletions packages/contracts/fixtures/valid/product-version-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"schemaVersion": "archcontext.product-version-manifest/v1",
"product": {
"name": "archctx",
"version": "0.4.0",
"version": "0.4.1",
"distribution": "one-package"
},
"packageManager": "bun@1.3.10",
Expand All @@ -12,25 +12,25 @@
"surfaces": {
"cli": {
"packageName": "@archcontext/surfaces",
"version": "0.4.0",
"version": "0.4.1",
"entrypoint": "archctx"
},
"daemon": {
"packageName": "@archcontext/local-runtime",
"version": "0.4.0",
"version": "0.4.1",
"entrypoint": "archctx daemon start",
"rpcSchemaVersion": "archcontext.runtime-rpc/v1"
},
"mcp": {
"packageName": "@archcontext/surfaces",
"version": "0.4.0",
"version": "0.4.1",
"entrypoint": "archctx mcp",
"transport": "stdio"
}
},
"schemas": {
"schemaSetVersion": "2026-06-25.al0-ledger",
"contractsPackageVersion": "0.4.0",
"contractsPackageVersion": "0.4.1",
"reviewChallenge": "archcontext.review-challenge/v2",
"attestation": "archcontext.attestation/v2",
"deviceIdentity": "archcontext.device-identity/v1",
Expand Down
2 changes: 1 addition & 1 deletion packages/contracts/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@archcontext/contracts",
"version": "0.4.0",
"version": "0.4.1",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Refresh bun.lock for the 0.4.1 workspace versions

The package manifests are bumped to 0.4.1, but bun.lock still records every internal workspace at 0.4.0. Both install jobs in .github/workflows/verify.yml run bun install --frozen-lockfile, and bun install --help defines that flag as “Disallow changes to lockfile,” so a clean CI checkout cannot reconcile these manifests and will fail before verification. Regenerate and commit bun.lock alongside the version bump.

Useful? React with 👍 / 👎.

"private": false,
"type": "module",
"license": "Apache-2.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/contracts/src/product-version.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const ARCHCONTEXT_PRODUCT_NAME = "archctx";
export const ARCHCONTEXT_PRODUCT_VERSION = "0.4.0";
export const ARCHCONTEXT_PRODUCT_VERSION = "0.4.1";
export const ARCHCONTEXT_PACKAGE_MANAGER = "bun@1.3.10";
export const ARCHCONTEXT_NODE_RANGE = ">=24 <26";
export const LOCAL_RUNTIME_RPC_SCHEMA_VERSION = "archcontext.runtime-rpc/v1";
Expand Down
22 changes: 21 additions & 1 deletion packages/contracts/src/projection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export interface ProjectionRequestV1 {
changedPaths: string[];
expected: ProjectionExpectedSnapshotV1;
adoptionPlanId?: string;
acceptedChange?: AcceptedArchitectureChangeReferenceV1;
}

export interface ProjectionSnapshotV1 extends ProjectionExpectedSnapshotV1 {
Expand Down Expand Up @@ -193,12 +194,31 @@ export function archctxCapabilities(packageVersion: string): ArchctxCapabilities
export function projectionRequestInvariantIssues(input: ProjectionRequestV1): string[] {
const issues = [
...sortedUniqueIssues("targets", input.targets),
...sortedUniqueIssues("changedPaths", input.changedPaths)
...sortedUniqueIssues("changedPaths", input.changedPaths),
...(input.acceptedChange
? [
...sortedUniqueIssues("acceptedChange.reasonCodes", input.acceptedChange.reasonCodes),
...sortedUniqueIssues("acceptedChange.affectedNodeIds", input.acceptedChange.affectedNodeIds)
]
: [])
];
if (input.targets.length === 0) issues.push("targets must contain at least one projection target");
if (!/^[a-zA-Z0-9_.:-]+$/.test(input.requestId)) issues.push("requestId must use the stable identifier character set");
if (input.mode === "adopt" && !input.adoptionPlanId) issues.push("adoptionPlanId is required when mode=adopt");
if (input.mode !== "adopt" && input.adoptionPlanId !== undefined) issues.push("adoptionPlanId is only allowed when mode=adopt");
if (input.acceptedChange) {
if (input.acceptedChange.changeSetId.trim() === "") issues.push("acceptedChange.changeSetId must not be empty");
if (input.acceptedChange.eventId.trim() === "") issues.push("acceptedChange.eventId must not be empty");
if (input.acceptedChange.reasonCodes.length === 0) issues.push("acceptedChange.reasonCodes must contain at least one reason");
if (input.acceptedChange.affectedNodeIds.length === 0) issues.push("acceptedChange.affectedNodeIds must contain at least one node");
const allowedReasons = new Set<string>(ARCHITECTURE_MAJOR_CHANGE_REASON_CODES);
for (const reason of input.acceptedChange.reasonCodes) {
if (!allowedReasons.has(reason)) issues.push(`acceptedChange.reasonCodes contains unsupported reason: ${reason}`);
}
for (const nodeId of input.acceptedChange.affectedNodeIds) {
if (nodeId.trim() === "") issues.push("acceptedChange.affectedNodeIds must not contain empty node ids");
}
}
return issues;
}

Expand Down
20 changes: 19 additions & 1 deletion packages/contracts/test/contracts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,31 @@ const schemaByFixture: Record<string, string> = {
test("projection request contract enforces adopt binding, unique arrays, and canonical ordering", () => {
const schema = readJson("schemas/runtime/projection-request.schema.json");
const valid = readJson("packages/contracts/fixtures/valid/projection-request.json") as unknown as ProjectionRequestV1;
const acceptedChange = {
changeSetId: "changeset.runtime-major",
eventId: "architecture_event.runtime-major",
reasonCodes: ["ownership-changed", "responsibility-changed"] as const,
affectedNodeIds: ["capability.runtime-harness.hook-adapters"]
};
expect(projectionRequestInvariantIssues(valid)).toEqual([]);
expect(projectionRequestInvariantIssues({ ...valid, acceptedChange: { ...acceptedChange, reasonCodes: [...acceptedChange.reasonCodes] } })).toEqual([]);
expect(validateJsonSchema(schema as any, { ...valid, acceptedChange } as any).valid).toBe(true);
expect(validateJsonSchema(schema as any, { ...valid, mode: "adopt" } as any).valid).toBe(false);
expect(validateJsonSchema(schema as any, { ...valid, adoptionPlanId: "adoption_plan.example" } as any).valid).toBe(false);
expect(validateJsonSchema(schema as any, { ...valid, changedPaths: [valid.changedPaths[0], valid.changedPaths[0]] } as any).valid).toBe(false);
expect(validateJsonSchema(schema as any, { ...valid, acceptedChange: { ...acceptedChange, eventId: "" } } as any).valid).toBe(false);
expect(validateJsonSchema(schema as any, { ...valid, acceptedChange: { ...acceptedChange, reasonCodes: ["not-supported"] } } as any).valid).toBe(false);
expect(validateJsonSchema(schema as any, { ...valid, acceptedChange: { ...acceptedChange, untyped: true } } as any).valid).toBe(false);
expect(projectionRequestInvariantIssues({ ...valid, changedPaths: [...valid.changedPaths].reverse() })).toEqual([
"changedPaths must be sorted and unique"
]);
expect(projectionRequestInvariantIssues({
...valid,
acceptedChange: {
...acceptedChange,
reasonCodes: [...acceptedChange.reasonCodes].reverse()
}
})).toEqual(["acceptedChange.reasonCodes must be sorted and unique"]);
});

test("JSON schema uniqueItems compares canonical JSON rather than object insertion order", () => {
Expand Down Expand Up @@ -281,7 +299,7 @@ test("refresh-required signals bind the exact accepted ChangeSet event and taxon

test("capabilities fixture is the exact static handshake advertised by contracts", () => {
const fixture = readJson("packages/contracts/fixtures/valid/archctx-capabilities.json") as unknown as ReturnType<typeof archctxCapabilities>;
expect(archctxCapabilities("0.4.0")).toEqual(fixture);
expect(archctxCapabilities("0.4.1")).toEqual(fixture);
expect([...ARCHCTX_FEATURES]).toEqual([...ARCHCTX_FEATURES].sort());
const schema = readJson("schemas/runtime/archctx-capabilities.schema.json");
expect(validateJsonSchema(schema as any, archctxCapabilities("1.2.3-rc.1+build.5") as any).valid).toBe(true);
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@archcontext/core",
"version": "0.4.0",
"version": "0.4.1",
"private": true,
"type": "module",
"exports": {
Expand Down
4 changes: 2 additions & 2 deletions packages/core/practice-catalog/assets/catalog.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schemaVersion": "archcontext.practice-catalog-manifest/v1",
"catalogVersion": "2026.06.0",
"productVersion": "0.4.0",
"productVersion": "0.4.1",
"generatedAt": "1970-01-01T00:00:00.000Z",
"entries": [
{
Expand Down Expand Up @@ -389,5 +389,5 @@
"structurizr.dsl",
"twelve-factor"
],
"catalogDigest": "sha256:61835a0efb9c5a19cb4fd16482026918785d01b94b6e60f2c2a06b64a4c713be"
"catalogDigest": "sha256:4d9f972043884502bdfc43a81b7f351df59a5f2af0231529fcdb49490bbf25d7"
}
2 changes: 1 addition & 1 deletion packages/local-runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@archcontext/local-runtime",
"version": "0.4.0",
"version": "0.4.1",
"private": true,
"type": "module",
"exports": {
Expand Down
Loading