arkgate 4.8.22 → 4.8.23
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 +23 -0
- package/README.md +2 -2
- package/bin/ark-check-runtime.mjs +4 -2
- package/bin/ark-layer-match.mjs +606 -11
- package/bin/lib/analysis-engine.mjs +11 -11
- package/bin/lib/config-contract.mjs +492 -1
- package/bin/lib/diagnostic-catalog.mjs +32 -0
- package/bin/lib/doctor-advisories.mjs +60 -1
- package/bin/lib/doctor-plan.mjs +2 -2
- package/bin/lib/enforcement-honesty.mjs +22 -0
- package/bin/lib/flat-parent-pilot.mjs +252 -0
- package/bin/lib/html-report-advisories.mjs +2 -0
- package/bin/lib/html-report-depth.mjs +3 -1
- package/bin/lib/physical-cohesion.mjs +16 -18
- package/bin/lib/pilot-loop.mjs +21 -8
- package/bin/lib/team-parliament-io.mjs +4 -2
- package/dist/{configTypes-CTELo87-.d.ts → configTypes-Bbf_MFGe.d.ts} +36 -2
- package/dist/{diagnosticCatalog-WD2TPSwZ.d.ts → diagnosticCatalog-35mrwAHe.d.ts} +13 -3
- package/dist/eslint/index.cjs +4 -4
- package/dist/eslint/index.d.ts +51 -5
- package/dist/eslint/index.js +4 -4
- package/dist/index.cjs +35 -35
- package/dist/index.d.ts +104 -5
- package/dist/index.js +35 -35
- package/dist/nestjs/index.cjs +9 -9
- package/dist/nestjs/index.d.ts +3 -3
- package/dist/nestjs/index.js +9 -9
- package/dist/runtime/index.cjs +13 -13
- package/dist/runtime/index.d.ts +6 -6
- package/dist/runtime/index.js +13 -13
- package/dist/{types-yDNEQ603.d.ts → types-Bdj32QwA.d.ts} +1 -1
- package/dist/{types-fQ9-KrBj.d.ts → types-Ik_OakcI.d.ts} +1 -1
- package/docs/README.md +2 -1
- package/docs/agent-guide.md +9 -1
- package/docs/configuration.md +92 -1
- package/docs/diagnostics.md +32 -0
- package/docs/product-voice.md +1 -1
- package/package.json +1 -1
- package/schemas/ark.config.schema.json +124 -2
- package/server.json +2 -2
- package/templates/agent-skills/README.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -96,6 +96,29 @@ in the immutable pre-2.0 archive linked below.
|
|
|
96
96
|
Existing configs keep whatever URL they already have. Editor completion
|
|
97
97
|
matches the 4.x line you just installed.
|
|
98
98
|
|
|
99
|
+
## 4.8.23 — 2026-09-28
|
|
100
|
+
|
|
101
|
+
**Patch** over **4.8.22**. Hierarchical slices: the issue #326 series
|
|
102
|
+
(#327–#333). **Write. Check. Ship.** **No required config migration.** Every
|
|
103
|
+
new field is optional; absent keeps today's output. No `schemaVersion` bump.
|
|
104
|
+
Does not close `K01` / `Z09`. This mother `ark.config.json` still
|
|
105
|
+
does **not** turn `arkOrder` on.
|
|
106
|
+
|
|
107
|
+
**Minimum version 4.8.23 for the new config fields.** arkgate 4.8.22 and older
|
|
108
|
+
reject `childSlices` and `sharedImportsSlice: "deny-cross-parent"` at config
|
|
109
|
+
load. Pin 4.8.23 in the write hook and CI first.
|
|
110
|
+
|
|
111
|
+
**Status: released** (tag `v4.8.23`). This file does not assert registry
|
|
112
|
+
state; run `npm view arkgate@4.8.23 version` to confirm (#314).
|
|
113
|
+
|
|
114
|
+
### Added
|
|
115
|
+
- Optional `childSlices` on a `peerIsolation` rule: an inner wall under today's universe wall. Absent, behavior and output stay the same. Present, a cross-universe deny is `reasonId` `CROSS_PARENT_SLICE` (never advisory) and a sibling crossing is `CROSS_SIBLING_SLICE` (`siblings`: `deny` or `advisory`). `commonFolders` and flat files are universe common. `parentMayImportChild` defaults to false. The baseline key does not include `reasonId`. Advisory siblings still fail when they grow past the recorded baseline, and `productHonesty.finished` stays false while any child wall is advisory. Doctor reports `{ crossParent, crossSibling, pairs }`. arkgate 4.8.22 and older reject the key. Wildcards and aliases are not part of that introduction (#328).
|
|
116
|
+
- `sharedImportsSlice` may be `"deny-cross-parent"`. The direct shared-root hop stays a `SHARED_IMPORTS_SLICE` warning. ark-check and CI add `reasonId` `CROSS_PARENT_VIA_SHARED` when a slice reaches another universe only through a shared root. A shared hop inside one universe is not a finding. `"deny"` is unchanged. The write hook and ESLint see one edge at a time and do not block the path. The baseline key does not include `reasonId`. arkgate 4.8.22 and older reject the value at config load. Does not close `K01` (#329).
|
|
117
|
+
- `childSlices.siblings` may be `{ "default": "advisory" | "deny", "enforce": [...] }`. A `CROSS_SIBLING_SLICE` whose importer is an enforced child id or subtree path is an error. Other sibling crossings stay warnings, and a new one past the recorded baseline still fails. `default: "deny"` denies every sibling crossing. The string forms `"deny"` and `"advisory"` stay the same. `ruleId` stays `LAYER_IMPORT_VIOLATION`. The baseline key does not include `reasonId`. `productHonesty.finished` stays false while `default` is advisory. An enforce list does not finish the house. The write hook, ESLint, ark-check, and CI all see the per-edge severity. A build that still types `siblings` as a string enum rejects the object at config load. Does not close `K01` (#330).
|
|
118
|
+
- `childSlices.allowedCrossSlice` accepts a whole-segment `*` (`features/projects/*`). It clears only a `CROSS_SIBLING_SLICE` inside one universe. It does not clear `CROSS_PARENT_SLICE` or `CROSS_PARENT_VIA_SHARED`. A pattern that can name two universes warns `CONFIG_CHILD_SLICE_CROSS_UNIVERSE` and the cross-parent finding still fires. A bare name is rejected at config load. `**` and a partial segment are rejected. The universe `allowedCrossSlice` still treats `*` as a literal. Adding an entry is a weakening policy delta; a wildcard that widens a literal entry is weakening too. `ruleId` stays `LAYER_IMPORT_VIOLATION`. The baseline key does not include `reasonId`. The write hook, ESLint, ark-check, and CI all see the per-edge decision. A build that still rejects unknown `childSlices` fields rejects the key at config load. arkgate 4.8.22 and older reject `childSlices`. Does not close `K01` (#331).
|
|
119
|
+
- `childSlices.sliceAliases` maps a folder outside the slice trees onto a child slice (`{ "from": "lib/compliance/**", "to": "features/projects/compliance" }`). The file takes that universe id and that child id for both walls, so an import into another universe is `CROSS_PARENT_SLICE`. A bare name, a universe id alone, an unknown universe, and a wildcard in `to` are rejected at config load. A glob that overlaps a slice folder is rejected. Two aliases that match the same file are rejected. Doctor lists each alias as an owed move (files, target slice, destination folder) and does not count the files as finished. Adding aliases is a strengthening policy delta. Removing them is weakening. Additions and removals together, including a retarget, need a judgment. `ruleId` stays `LAYER_IMPORT_VIOLATION`. The baseline key does not include `reasonId`. The write hook, ESLint, snippet analysis, ark-check, and CI all see the alias. A build that still rejects unknown `childSlices` fields rejects the key at config load. arkgate 4.8.22 and older reject `childSlices`. Does not close `K01` (#332).
|
|
120
|
+
- Doctor suggests a move for a flat file that sits at universe level when exactly one child slice imports it (`doctor.flatParentPilot`). The card names the file, that child, and a destination folder inside the child that keeps the file's layer. Two importers, or none, produce no card. The sentence is a suggestion. It does not change ark-check, `ruleId`, `reasonId`, or the baseline key. The reshape destination check uses the same slice identity as the walls, so `sliceIdentity: "stars"` does not treat two children as one slice. No new config field. Does not close `K01` (#333).
|
|
121
|
+
|
|
99
122
|
## 4.8.22 — 2026-09-27
|
|
100
123
|
|
|
101
124
|
**Patch** over **4.8.21**. Daily accumulate (2026-09-27 ART) of the ships
|
package/README.md
CHANGED
|
@@ -25,11 +25,11 @@ Design the boundary before you implement. Put a small interface in front of the
|
|
|
25
25
|
|
|
26
26
|
## Try it
|
|
27
27
|
|
|
28
|
-
One command. Preview only — no files change. Current release is **4.8.
|
|
28
|
+
One command. Preview only — no files change. Current release is **4.8.23**
|
|
29
29
|
(check npm `latest` with `npm view arkgate version`):
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
npx arkgate@4.8.
|
|
32
|
+
npx arkgate@4.8.23 start
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## What a red result looks like
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
printAdrPresenceHint,
|
|
67
67
|
} from './lib/doctor-plan.mjs';
|
|
68
68
|
import { runRatchetCores } from './lib/core-ratchet.mjs';
|
|
69
|
+
import { applyAdvisorySiblingRatchet } from './ark-layer-match.mjs';
|
|
69
70
|
import {
|
|
70
71
|
baselineKey,
|
|
71
72
|
baselineOccurrenceKeys,
|
|
@@ -1593,8 +1594,9 @@ async function main() {
|
|
|
1593
1594
|
const baseline = readBaseline(root, args.baseline);
|
|
1594
1595
|
if (baseline.exists) {
|
|
1595
1596
|
const occurrenceKeys = baselineOccurrenceKeys(violations);
|
|
1596
|
-
|
|
1597
|
-
|
|
1597
|
+
const judged = applyAdvisorySiblingRatchet(violations, occurrenceKeys, baseline.keys);
|
|
1598
|
+
suppressed = judged.filter((_, index) => baseline.keys.has(occurrenceKeys[index]));
|
|
1599
|
+
activeViolations = judged.filter((_, index) => !baseline.keys.has(occurrenceKeys[index]));
|
|
1598
1600
|
const currentKeys = new Set(occurrenceKeys);
|
|
1599
1601
|
staleBaselineKeys = [...baseline.keys].filter((key) => !currentKeys.has(key)).length;
|
|
1600
1602
|
} else {
|