audit-tools 0.51.10 → 0.52.0
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/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
- package/dist/audit/orchestrator/executorRunners.js +14 -3
- package/dist/audit/orchestrator/executorRunners.js.map +1 -1
- package/dist/audit/orchestrator/resultBaseline.d.ts +1 -1
- package/dist/audit/orchestrator/synthesisExecutors.d.ts +10 -3
- package/dist/audit/orchestrator/synthesisExecutors.d.ts.map +1 -1
- package/dist/audit/orchestrator/synthesisExecutors.js +5 -4
- package/dist/audit/orchestrator/synthesisExecutors.js.map +1 -1
- package/dist/audit/reporting/synthesis.d.ts +7 -3
- package/dist/audit/reporting/synthesis.d.ts.map +1 -1
- package/dist/audit/reporting/synthesis.js +13 -2
- package/dist/audit/reporting/synthesis.js.map +1 -1
- package/dist/remediate/phases/close.d.ts +11 -4
- package/dist/remediate/phases/close.d.ts.map +1 -1
- package/dist/remediate/phases/close.js +78 -14
- package/dist/remediate/phases/close.js.map +1 -1
- package/dist/remediate/phases/closeVerifyHeadEvidence.d.ts +19 -35
- package/dist/remediate/phases/closeVerifyHeadEvidence.d.ts.map +1 -1
- package/dist/remediate/phases/closeVerifyHeadEvidence.js +38 -12
- package/dist/remediate/phases/closeVerifyHeadEvidence.js.map +1 -1
- package/dist/remediate/phases/closeVerifyLandingGates.d.ts +85 -0
- package/dist/remediate/phases/closeVerifyLandingGates.d.ts.map +1 -0
- package/dist/remediate/phases/closeVerifyLandingGates.js +48 -0
- package/dist/remediate/phases/closeVerifyLandingGates.js.map +1 -0
- package/dist/remediate/state/types.d.ts +31 -4
- package/dist/remediate/state/types.d.ts.map +1 -1
- package/dist/remediate/state/types.js +12 -1
- package/dist/remediate/state/types.js.map +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts +23 -1
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +122 -10
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.js +11 -7
- package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.js +41 -5
- package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +23 -7
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/types/options.d.ts +6 -0
- package/dist/remediate/types/options.d.ts.map +1 -1
- package/dist/shared/contentKey.d.ts +4 -4
- package/dist/shared/contentKey.js +3 -3
- package/dist/shared/git.d.ts +31 -0
- package/dist/shared/git.d.ts.map +1 -1
- package/dist/shared/git.js +105 -0
- package/dist/shared/git.js.map +1 -1
- package/dist/shared/index.d.ts +7 -5
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +5 -4
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/prompts.d.ts +14 -3
- package/dist/shared/prompts.d.ts.map +1 -1
- package/dist/shared/prompts.js +17 -4
- package/dist/shared/prompts.js.map +1 -1
- package/dist/shared/reporting/auditDeliverable.d.ts +8 -3
- package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -1
- package/dist/shared/reporting/auditDeliverable.js +10 -3
- package/dist/shared/reporting/auditDeliverable.js.map +1 -1
- package/dist/shared/tooling/landingGates.d.ts +118 -0
- package/dist/shared/tooling/landingGates.d.ts.map +1 -0
- package/dist/shared/tooling/landingGates.js +314 -0
- package/dist/shared/tooling/landingGates.js.map +1 -0
- package/dist/shared/tooling/projectTestAdmission.d.ts +16 -0
- package/dist/shared/tooling/projectTestAdmission.d.ts.map +1 -1
- package/dist/shared/tooling/projectTestAdmission.js +73 -10
- package/dist/shared/tooling/projectTestAdmission.js.map +1 -1
- package/dist/shared/tooling/testCommand.d.ts.map +1 -1
- package/dist/shared/tooling/testCommand.js +10 -0
- package/dist/shared/tooling/testCommand.js.map +1 -1
- package/dist/shared/types/finding.d.ts +56 -0
- package/dist/shared/types/finding.d.ts.map +1 -1
- package/dist/shared/types/finding.js +27 -0
- package/dist/shared/types/finding.js.map +1 -1
- package/dist/shared/types/intentCheckpoint.d.ts +2 -2
- package/dist/shared/validation/findingsReport.d.ts +13 -2
- package/dist/shared/validation/findingsReport.d.ts.map +1 -1
- package/dist/shared/validation/findingsReport.js +19 -2
- package/dist/shared/validation/findingsReport.js.map +1 -1
- package/docs/audit-pkg/product.md +2 -4
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// sites-pinned: tests/remediate/remediate-state-invariants.test.ts, tests/remediate/audit-read-plan-stamp.test.ts
|
|
1
2
|
// Shared audit-deliverable emitter: build the canonical `audit-findings.json`
|
|
2
3
|
// machine contract + its `audit-report.md` human render from a Finding[] set.
|
|
3
4
|
//
|
|
@@ -39,8 +40,13 @@ function lensBreakdown(findings) {
|
|
|
39
40
|
* deliverable is a flat, re-consumable finding set). Stamped with the same
|
|
40
41
|
* `contract_version` the auditor emits, so `validateAuditFindingsReport` accepts
|
|
41
42
|
* it and the remediator's structured fast-path consumes it losslessly.
|
|
43
|
+
*
|
|
44
|
+
* `auditRead` is REQUIRED and is never computed here: this emitter re-states
|
|
45
|
+
* findings somebody else read, so the only honest value is the one the source
|
|
46
|
+
* report carried (or `null` when there was none). Stamping the commit current at
|
|
47
|
+
* re-emit time would hand the next run a remediation-side commit as `B`.
|
|
42
48
|
*/
|
|
43
|
-
export function buildAuditFindingsDeliverable(findings) {
|
|
49
|
+
export function buildAuditFindingsDeliverable(findings, auditRead) {
|
|
44
50
|
const coherenceTrace = buildContentCoherenceTrace({
|
|
45
51
|
items: findings.map((finding) => ({
|
|
46
52
|
id: finding.id,
|
|
@@ -84,6 +90,7 @@ export function buildAuditFindingsDeliverable(findings) {
|
|
|
84
90
|
};
|
|
85
91
|
return {
|
|
86
92
|
contract_version: AUDIT_FINDINGS_CONTRACT_VERSION,
|
|
93
|
+
audit_read: auditRead,
|
|
87
94
|
summary,
|
|
88
95
|
findings: [...findings],
|
|
89
96
|
coherence_trace: coherenceTrace,
|
|
@@ -122,9 +129,9 @@ export function renderAuditDeliverableMarkdown(findings, options = {}) {
|
|
|
122
129
|
* `findings_report` to `audit-findings.json` and `report_markdown` to
|
|
123
130
|
* `audit-report.md`.
|
|
124
131
|
*/
|
|
125
|
-
export function buildAuditDeliverablePair(findings, options = {}) {
|
|
132
|
+
export function buildAuditDeliverablePair(findings, auditRead, options = {}) {
|
|
126
133
|
return {
|
|
127
|
-
findings_report: buildAuditFindingsDeliverable(findings),
|
|
134
|
+
findings_report: buildAuditFindingsDeliverable(findings, auditRead),
|
|
128
135
|
report_markdown: renderAuditDeliverableMarkdown(findings, options),
|
|
129
136
|
};
|
|
130
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditDeliverable.js","sourceRoot":"","sources":["../../../src/shared/reporting/auditDeliverable.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,2BAA2B;
|
|
1
|
+
{"version":3,"file":"auditDeliverable.js","sourceRoot":"","sources":["../../../src/shared/reporting/auditDeliverable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One landing-gate ROLE, with the npm script names that declare it in
|
|
3
|
+
* preference order — the same ordering rule `testCommand.ts` states: generic /
|
|
4
|
+
* widely-adopted names first, framework- or repo-specific aliases last, and
|
|
5
|
+
* `pickScript` returns the FIRST match.
|
|
6
|
+
*/
|
|
7
|
+
export interface LandingGateRole {
|
|
8
|
+
/**
|
|
9
|
+
* The gate's role. Named so a report, a test and a prompt can all say WHICH
|
|
10
|
+
* gate a repo contributes without parsing its script name.
|
|
11
|
+
*/
|
|
12
|
+
readonly role: "guard" | "deadcode" | "depgraph" | "glossary" | "lint";
|
|
13
|
+
/**
|
|
14
|
+
* One line, rendered wherever the landing gate is described to a host — the
|
|
15
|
+
* gate's own statement of what it refuses, never restated at the call site.
|
|
16
|
+
*/
|
|
17
|
+
readonly refuses: string;
|
|
18
|
+
/** npm script names declaring this role, most generic first. */
|
|
19
|
+
readonly scripts: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The declared landing-gate vocabulary.
|
|
23
|
+
*
|
|
24
|
+
* ORDER IS THE EMITTED ORDER, and the four roles are independent: a repo
|
|
25
|
+
* declaring only `check:lint` contributes exactly one command. Sorted by role
|
|
26
|
+
* name (deadcode, depgraph, guard, lint) as the array literal, so the emitted
|
|
27
|
+
* list is content-stable and a re-derivation cannot churn the workload digest
|
|
28
|
+
* (CLAUDE.md, "Extractors emit stable, content-derived array order").
|
|
29
|
+
*
|
|
30
|
+
* `guard` is separate from the three cheap gates because it is the EXPENSIVE
|
|
31
|
+
* one: the repository's own cross-cutting test suite. It is here because a
|
|
32
|
+
* guard suite is precisely the gate a module-scoped `targeted_commands` entry
|
|
33
|
+
* cannot stand in for — `tests/shared/audit-tools-path-guard.test.ts` is the
|
|
34
|
+
* live example.
|
|
35
|
+
*/
|
|
36
|
+
export declare const LANDING_GATE_SCRIPT_NAMES: readonly LandingGateRole[];
|
|
37
|
+
/**
|
|
38
|
+
* The repository's landing gates, as runnable command strings, in the
|
|
39
|
+
* vocabulary's declared role order.
|
|
40
|
+
*
|
|
41
|
+
* Pure over `(root)` and deterministic: reads one manifest, emits a
|
|
42
|
+
* content-stable sorted-by-role list, spawns nothing.
|
|
43
|
+
*/
|
|
44
|
+
export declare function discoverLandingGates(root: string): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Every invariant id a value DECLARES anywhere it can be nested — a module
|
|
47
|
+
* contract's `invariants`, an obligation slug, or any other string a producer
|
|
48
|
+
* hangs an id on. Walks objects and arrays rather than reading one named field,
|
|
49
|
+
* because a contract's shape is the producer's, not this predicate's.
|
|
50
|
+
*
|
|
51
|
+
* Returns the SET of ids, not a boolean, because the caller has to subtract the
|
|
52
|
+
* ids the glossary already documents: mentioning an existing id is not coining
|
|
53
|
+
* one (see {@link withGlossaryScope}).
|
|
54
|
+
*/
|
|
55
|
+
export declare function declaredInvariantIds(value: unknown): Set<string>;
|
|
56
|
+
/**
|
|
57
|
+
* Whether a value declares ANY invariant id — the boolean form of
|
|
58
|
+
* {@link declaredInvariantIds}, for a caller that only needs the predicate.
|
|
59
|
+
*/
|
|
60
|
+
export declare function declaresInvariantId(value: unknown): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The one-line statement of what a landing gate command REFUSES, or `null` when
|
|
63
|
+
* the command was not declared as one.
|
|
64
|
+
*
|
|
65
|
+
* Rendered wherever a host is told what its required tests cover, so the
|
|
66
|
+
* sentence stating a gate's authority is written once, beside the vocabulary
|
|
67
|
+
* that declares the gate. `null` for an item's own `targeted_commands`, which
|
|
68
|
+
* are not landing gates and carry no vocabulary entry.
|
|
69
|
+
*/
|
|
70
|
+
export declare function landingGateRefusal(command: string): string | null;
|
|
71
|
+
/**
|
|
72
|
+
* The glossary document a scope must be able to write when it coins an
|
|
73
|
+
* invariant id. Repo-relative, so it composes with `allowed_files` unchanged.
|
|
74
|
+
*
|
|
75
|
+
* ⚠ This is THIS repository's convention, and it is only ever consulted as a
|
|
76
|
+
* CANDIDATE. `remediate-code` runs against arbitrary repositories, so the path
|
|
77
|
+
* being a constant is not a claim that the document exists — a target root that
|
|
78
|
+
* has no such file gets NO widening at all (a content fact, checked by
|
|
79
|
+
* {@link withGlossaryScope}). A tool that widened on the NAME alone would hand
|
|
80
|
+
* an item write scope over a file its repository does not have.
|
|
81
|
+
*/
|
|
82
|
+
export declare const GLOSSARY_DOCUMENT_PATH = "docs/glossary-ids.md";
|
|
83
|
+
/**
|
|
84
|
+
* Widen a work item's write scope so an item that COINS an invariant id can
|
|
85
|
+
* actually satisfy the id-glossary gate.
|
|
86
|
+
*
|
|
87
|
+
* ── THE FRICTION THIS CLOSES ─────────────────────────────────────────────────
|
|
88
|
+
*
|
|
89
|
+
* The glossary document is outside every module's `file_scope`; the glossary
|
|
90
|
+
* gate scans `src/` for `INV-*` ids and fails on one with no glossary row. So
|
|
91
|
+
* an item that coins an id in `src/` is STRUCTURALLY UNABLE to satisfy the
|
|
92
|
+
* gate: the fix is a glossary edit its write scope forbids, and the red lands
|
|
93
|
+
* silently, discovered by the NEXT item's worker. It happened twice in one
|
|
94
|
+
* session (`INV-SSP-DEFERRED-SET-REPORTED` at CP-NODE-10, and the id the
|
|
95
|
+
* charter-delta parser coined at CP-NODE-18, since retired with that parser) —
|
|
96
|
+
* the "tool_should_decide" friction in `docs/backlog/open-bugs.md`.
|
|
97
|
+
*
|
|
98
|
+
* ── THREE CONDITIONS, EACH NARROWING ─────────────────────────────────────────
|
|
99
|
+
*
|
|
100
|
+
* 1. The document must EXIST in the target root. The path is this
|
|
101
|
+
* repository's convention; an arbitrary target repo may keep none, and
|
|
102
|
+
* widening for a document that is not there grants scope over nothing.
|
|
103
|
+
* 2. The contract must declare at least one id the document does NOT already
|
|
104
|
+
* carry. A contract that merely MENTIONS `INV-COVERAGE` — a seam adjustment
|
|
105
|
+
* citing an existing invariant, a prose reference — coins nothing, and
|
|
106
|
+
* widening for it hands the item a document it has no business editing.
|
|
107
|
+
* Only an id with no row yet is a COIN, because only that id needs one.
|
|
108
|
+
* 3. The scope must not already carry the path (idempotence).
|
|
109
|
+
*
|
|
110
|
+
* The gate itself is bound separately, at the CLOSE — scope without the gate
|
|
111
|
+
* would leave the red silent; the gate without scope would turn it into a
|
|
112
|
+
* dead-end refusal. Both halves are the one decision.
|
|
113
|
+
*
|
|
114
|
+
* Deterministic, stable-ordered and idempotent: a scope that already carries
|
|
115
|
+
* the path is returned unchanged.
|
|
116
|
+
*/
|
|
117
|
+
export declare function withGlossaryScope(root: string, allowedFiles: readonly string[], declaredIds: ReadonlySet<string>): string[];
|
|
118
|
+
//# sourceMappingURL=landingGates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landingGates.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/landingGates.ts"],"names":[],"mappings":"AAuEA;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IACvE;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,eAAe,EAkC/D,CAAC;AAyBF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAc3D;AAeD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAkBhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAyB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,MAAM,EAAE,CAQV"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
// sites-pinned: tests/shared/landing-gates.test.ts, tests/remediate/host-handoff.test.ts
|
|
2
|
+
// The discovery/vocabulary/scope rules are pinned by the shared suite; the
|
|
3
|
+
// per-item wiring that remains (the glossary write scope) is pinned by the
|
|
4
|
+
// host-handoff suite's "landing gates" block, and the close leg by
|
|
5
|
+
// tests/remediate/landing-gates-close.test.ts.
|
|
6
|
+
//
|
|
7
|
+
// The repository's LANDING GATES: the tree-wide guard suites and the cheap
|
|
8
|
+
// release gates a LANDING must run, discovered from the target repository's own
|
|
9
|
+
// declared command surface.
|
|
10
|
+
//
|
|
11
|
+
// ── WHY THIS EXISTS ──────────────────────────────────────────────────────────
|
|
12
|
+
//
|
|
13
|
+
// The per-item required tests were the block's `targeted_commands`, which are
|
|
14
|
+
// MODULE-SCOPED: a block that edits one module declares the command that
|
|
15
|
+
// exercises that module. Three remediation landings reddened CI after green
|
|
16
|
+
// per-item runs, each on a gate no per-item command covers —
|
|
17
|
+
//
|
|
18
|
+
// • a hand-restated `.audit-tools` literal caught only by the tree-wide
|
|
19
|
+
// `tests/shared/audit-tools-path-guard.test.ts` (`1e7a4a54` fixed it),
|
|
20
|
+
// • a case-folding assertion true only on a case-insensitive volume
|
|
21
|
+
// (`011c6ae0`), and
|
|
22
|
+
// • an intra-`src/shared` import cycle a reviewer graded minor that
|
|
23
|
+
// `check:depgraph` refuses (`b5963957`).
|
|
24
|
+
//
|
|
25
|
+
// ── WHERE THE GATES RUN: THE CLOSE, NOT THE ITEM ─────────────────────────────
|
|
26
|
+
//
|
|
27
|
+
// The first attempt folded these gates into EVERY work item's `required_tests`.
|
|
28
|
+
// That was wrong, and the way it was wrong is worth keeping: these gates state
|
|
29
|
+
// facts about the WHOLE tree, so an item that adds an export whose only consumer
|
|
30
|
+
// lands in a LATER item could not pass, and no edit inside its own scope could
|
|
31
|
+
// make it pass; another item's fault could refuse this one too. A gate that
|
|
32
|
+
// GUESSES at a boundary owned by something else is moved to the boundary that
|
|
33
|
+
// owns it (CLAUDE.md, *A gate states the boundary it OWNS*) — and the merged tree
|
|
34
|
+
// exists only at the CLOSE. So the loop is: this module DISCOVERS the gates, and
|
|
35
|
+
// `verifyLandingGates` (`src/remediate/phases/closeVerifyLandingGates.ts`) runs
|
|
36
|
+
// them once each at close and folds the result into `fullyGreen`.
|
|
37
|
+
//
|
|
38
|
+
// What stays per-item is the one scope fact a prepare owns: a block that coins
|
|
39
|
+
// an invariant id needs the glossary document in its write scope, or the gate is
|
|
40
|
+
// unsatisfiable for the item that coins it (`withGlossaryScope` below).
|
|
41
|
+
//
|
|
42
|
+
// ── WHY IT IS DISCOVERED, NOT BAKED IN ───────────────────────────────────────
|
|
43
|
+
//
|
|
44
|
+
// `remediate-code` runs against ARBITRARY repositories. `check:depgraph`,
|
|
45
|
+
// `check:deadcode` and `check:lint` are THIS repository's script names; a
|
|
46
|
+
// language-neutral tool that hardcoded them would demand a target repo declare
|
|
47
|
+
// audit-tools' own private vocabulary, and would run the wrong thing (or
|
|
48
|
+
// nothing) everywhere else. So the gates are read from the target repo's
|
|
49
|
+
// `package.json` scripts through a DECLARED, preference-ordered vocabulary —
|
|
50
|
+
// exactly the shape `discoverProjectCommands` (./testCommand.ts) already uses
|
|
51
|
+
// for test/e2e/build/lint, so a "discover a project command by role" question
|
|
52
|
+
// has one answer in this codebase rather than two.
|
|
53
|
+
//
|
|
54
|
+
// Degrade-to-empty is the contract: a repo with no `package.json`, a malformed
|
|
55
|
+
// one, or one declaring none of these roles contributes NO landing gate. A
|
|
56
|
+
// missing gate narrows the landing command set; it never throws and never
|
|
57
|
+
// invents a command the repository did not declare.
|
|
58
|
+
//
|
|
59
|
+
// ⚠ WHAT "NO GATE DISCOVERED" DOES AND DOES NOT MEAN. Discovery reads the target
|
|
60
|
+
// repository's `package.json` `scripts` map and NOTHING ELSE — there is no
|
|
61
|
+
// `Makefile`, `Cargo.toml`, `build.gradle` or shell-script arm, and none is
|
|
62
|
+
// planned, because no portable way exists to read another build system's target
|
|
63
|
+
// names and a guessed target would run the wrong thing. So "no landing gate" is
|
|
64
|
+
// a fact about the manifest, never a claim that the repository has no tree-wide
|
|
65
|
+
// check: a repository with another build system gets NO landing gate at all, and
|
|
66
|
+
// the close report says so in one line rather than silently reporting a green
|
|
67
|
+
// gate set. A gate is only ever ADDED by the target declaring it.
|
|
68
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
69
|
+
import { join } from "node:path";
|
|
70
|
+
import { compareCodeUnits } from "../compareCodeUnits.js";
|
|
71
|
+
/**
|
|
72
|
+
* The declared landing-gate vocabulary.
|
|
73
|
+
*
|
|
74
|
+
* ORDER IS THE EMITTED ORDER, and the four roles are independent: a repo
|
|
75
|
+
* declaring only `check:lint` contributes exactly one command. Sorted by role
|
|
76
|
+
* name (deadcode, depgraph, guard, lint) as the array literal, so the emitted
|
|
77
|
+
* list is content-stable and a re-derivation cannot churn the workload digest
|
|
78
|
+
* (CLAUDE.md, "Extractors emit stable, content-derived array order").
|
|
79
|
+
*
|
|
80
|
+
* `guard` is separate from the three cheap gates because it is the EXPENSIVE
|
|
81
|
+
* one: the repository's own cross-cutting test suite. It is here because a
|
|
82
|
+
* guard suite is precisely the gate a module-scoped `targeted_commands` entry
|
|
83
|
+
* cannot stand in for — `tests/shared/audit-tools-path-guard.test.ts` is the
|
|
84
|
+
* live example.
|
|
85
|
+
*/
|
|
86
|
+
export const LANDING_GATE_SCRIPT_NAMES = [
|
|
87
|
+
{
|
|
88
|
+
role: "deadcode",
|
|
89
|
+
refuses: "an exported symbol with zero consumers anywhere, including tests",
|
|
90
|
+
scripts: ["check:deadcode", "check:dead-code", "deadcode", "knip"],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
role: "depgraph",
|
|
94
|
+
refuses: "a module-graph violation — an import cycle, or an upward import out of the shared base layer",
|
|
95
|
+
scripts: ["check:depgraph", "check:dep-graph", "depgraph", "depcruise"],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
role: "glossary",
|
|
99
|
+
refuses: "an opaque identifier used in the source tree that no glossary row documents — the id-glossary gate",
|
|
100
|
+
scripts: [
|
|
101
|
+
"check:invariant-glossary",
|
|
102
|
+
"check:glossary",
|
|
103
|
+
"check:glossary-ids",
|
|
104
|
+
"glossary:check",
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
role: "guard",
|
|
109
|
+
refuses: "a tree-wide invariant the repository's cross-cutting suites assert and no module-scoped command covers",
|
|
110
|
+
scripts: ["verify:guards", "test:guards", "guards", "test:guard"],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
role: "lint",
|
|
114
|
+
refuses: "a lint violation anywhere in the tree",
|
|
115
|
+
scripts: ["check:lint", "lint", "lint:check"],
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
function readPackageScripts(root) {
|
|
119
|
+
const packageJsonPath = join(root, "package.json");
|
|
120
|
+
if (!existsSync(packageJsonPath))
|
|
121
|
+
return null;
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
124
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
125
|
+
return null;
|
|
126
|
+
const scripts = parsed.scripts;
|
|
127
|
+
return scripts !== null && typeof scripts === "object" && !Array.isArray(scripts)
|
|
128
|
+
? scripts
|
|
129
|
+
: null;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Unreadable / malformed package.json: no landing gates. A prepare must not
|
|
133
|
+
// fail because a manifest it does not own is malformed — the same
|
|
134
|
+
// degrade-to-empty rule `discoverProjectCommands` follows.
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** The `npm run <script>` command for a declared script name. */
|
|
139
|
+
function npmRun(script) {
|
|
140
|
+
return `npm run ${script}`;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The repository's landing gates, as runnable command strings, in the
|
|
144
|
+
* vocabulary's declared role order.
|
|
145
|
+
*
|
|
146
|
+
* Pure over `(root)` and deterministic: reads one manifest, emits a
|
|
147
|
+
* content-stable sorted-by-role list, spawns nothing.
|
|
148
|
+
*/
|
|
149
|
+
export function discoverLandingGates(root) {
|
|
150
|
+
const scripts = readPackageScripts(root);
|
|
151
|
+
if (scripts === null)
|
|
152
|
+
return [];
|
|
153
|
+
const commands = [];
|
|
154
|
+
for (const gate of LANDING_GATE_SCRIPT_NAMES) {
|
|
155
|
+
for (const name of gate.scripts) {
|
|
156
|
+
const body = scripts[name];
|
|
157
|
+
if (typeof body === "string" && body.trim().length > 0) {
|
|
158
|
+
commands.push(npmRun(name));
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return commands.sort(compareCodeUnits);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The opaque-identifier family the id-glossary gate scans the source tree for.
|
|
167
|
+
* Anchored to a word boundary at the end too, so a short namespace does not
|
|
168
|
+
* match inside a longer token; and to `INV-` + an uppercase letter start, so a
|
|
169
|
+
* lowercase test-family id (`INV-remediate-state-01`) is not read as a
|
|
170
|
+
* production namespace — the same split `scripts/check-invariant-glossary.mjs`
|
|
171
|
+
* draws.
|
|
172
|
+
*
|
|
173
|
+
* GLOBAL on purpose: {@link declaredInvariantIds} collects EVERY id in a value,
|
|
174
|
+
* so the lastIndex state a `/g` regex carries is reset before each use there.
|
|
175
|
+
*/
|
|
176
|
+
const INVARIANT_ID = /\bINV-[A-Z][A-Z0-9]*(?:-[A-Z][A-Z0-9]*)*\b/gu;
|
|
177
|
+
/**
|
|
178
|
+
* Every invariant id a value DECLARES anywhere it can be nested — a module
|
|
179
|
+
* contract's `invariants`, an obligation slug, or any other string a producer
|
|
180
|
+
* hangs an id on. Walks objects and arrays rather than reading one named field,
|
|
181
|
+
* because a contract's shape is the producer's, not this predicate's.
|
|
182
|
+
*
|
|
183
|
+
* Returns the SET of ids, not a boolean, because the caller has to subtract the
|
|
184
|
+
* ids the glossary already documents: mentioning an existing id is not coining
|
|
185
|
+
* one (see {@link withGlossaryScope}).
|
|
186
|
+
*/
|
|
187
|
+
export function declaredInvariantIds(value) {
|
|
188
|
+
const found = new Set();
|
|
189
|
+
const walk = (node) => {
|
|
190
|
+
if (typeof node === "string") {
|
|
191
|
+
INVARIANT_ID.lastIndex = 0;
|
|
192
|
+
for (const match of node.matchAll(INVARIANT_ID))
|
|
193
|
+
found.add(match[0]);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (Array.isArray(node)) {
|
|
197
|
+
for (const entry of node)
|
|
198
|
+
walk(entry);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (node !== null && typeof node === "object") {
|
|
202
|
+
for (const entry of Object.values(node))
|
|
203
|
+
walk(entry);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
walk(value);
|
|
207
|
+
return found;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Whether a value declares ANY invariant id — the boolean form of
|
|
211
|
+
* {@link declaredInvariantIds}, for a caller that only needs the predicate.
|
|
212
|
+
*/
|
|
213
|
+
export function declaresInvariantId(value) {
|
|
214
|
+
return declaredInvariantIds(value).size > 0;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The one-line statement of what a landing gate command REFUSES, or `null` when
|
|
218
|
+
* the command was not declared as one.
|
|
219
|
+
*
|
|
220
|
+
* Rendered wherever a host is told what its required tests cover, so the
|
|
221
|
+
* sentence stating a gate's authority is written once, beside the vocabulary
|
|
222
|
+
* that declares the gate. `null` for an item's own `targeted_commands`, which
|
|
223
|
+
* are not landing gates and carry no vocabulary entry.
|
|
224
|
+
*/
|
|
225
|
+
export function landingGateRefusal(command) {
|
|
226
|
+
for (const gate of LANDING_GATE_SCRIPT_NAMES) {
|
|
227
|
+
if (gate.scripts.some((name) => npmRun(name) === command)) {
|
|
228
|
+
return `\`${command}\` — refuses ${gate.refuses}`;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* The glossary document a scope must be able to write when it coins an
|
|
235
|
+
* invariant id. Repo-relative, so it composes with `allowed_files` unchanged.
|
|
236
|
+
*
|
|
237
|
+
* ⚠ This is THIS repository's convention, and it is only ever consulted as a
|
|
238
|
+
* CANDIDATE. `remediate-code` runs against arbitrary repositories, so the path
|
|
239
|
+
* being a constant is not a claim that the document exists — a target root that
|
|
240
|
+
* has no such file gets NO widening at all (a content fact, checked by
|
|
241
|
+
* {@link withGlossaryScope}). A tool that widened on the NAME alone would hand
|
|
242
|
+
* an item write scope over a file its repository does not have.
|
|
243
|
+
*/
|
|
244
|
+
export const GLOSSARY_DOCUMENT_PATH = "docs/glossary-ids.md";
|
|
245
|
+
/**
|
|
246
|
+
* The invariant ids the glossary document at `root` already carries, or `null`
|
|
247
|
+
* when the document does not exist there.
|
|
248
|
+
*
|
|
249
|
+
* `null` and an empty set are DIFFERENT answers, and collapsing them is the bug
|
|
250
|
+
* this return type exists to prevent: absent means this repository keeps no
|
|
251
|
+
* glossary document, so nothing can be coined against it and no scope widens;
|
|
252
|
+
* present-and-empty means every id in the contract is new.
|
|
253
|
+
*/
|
|
254
|
+
function documentedInvariantIds(root) {
|
|
255
|
+
const documentPath = join(root, ...GLOSSARY_DOCUMENT_PATH.split("/"));
|
|
256
|
+
if (!existsSync(documentPath))
|
|
257
|
+
return null;
|
|
258
|
+
try {
|
|
259
|
+
return declaredInvariantIds(readFileSync(documentPath, "utf8"));
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Unreadable glossary: "cannot tell which ids are documented". The EMPTY
|
|
263
|
+
// set is the conservative answer — it widens for any declared id, granting
|
|
264
|
+
// only a scope an item's own contract asked for, whereas returning `null`
|
|
265
|
+
// turns a read error into the silent dead-end this function removes.
|
|
266
|
+
return new Set();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Widen a work item's write scope so an item that COINS an invariant id can
|
|
271
|
+
* actually satisfy the id-glossary gate.
|
|
272
|
+
*
|
|
273
|
+
* ── THE FRICTION THIS CLOSES ─────────────────────────────────────────────────
|
|
274
|
+
*
|
|
275
|
+
* The glossary document is outside every module's `file_scope`; the glossary
|
|
276
|
+
* gate scans `src/` for `INV-*` ids and fails on one with no glossary row. So
|
|
277
|
+
* an item that coins an id in `src/` is STRUCTURALLY UNABLE to satisfy the
|
|
278
|
+
* gate: the fix is a glossary edit its write scope forbids, and the red lands
|
|
279
|
+
* silently, discovered by the NEXT item's worker. It happened twice in one
|
|
280
|
+
* session (`INV-SSP-DEFERRED-SET-REPORTED` at CP-NODE-10, and the id the
|
|
281
|
+
* charter-delta parser coined at CP-NODE-18, since retired with that parser) —
|
|
282
|
+
* the "tool_should_decide" friction in `docs/backlog/open-bugs.md`.
|
|
283
|
+
*
|
|
284
|
+
* ── THREE CONDITIONS, EACH NARROWING ─────────────────────────────────────────
|
|
285
|
+
*
|
|
286
|
+
* 1. The document must EXIST in the target root. The path is this
|
|
287
|
+
* repository's convention; an arbitrary target repo may keep none, and
|
|
288
|
+
* widening for a document that is not there grants scope over nothing.
|
|
289
|
+
* 2. The contract must declare at least one id the document does NOT already
|
|
290
|
+
* carry. A contract that merely MENTIONS `INV-COVERAGE` — a seam adjustment
|
|
291
|
+
* citing an existing invariant, a prose reference — coins nothing, and
|
|
292
|
+
* widening for it hands the item a document it has no business editing.
|
|
293
|
+
* Only an id with no row yet is a COIN, because only that id needs one.
|
|
294
|
+
* 3. The scope must not already carry the path (idempotence).
|
|
295
|
+
*
|
|
296
|
+
* The gate itself is bound separately, at the CLOSE — scope without the gate
|
|
297
|
+
* would leave the red silent; the gate without scope would turn it into a
|
|
298
|
+
* dead-end refusal. Both halves are the one decision.
|
|
299
|
+
*
|
|
300
|
+
* Deterministic, stable-ordered and idempotent: a scope that already carries
|
|
301
|
+
* the path is returned unchanged.
|
|
302
|
+
*/
|
|
303
|
+
export function withGlossaryScope(root, allowedFiles, declaredIds) {
|
|
304
|
+
if (declaredIds.size === 0 || allowedFiles.includes(GLOSSARY_DOCUMENT_PATH)) {
|
|
305
|
+
return [...allowedFiles];
|
|
306
|
+
}
|
|
307
|
+
const documented = documentedInvariantIds(root);
|
|
308
|
+
if (documented === null)
|
|
309
|
+
return [...allowedFiles];
|
|
310
|
+
if (![...declaredIds].some((id) => !documented.has(id)))
|
|
311
|
+
return [...allowedFiles];
|
|
312
|
+
return [...allowedFiles, GLOSSARY_DOCUMENT_PATH].sort(compareCodeUnits);
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=landingGates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landingGates.js","sourceRoot":"","sources":["../../../src/shared/tooling/landingGates.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,4 +73,20 @@ export declare function runAdmittedProjectE2eCommand(command: string[], root: st
|
|
|
73
73
|
maxCapturedOutput?: number;
|
|
74
74
|
sigkillGraceMs?: number;
|
|
75
75
|
}): Promise<ProjectTestAdmissionOutcome>;
|
|
76
|
+
/**
|
|
77
|
+
* Run one of the repository's discovered LANDING GATES under the same gate.
|
|
78
|
+
*
|
|
79
|
+
* The landing-gate leg runs at the CLOSE, on the merged tree — see
|
|
80
|
+
* `verifyLandingGates` in `src/remediate/phases/closeVerifyLandingGates.ts`. It
|
|
81
|
+
* is a different role from test/e2e only in what discovery emits: one vector
|
|
82
|
+
* for those, a set of up to five gate commands for this. The admission rule and
|
|
83
|
+
* every spawn bound are the SAME, which is the point — a gate is a discovered
|
|
84
|
+
* project command like any other, and adding a second spawn path for it would
|
|
85
|
+
* be a second place for the shell-safety and output-cap rules to drift.
|
|
86
|
+
*/
|
|
87
|
+
export declare function runAdmittedProjectLandingGateCommand(command: string[], root: string, options?: {
|
|
88
|
+
timeoutMs?: number;
|
|
89
|
+
maxCapturedOutput?: number;
|
|
90
|
+
sigkillGraceMs?: number;
|
|
91
|
+
}): Promise<ProjectTestAdmissionOutcome>;
|
|
76
92
|
//# sourceMappingURL=projectTestAdmission.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectTestAdmission.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/projectTestAdmission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projectTestAdmission.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/projectTestAdmission.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,QAAc,CAAC;AAEnD,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,OAAQ,CAAC;AAEnD;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,QAAkB,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IAC1C,qGAAqG;IACrG,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;CAChB;AA6BD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAErF;AA0HD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,OAAO,CAAC,2BAA2B,CAAC,CAEtC;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,OAAO,CAAC,2BAA2B,CAAC,CAEtC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,OAAO,CAAC,2BAA2B,CAAC,CAEtC"}
|