arkgate 4.8.6 → 4.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,16 +3,39 @@
3
3
  All notable changes to ArkGate (`arkgate`; formerly `ark-runtime-kernel`) are documented here or
4
4
  in the immutable pre-2.0 archive linked below.
5
5
 
6
+ ## 4.8.7 — 2026-08-31
7
+
8
+ **Patch** over **4.8.6**. Phase **LD** — layer description projection. Optional
9
+ `layers[].description` is an **app-context caption** (what this folder is in the
10
+ product), not architecture jargon. Place, doctor, coverage, and the HTML report
11
+ show it when present. Caption-only edits do not change `policyHash`.
12
+ **No required config migration.** No `schemaVersion` bump. Does not close `K01` / `Z09`.
13
+ No new skill names. Do not npm-publish from this item until the maintainer tag.
14
+
15
+ **Status: prepared** (tree ready; npm `latest` remains **4.8.6** until publish).
16
+
17
+ ### Added
18
+ - Public name for existing `layers[].description`. Example:
19
+ `"Purchase requests — from asked to received."`
20
+ - Place / prepare-write / MCP JSON, doctor JSON + human, coverage JSON, and the
21
+ HTML Purpose column project the caption when present.
22
+ - `/ark-adopt` writes the caption from the product map or glossary; `/ark-place`
23
+ prints it next to layer name + globs.
24
+
25
+ ### Changed
26
+ - `policyHash` omits `layers[].description` the same way it omits `stewards`.
27
+ Caption-only is neutral. Absence stays silent: never a residual, never a
28
+ score, never `--strict-config` fail.
29
+
6
30
  ## 4.8.6 — 2026-08-31
7
31
 
8
32
  **Patch** over **4.8.5**. Phase **LV** — ArkOrder valved loop. First `release()`
9
33
  freezes ξ; later pattern change is `proposeRelease` then `apply`. σ identity is
10
34
  not ξ identity. ingest returns a closed residual. Capacity is data. ArkRun
11
35
  carries the decision tape. **No required config migration.** Does not close
12
- `K01` / `Z09`. No `/ark-order` skill. Do not npm-publish from this item until
13
- the maintainer tag.
36
+ `K01` / `Z09`. No `/ark-order` skill.
14
37
 
15
- **Status: prepared** (tree ready; npm `latest` remains **4.8.5** until publish).
38
+ **Status: published** (on npm `latest`; see `docs/releases/4.8.6.md`).
16
39
 
17
40
  ### Added
18
41
  - **`apply(ProposeResult)`** on `createOrderPlane`. Unvalved second freeze of a
@@ -42,7 +65,7 @@ now has a canonical page. The runtime half (shadow / replay / compare) is
42
65
  ArkRun and in-memory. **No required config migration.** Does not close `K01` /
43
66
  `Z09`.
44
67
 
45
- **Status: published** (on npm `latest`; see `docs/releases/4.8.5.md`).
68
+ **Status: published** (see `docs/releases/4.8.5.md`).
46
69
 
47
70
  ### Added
48
71
  - **`docs/arkorder.md`:** named APIs adopters were redesigning (`createOrderPlane`,
package/README.md CHANGED
@@ -29,7 +29,7 @@ Works with Cursor, Claude, Codex, and Grok.
29
29
 
30
30
  </div>
31
31
 
32
- > **ArkGate 4.8.5** is on npm `latest`. This tree is **4.8.6** (prepared patch; not published).
32
+ > **ArkGate 4.8.6** is on npm `latest`.
33
33
  > Write. Check. Ship. Adopted = required GitHub
34
34
  > status running `arkgate-check --strict-merge`, or an explicit `advisory-only` stance.
35
35
  > Status is compact (`arkgate-check --doctor`; `--all` for Details). Optional **ArkRun**
@@ -309,8 +309,9 @@ three keys. Compact starters leave it off. Details:
309
309
  | Config · package surface · TS | [configuration](docs/configuration.md) · [package-surface](docs/package-surface.md) · [typescript-support](docs/typescript-support.md) |
310
310
  | Brownfield | [docs/brownfield-adoption.md](docs/brownfield-adoption.md) |
311
311
  | Security | [SECURITY.md](SECURITY.md) |
312
- | Tree prepared (4.8.6, not published) | [docs/releases/4.8.6.md](docs/releases/4.8.6.md) · [CHANGELOG](CHANGELOG.md) |
313
- | Current published (4.8.5 on npm `latest`) | [docs/releases/4.8.5.md](docs/releases/4.8.5.md) · [CHANGELOG](CHANGELOG.md) |
312
+ | Current tree (4.8.7 prepared) | [docs/releases/4.8.7.md](docs/releases/4.8.7.md) · [CHANGELOG](CHANGELOG.md) |
313
+ | Current published (4.8.6 on npm `latest`) | [docs/releases/4.8.6.md](docs/releases/4.8.6.md) |
314
+ | Prior published (4.8.5) | [docs/releases/4.8.5.md](docs/releases/4.8.5.md) |
314
315
  | Prior published (4.8.4) | [docs/releases/4.8.4.md](docs/releases/4.8.4.md) |
315
316
  | Prior published (4.8.3) | [docs/releases/4.8.3.md](docs/releases/4.8.3.md) |
316
317
  | Prior published (4.8.2) | [docs/releases/4.8.2.md](docs/releases/4.8.2.md) |
@@ -27,6 +27,7 @@ import { effectiveCapabilityDeny, stableSerialize } from './lib/analysis-engine.
27
27
  import { createImportTargetResolver } from './lib/import-resolve.mjs';
28
28
  import { validateWithAutoPatch, resolveImportFileAbs } from './lib/auto-patch.mjs';
29
29
  import { composePrepareWrite } from './lib/prepare-write.mjs';
30
+ import { placementDescriptionFields } from './lib/layer-description.mjs';
30
31
  import { loadArkConfigContract } from './lib/config-contract.mjs';
31
32
  import { loadEffectiveArkRulesFromDisk } from './lib/effective-contract-load.mjs';
32
33
  import {
@@ -1925,6 +1926,7 @@ export async function runArkMcp({ hookInput } = {}) {
1925
1926
  'Place a file in the architecture: filePath is required (fail-closed without it — never invents components/*.tsx or defaults to Presentation). ' +
1926
1927
  'Returns layer, mayImport / mustNotImport, forbiddenGlobals, and goldenPattern ' +
1927
1928
  '(load-bearing for NEW code when .ark/golden-pattern.json exists — adopt generates it). ' +
1929
+ 'When the matched layer has layers[].description, the JSON includes description; the field is omitted when absent. ' +
1928
1930
  'Call BEFORE writing a new file. ' +
1929
1931
  'Prefer ark_prepare_write when you already have the source snippet (place+validate+autoPatch in one call).',
1930
1932
  inputSchema: {
@@ -1950,7 +1952,8 @@ export async function runArkMcp({ hookInput } = {}) {
1950
1952
  'mechanical-safe autoPatch + judgmentBrief when judgment is needed + contentHash for host commit. ' +
1951
1953
  'Also returns the versioned new/worsened designDelta for the proposed full file. ' +
1952
1954
  'Composes ark_place + write-gate — call BEFORE Write/Edit when you have the snippet. ' +
1953
- 'Returns { filePath, layer, valid, violations?, autoPatch?, judgmentBrief?, contentHash, ... }.',
1955
+ 'When the matched layer has layers[].description, the JSON includes description; the field is omitted when absent. ' +
1956
+ 'Returns { filePath, layer, description?, valid, violations?, autoPatch?, judgmentBrief?, contentHash, ... }.',
1954
1957
  inputSchema: {
1955
1958
  type: 'object',
1956
1959
  properties: {
@@ -2393,6 +2396,9 @@ export async function runArkMcp({ hookInput } = {}) {
2393
2396
  // `allowed:false` denies) — which layers it may and must not import.
2394
2397
  // Q03: when present, attach optional `.ark/golden-pattern.json` (advisory for NEW code only).
2395
2398
  function placeResult(filePath, description) {
2399
+ // Input `description` is the pre-existing "what you are building" hint — not
2400
+ // layers[].description — and must not be copied onto the caption key (ADR 0035 D5).
2401
+ void description;
2396
2402
  const golden = loadGoldenPattern(args.root);
2397
2403
  const withGolden = (placement) => attachGoldenToPlacement(placement, golden);
2398
2404
 
@@ -2433,7 +2439,7 @@ export async function runArkMcp({ hookInput } = {}) {
2433
2439
  filePath,
2434
2440
  layer: layerName,
2435
2441
  governed: true,
2436
- description: layerMeta?.description,
2442
+ ...placementDescriptionFields(layerMeta),
2437
2443
  forbiddenGlobals: layerMeta?.forbiddenGlobals ?? [],
2438
2444
  ...(layerMeta?.mayImportInfrastructure ? { mayImportInfrastructure: true } : {}),
2439
2445
  mayImport,