@warpgogol/forge 4.0.0 → 4.1.2
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/AGENTS.md +18 -3
- package/bin/cli.ts +15 -8
- package/os/adr/adr.module.ts +24 -23
- package/os/adr/index.ts +1 -1
- package/os/audit/audit.module.ts +13 -8
- package/os/audit/index.ts +1 -1
- package/os/compass/compass.module.ts +22 -19
- package/os/core/core.module.ts +842 -864
- package/os/core/handlers/package-health.ts +20 -0
- package/os/core/index.ts +1 -1
- package/os/exploration/exploration.module.ts +19 -16
- package/os/exploration/index.ts +2 -2
- package/os/mission/index.ts +1 -1
- package/os/mission/mission.module.ts +13 -8
- package/os/naming/index.ts +1 -1
- package/os/naming/naming-convention.ts +1 -0
- package/os/naming/naming.module.ts +13 -7
- package/os/notes/index.ts +2 -2
- package/os/notes/notes.module.ts +20 -17
- package/os/plan/index.ts +1 -1
- package/os/plan/plan.module.ts +13 -8
- package/os/plugin/plugin.module.ts +10 -8
- package/os/program/program.module.ts +22 -20
- package/os/rfc/handlers/implement-stamp.ts +17 -1
- package/os/rfc/index.ts +1 -1
- package/os/rfc/rfc-0000-template.md +3 -2
- package/os/rfc/rfc.module.ts +54 -84
- package/os/rfc/types.ts +1 -0
- package/os/session/handlers/metrics-aggregate.ts +208 -0
- package/os/session/handlers/metrics-rfc.ts +339 -0
- package/os/session/handlers/metrics-session.ts +209 -0
- package/os/session/handlers/save.ts +19 -0
- package/os/session/index.ts +16 -1
- package/os/session/session.module.ts +133 -107
- package/os/session/types.ts +99 -0
- package/os/spec/spec.module.ts +28 -29
- package/os/werkstatt/werkstatt.module.ts +12 -9
- package/os/workflow/index.ts +1 -1
- package/os/workflow/workflow.module.ts +18 -12
- package/package.json +3 -1
- package/src/forge-module.ts +24 -10
- package/src/index.ts +12 -12
- package/src/onboarding/scaffold.ts +6 -4
- package/src/tests/metrics-rfc-1053.test.ts +355 -0
- package/src/types/werkstatt-engine-shims.d.ts +126 -48
- package/src/types/werkstatt-shared-shims.d.ts +6 -0
package/AGENTS.md
CHANGED
|
@@ -27,13 +27,22 @@ Packet 000 will add the portable `forge/program@1` control plane under `os/progr
|
|
|
27
27
|
| `forgeAdrModule` | `adr.list`, `adr.create`, `adr.validate`, `adr.archive`, `adr.implement.stamp` | `os/adr/` |
|
|
28
28
|
| `forgePlanModule` | `plan.archive` | `os/plan/` |
|
|
29
29
|
| `forgeAuditModule` | `audit.archive` | `os/audit/` |
|
|
30
|
-
| `forgeSessionModule` | `session.save`, `session.archive`, `session.validate`, `session.list` | `os/session/` |
|
|
30
|
+
| `forgeSessionModule` | `session.save`, `session.archive`, `session.validate`, `session.list`, `metrics.aggregate` | `os/session/` |
|
|
31
31
|
| `forgeMissionModule` | `mission.archive` | `os/mission/` |
|
|
32
32
|
| `forgeExplorationModule` | `exploration.list`, `exploration.show`, `exploration.archive` | `os/exploration/` |
|
|
33
33
|
| `forgeNotesModule` | `note.link.validate`, `note.frontmatter.validate`, `note.orphan.detect` | `os/notes/` |
|
|
34
34
|
| `forgeProgramModule` | `program.packet.validate`, `program.packet.seal`, `program.packet.lease`, `program.packet.complete` | `os/program/` |
|
|
35
35
|
| `forgePluginModule` | `forge.plugin.validate`, `forge.plugin.discover` | `os/plugin/` |
|
|
36
36
|
|
|
37
|
+
## RFC-1053: Skill effectiveness metrics
|
|
38
|
+
|
|
39
|
+
`metrics.aggregate` (RFC-1053) queries and aggregates per-skill effectiveness metrics from `docs/metrics/` YAML files. Metrics are generated at two integration points:
|
|
40
|
+
|
|
41
|
+
- `rfc.implement.stamp` — generates `docs/metrics/rfcs/<rfc-id>.metrics.yaml` after successful stamp (non-fatal on failure).
|
|
42
|
+
- `session.save` — generates `docs/metrics/sessions/<session-id>.metrics.yaml` from parsed ATIF messages (non-fatal on failure).
|
|
43
|
+
|
|
44
|
+
Both generators are best-effort: metrics failures log a warning and never block the primary operation. Agents MUST NOT manually edit `docs/metrics/` files — they are generated artifacts produced by `rfc.implement.stamp` and `session.save`.
|
|
45
|
+
|
|
37
46
|
## Compass contract extension points (RFC-0943)
|
|
38
47
|
|
|
39
48
|
Skill packs MAY declare additional Compass contract blocks beyond the built-in `MODULE_CONTRACT` and `CHANGE_SUMMARY` via `forge.plugin.yaml` `extensionPoints.compass.contract.blocks[]`. Each block spec is declarative data:
|
|
@@ -50,6 +59,8 @@ Skill packs MAY declare additional Compass contract blocks beyond the built-in `
|
|
|
50
59
|
- **Wrap `loadForgeConfig` in try/catch in handlers that run in test workspaces.** `loadForgeConfig` throws when `forge.yaml` does not exist at the workspace root. Handlers that may be called from test workspaces without a `forge.yaml` (e.g. `runCompassValidation`) must guard the call with try/catch and skip pack-dependent logic when config is unavailable.
|
|
51
60
|
- **Register new top-level directories in `NAMING_CONVENTION_IGNORED_TOP_LEVEL`.** When a new top-level directory appears in the repo (e.g. `.adr-locks`, `.devin`, `.forge`, `.rfc-locks`, `patches`, `storage`), add it to `NAMING_CONVENTION_IGNORED_TOP_LEVEL` in `os/naming/naming-convention.ts`. Otherwise `naming.convention.lint` reports "unknown top-level directory" errors.
|
|
52
61
|
- **Add tool-generated/imported/historical dirs to `NAMING_CONVENTION_EXEMPT_DIRS`.** Directories containing tool-generated files (e.g. `docs/performance` with timestamp-based names), imported specification documents (e.g. `docs/specs` with `01-PBP-System-Specification.md`), and archived RFCs (e.g. `docs/rfcs/archive`) should be added to `NAMING_CONVENTION_EXEMPT_DIRS` in `os/naming/naming-convention.ts` to avoid false-positive kebab-case violations on files whose naming is controlled by external tools or conventions.
|
|
62
|
+
- **Use `%s` not `%B` for git log delimiter parsing.** When parsing `git log --format` output with `\x1f`-delimited fields, use `%s` (subject only) instead of `%B` (full body). `%B` includes newlines which break the per-line `split("\x1f")` parsing, causing all entries to be silently skipped. Discovered during RFC-1053 `metrics-rfc.ts` implementation.
|
|
63
|
+
- **Chicken-and-egg with self-referential acceptance probes.** When an RFC's acceptance probe checks for a file that is created by `rfc.implement.stamp` itself (e.g. `docs/metrics/rfcs/<rfc-id>.metrics.yaml`), `rfc.verification.emit` will always report "fail" before stamping because the file doesn't exist yet. Solution: generate the file manually first (e.g. via a node script calling the generator function), re-emit evidence, then stamp. The stamp's `RFC-IMP-06` check requires evidence to be "pass" before proceeding. Discovered during RFC-1053 stamping.
|
|
53
64
|
|
|
54
65
|
## Program packet control plane (RFC-0856)
|
|
55
66
|
|
|
@@ -68,6 +79,8 @@ When archiving terminal artifacts, prefer the `docs.archive` umbrella command ov
|
|
|
68
79
|
|
|
69
80
|
- **RFC-0711: `docs.archive` post-loop `spec.live.merge` step.** After archiving, `docs.archive` scans implemented RFCs with a `liveSpec` frontmatter field and calls `spec.live.merge` for each, creating or updating living feature specs under `docs/specs/live/<domain>.md`. Rejected RFCs with `liveSpec` are skipped. Merge failures are non-fatal — the archive step still completes. Use `--dry-run` to preview merges without writing.
|
|
70
81
|
|
|
82
|
+
- **`rfc.validate --root <file>` does NOT scope validation to a single file.** It validates ALL RFCs in the repo regardless of the `--root` flag. To check specific RFCs, use `--json` with `2>/dev/null` (log lines go to stderr) and filter the `data.violations[]` array by `rfcId`. Discovered during RFC-1035–1038 gap analysis.
|
|
83
|
+
- **`rfc.archive` does NOT accept `--id`.** It archives ALL terminal-status RFCs at once. Available flags: `--dry-run` (preview), `--status <status>` (filter by status). Use `--dry-run` first to verify which files will move. Discovered during RFC-1038 archiving.
|
|
71
84
|
- **Post-rename cleanup for `fs.rename` on watched directories:** When an archive handler uses `fs.rename` to move a directory that an IDE or file watcher is tracking (e.g. mission workpiece with an open `.astro/` cache), the watcher may recreate stale cache at the source path after the rename completes. Always add a post-rename cleanup check using `trashPath` from `utils/fs-trash.ts`: `if (existsSync(sourcePath)) { await trashPath(sourcePath); }` after the `fs.rename` call. See `os/mission/handlers/archive.ts` `moveMissionDir` for the reference implementation.
|
|
72
85
|
|
|
73
86
|
## Pinned-files protection (RFC-0733)
|
|
@@ -86,11 +99,12 @@ The pinned-files protection system prevents accidental deletion, move, or modifi
|
|
|
86
99
|
All Forge stack profiles include portable agent-safety scripts as embedded file content blocks. These scripts protect AI agents from destructive git operations and enforce session-end protocol.
|
|
87
100
|
|
|
88
101
|
- **`scripts/git-guard.sh`** — shell function intercepting `git stash`, `git reset --hard`, `git checkout --`, `git checkout -f`, `git switch -f`, `git clean -f`, `git restore`. Override: `ALLOW_DESTRUCTIVE_GIT=1`. Uses `FORGE_GIT_GUARD` marker (not `WERKSTATT_GIT_GUARD`).
|
|
89
|
-
- **`scripts/setup-git-guards.sh`** — installs git-guard.sh
|
|
102
|
+
- **`scripts/setup-git-guards.sh`** — auto-detects shell (zsh → `~/.zshenv`, bash → `~/.bashrc`) and installs git-guard.sh source line. Supports `install`, `--verify`, `--remove` modes.
|
|
90
103
|
- **`scripts/clean-stale-stashes.sh`** — detects and optionally drops stale git stash entries. Report mode (`--drop` to clean, `--drop-all` for all).
|
|
91
104
|
- **`scripts/check-clean-trees.sh`** — universal dirty-tree checker. Finds all `.git` directories up to 3 levels deep and checks each for dirty state.
|
|
92
105
|
- **`hooks/pre-user-prompt.sh`** — session-end protocol enforcement + stale-stash detection + git-guard verification. Requires `jq`. Exits with code 2 on session-end trigger phrases to inject protocol instructions.
|
|
93
|
-
-
|
|
106
|
+
- **`hooks/pre-user-prompt-wrapper.mjs`** — Node.js cross-platform wrapper called by `.windsurf/hooks.json`. Detects bash availability, prints one-time warning if bash not found (Windows without Git Bash), then delegates to `hooks/pre-user-prompt.sh`.
|
|
107
|
+
- **`.windsurf/hooks.json`** — Windsurf hook registration for `pre_user_prompt`, calls `node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs`.
|
|
94
108
|
- **PREFERENCES.md** generated by `forge init` includes `formOfAddress` field and operational rules: plan confirmation vs implementation, skill invocation tracking, commit granularity, session-end protocol.
|
|
95
109
|
|
|
96
110
|
## Skills
|
|
@@ -174,6 +188,7 @@ RFC-0997 binds acceptance probes to criteria via the `criterion: "AC-N"` field a
|
|
|
174
188
|
- **V-37**: checked criteria evidence SHALL resolve — `probe:AC-N` must reference a criterion with at least one bound probe; `test:<path>` and `<path>:<line>` must reference an existing file. **Evidence annotations MUST NOT contain em-dashes (—) or nested quotes** — the V-37 parser breaks on `test: path — "description"` and reports the file as non-existent. **The `<path>` token MUST be the file path only — no AC-N suffixes, no descriptions, no extra text after the path.** The parser treats everything after `test:` until end-of-parenthesis as the file path; `test: packages/forge/os/rfc/file.test.ts AC-1` is reported as non-existent because the parser looks for a file named `packages/forge/os/rfc/file.test.ts AC-1`. Use simple `(evidence: test:packages/forge/src/tests/file.test.ts)` without em-dashes, nested quotes, or AC-N suffixes. Discovered during RFC-0998 and RFC-0999.
|
|
175
189
|
- **RFC-IMP-08**: `rfc.implement.stamp` blocks stamping for post-cutoff RFCs of kind `architecture`, `contract`, or `command` that declare zero acceptance probes. Policy and deprecation kinds are exempt.
|
|
176
190
|
- **Coverage report**: `rfc.validate --json` and `rfc.acceptance.run` emit a non-blocking `coverage` block per post-cutoff RFC with `totalCriteria`, `probeBackedCriteria`, `coverageRatio`, `uncoveredCriteria`, `unboundProbes`.
|
|
191
|
+
- **`file-contains` probe `pattern` is RegExp, not literal.** The `file-contains` acceptance probe compiles its `pattern` field via `new RegExp(pattern, "m")`. Parentheses, brackets, dots, and other regex metacharacters MUST be escaped (e.g. `\\(RFC-1023\\)` not `(RFC-1023)`). Unescaped parentheses silently fail to match and produce false "pattern not found" results. Discovered during RFC-1023 verification.
|
|
177
192
|
|
|
178
193
|
## RFC criteria content rules: phase separation, reject checklist, criterion versioning (RFC-1006)
|
|
179
194
|
|
package/bin/cli.ts
CHANGED
|
@@ -145,19 +145,26 @@ async function buildRegistry(): Promise<ForgeCliRegistry> {
|
|
|
145
145
|
const registry = new ForgeCliRegistry();
|
|
146
146
|
|
|
147
147
|
const modules: ForgeModule[] = [
|
|
148
|
-
await import("../os/core/core.module.ts").then((m) => m.
|
|
149
|
-
await import("../os/rfc/rfc.module.ts").then((m) => m.
|
|
150
|
-
await import("../os/workflow/workflow.module.ts").then((m) => m.
|
|
151
|
-
await import("../os/naming/naming.module.ts").then((m) => m.
|
|
148
|
+
await import("../os/core/core.module.ts").then((m) => m.createForgeCoreModule()),
|
|
149
|
+
await import("../os/rfc/rfc.module.ts").then((m) => m.createForgeRfcModule()),
|
|
150
|
+
await import("../os/workflow/workflow.module.ts").then((m) => m.createForgeWorkflowModule()),
|
|
151
|
+
await import("../os/naming/naming.module.ts").then((m) => m.createForgeNamingModule()),
|
|
152
152
|
await import("../os/compass/compass.module.ts").then((m) => m.forgeCompassModule),
|
|
153
153
|
await import("../os/werkstatt/werkstatt.module.ts").then((m) => m.forgeWerkstattModule),
|
|
154
|
-
await import("../os/session/session.module.ts").then((m) => m.
|
|
155
|
-
await import("../os/exploration/exploration.module.ts").then((m) =>
|
|
156
|
-
|
|
154
|
+
await import("../os/session/session.module.ts").then((m) => m.createForgeSessionModule()),
|
|
155
|
+
await import("../os/exploration/exploration.module.ts").then((m) =>
|
|
156
|
+
m.createForgeExplorationModule(),
|
|
157
|
+
),
|
|
158
|
+
await import("../os/notes/notes.module.ts").then((m) => m.createForgeNotesModule()),
|
|
157
159
|
].filter((m): m is ForgeModule => m !== null);
|
|
158
160
|
|
|
159
161
|
for (const mod of modules) {
|
|
160
|
-
|
|
162
|
+
for (const cmd of mod.commands) {
|
|
163
|
+
registry.registerCommand(cmd);
|
|
164
|
+
}
|
|
165
|
+
for (const pipe of mod.pipelines) {
|
|
166
|
+
registry.registerPipeline(pipe.name, pipe.steps);
|
|
167
|
+
}
|
|
161
168
|
}
|
|
162
169
|
|
|
163
170
|
return registry;
|
package/os/adr/adr.module.ts
CHANGED
|
@@ -14,18 +14,19 @@
|
|
|
14
14
|
|
|
15
15
|
import type { ForgeModule } from "../../src/forge-module.ts";
|
|
16
16
|
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
version: "0.1.0",
|
|
20
|
-
runtime: "autonomous",
|
|
21
|
-
|
|
22
|
-
async register(registry) {
|
|
23
|
-
const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
|
|
17
|
+
export async function createForgeAdrModule(): Promise<ForgeModule> {
|
|
18
|
+
const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
|
|
24
19
|
const { runAdrValidate } = await import("./handlers/validate.ts");
|
|
25
20
|
const { runAdrArchive } = await import("./handlers/archive.ts");
|
|
26
21
|
const { runAdrImplementStamp } = await import("./handlers/implement-stamp.ts");
|
|
22
|
+
return {
|
|
23
|
+
name: "forge-adr",
|
|
24
|
+
version: "0.1.0",
|
|
25
|
+
runtime: "autonomous",
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
declarations: [],
|
|
28
|
+
commands: [
|
|
29
|
+
{
|
|
29
30
|
name: "adr.list",
|
|
30
31
|
description:
|
|
31
32
|
"List all ADRs. Filter with --status, --scope, --decider flags. " +
|
|
@@ -45,9 +46,8 @@ export const forgeAdrModule: ForgeModule = {
|
|
|
45
46
|
},
|
|
46
47
|
reads: ["docs/adrs/**/*.md"],
|
|
47
48
|
execute: runAdrList,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
registry.registerCommand({
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
51
|
name: "adr.create",
|
|
52
52
|
description:
|
|
53
53
|
"Create a new ADR draft from the template. " +
|
|
@@ -83,9 +83,8 @@ export const forgeAdrModule: ForgeModule = {
|
|
|
83
83
|
},
|
|
84
84
|
},
|
|
85
85
|
execute: runAdrCreate,
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
registry.registerCommand({
|
|
86
|
+
},
|
|
87
|
+
{
|
|
89
88
|
name: "adr.validate",
|
|
90
89
|
contract: "adr",
|
|
91
90
|
rules: [],
|
|
@@ -99,9 +98,8 @@ export const forgeAdrModule: ForgeModule = {
|
|
|
99
98
|
},
|
|
100
99
|
reads: ["docs/adrs/**/*.md"],
|
|
101
100
|
execute: runAdrValidate,
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
registry.registerCommand({
|
|
101
|
+
},
|
|
102
|
+
{
|
|
105
103
|
name: "adr.archive",
|
|
106
104
|
description:
|
|
107
105
|
"Move terminal-status ADR files (implemented, rejected, superseded) into " +
|
|
@@ -125,9 +123,8 @@ export const forgeAdrModule: ForgeModule = {
|
|
|
125
123
|
},
|
|
126
124
|
},
|
|
127
125
|
execute: runAdrArchive,
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
registry.registerCommand({
|
|
126
|
+
},
|
|
127
|
+
{
|
|
131
128
|
name: "adr.implement.stamp",
|
|
132
129
|
description:
|
|
133
130
|
"Atomically transition an ADR from accepted/proposed to implemented. " +
|
|
@@ -156,6 +153,10 @@ export const forgeAdrModule: ForgeModule = {
|
|
|
156
153
|
},
|
|
157
154
|
},
|
|
158
155
|
execute: runAdrImplementStamp,
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
pipelines: [
|
|
159
|
+
|
|
160
|
+
]};
|
|
161
|
+
}
|
|
162
|
+
;
|
package/os/adr/index.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
</CHANGE_SUMMARY>
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
export {
|
|
14
|
+
export { createForgeAdrModule } from "./adr.module.ts";
|
|
15
15
|
export { runAdrList, runAdrCreate } from "./handlers/list-create.ts";
|
|
16
16
|
export { runAdrValidate } from "./handlers/validate.ts";
|
|
17
17
|
export { runAdrArchive } from "./handlers/archive.ts";
|
package/os/audit/audit.module.ts
CHANGED
|
@@ -12,14 +12,15 @@
|
|
|
12
12
|
|
|
13
13
|
import type { ForgeModule } from "../../src/forge-module.ts";
|
|
14
14
|
|
|
15
|
-
export
|
|
15
|
+
export async function createForgeAuditModule(): Promise<ForgeModule> {
|
|
16
|
+
const { runAuditArchive } = await import("./handlers/archive.ts");
|
|
17
|
+
return {
|
|
16
18
|
name: "forge-audit",
|
|
17
19
|
version: "0.1.0",
|
|
18
20
|
runtime: "autonomous",
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
registry.registerCommand({
|
|
21
|
+
declarations: [],
|
|
22
|
+
commands: [
|
|
23
|
+
{
|
|
23
24
|
name: "audit.archive",
|
|
24
25
|
description:
|
|
25
26
|
"Move audit files whose parent RFC has terminal status " +
|
|
@@ -44,6 +45,10 @@ export const forgeAuditModule: ForgeModule = {
|
|
|
44
45
|
},
|
|
45
46
|
},
|
|
46
47
|
execute: runAuditArchive,
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
pipelines: [
|
|
51
|
+
|
|
52
|
+
]};
|
|
53
|
+
}
|
|
54
|
+
;
|
package/os/audit/index.ts
CHANGED
|
@@ -46,8 +46,9 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
46
46
|
name: "forge-compass",
|
|
47
47
|
version: "0.1.0",
|
|
48
48
|
runtime: "autonomous",
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
declarations: [],
|
|
50
|
+
commands: [
|
|
51
|
+
{
|
|
51
52
|
name: "compass.inventory",
|
|
52
53
|
description: "Generate the repository-wide Compass source inventory XML report.",
|
|
53
54
|
scope: "workspace",
|
|
@@ -59,8 +60,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
59
60
|
"services/**/*.{ts,tsx,astro,js,mjs,css,cs,tscn,tres,gd,md}",
|
|
60
61
|
],
|
|
61
62
|
execute: runCompassInventory,
|
|
62
|
-
}
|
|
63
|
-
|
|
63
|
+
},
|
|
64
|
+
{
|
|
64
65
|
name: "compass.validate",
|
|
65
66
|
contract: "compass",
|
|
66
67
|
rules: [],
|
|
@@ -76,8 +77,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
76
77
|
"docs/source-markup.xml",
|
|
77
78
|
],
|
|
78
79
|
execute: runCompassValidation,
|
|
79
|
-
}
|
|
80
|
-
|
|
80
|
+
},
|
|
81
|
+
{
|
|
81
82
|
name: "compass.changesummary.validate",
|
|
82
83
|
contract: "compass",
|
|
83
84
|
rules: [],
|
|
@@ -92,8 +93,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
92
93
|
"services/**/*.{ts,tsx,astro,js,mjs,css,cs,tscn,tres,gd,md}",
|
|
93
94
|
],
|
|
94
95
|
execute: runCompassChangeSummaryValidate,
|
|
95
|
-
}
|
|
96
|
-
|
|
96
|
+
},
|
|
97
|
+
{
|
|
97
98
|
name: "compass.summary.trim",
|
|
98
99
|
description:
|
|
99
100
|
"Deterministically trim CHANGE_SUMMARY blocks: remove boilerplate, cap total items to 30, preserve protected items (RFC-0538).",
|
|
@@ -113,8 +114,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
113
114
|
cacheable: false,
|
|
114
115
|
flags: { ...compassScanFlags },
|
|
115
116
|
execute: runCompassSummaryTrim,
|
|
116
|
-
}
|
|
117
|
-
|
|
117
|
+
},
|
|
118
|
+
{
|
|
118
119
|
name: "compass.audit.plan",
|
|
119
120
|
description:
|
|
120
121
|
"Emit a deterministic work-order of files whose revision has advanced past the threshold since their last Compass audit (RFC-0352). Read-only, no LLM.",
|
|
@@ -134,8 +135,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
134
135
|
"docs/compass-audit-ledger.generated.yaml",
|
|
135
136
|
],
|
|
136
137
|
execute: runCompassAuditPlan,
|
|
137
|
-
}
|
|
138
|
-
|
|
138
|
+
},
|
|
139
|
+
{
|
|
139
140
|
name: "compass.audit.record",
|
|
140
141
|
description:
|
|
141
142
|
"Stamp a file's audit verdict and current revision into the compass-audit ledger (RFC-0352). Mutating.",
|
|
@@ -155,8 +156,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
155
156
|
agent: { kind: "string", description: "Agent identity to record in the ledger." },
|
|
156
157
|
},
|
|
157
158
|
execute: runCompassAuditRecord,
|
|
158
|
-
}
|
|
159
|
-
|
|
159
|
+
},
|
|
160
|
+
{
|
|
160
161
|
name: "compass.audit.baseline",
|
|
161
162
|
description:
|
|
162
163
|
"Seed the compass-audit ledger for every authored file at its current revision with verdict=baseline (RFC-0352). One-time bootstrap.",
|
|
@@ -172,8 +173,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
172
173
|
cacheable: false,
|
|
173
174
|
flags: { ...compassScanFlags },
|
|
174
175
|
execute: runCompassAuditBaseline,
|
|
175
|
-
}
|
|
176
|
-
|
|
176
|
+
},
|
|
177
|
+
{
|
|
177
178
|
name: "compass.audit.validate",
|
|
178
179
|
contract: "compass",
|
|
179
180
|
rules: [],
|
|
@@ -204,6 +205,8 @@ export const forgeCompassModule: ForgeModule = {
|
|
|
204
205
|
description: "Warns by default, fails with --strict",
|
|
205
206
|
},
|
|
206
207
|
},
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
|
|
208
|
+
}
|
|
209
|
+
],
|
|
210
|
+
pipelines: [
|
|
211
|
+
|
|
212
|
+
]};
|