@hassangameryt/freeflow 0.6.0 → 0.7.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -5
- package/README.md +39 -55
- package/capabilities/cognitive-routing/SKILL.md +288 -130
- package/command-surface.json +0 -24
- package/hooks/freeflow-runtime-context.mjs +42 -477
- package/hooks/hooks.json +1 -26
- package/hooks/tests/check-runtime-context-hook.sh +108 -319
- package/package.json +4 -2
- package/pi-extension/dist/cognitive-routing/commands.js +3 -3
- package/pi-extension/dist/cognitive-routing/config.js +16 -20
- package/pi-extension/dist/cognitive-routing/controller.js +478 -48
- package/pi-extension/dist/cognitive-routing/history.js +12 -0
- package/pi-extension/dist/cognitive-routing/host.js +74 -12
- package/pi-extension/dist/cognitive-routing/pi-routing-session.js +414 -0
- package/pi-extension/dist/cognitive-routing/pi-session-control.js +320 -0
- package/pi-extension/dist/cognitive-routing/tool.js +1 -0
- package/pi-extension/dist/cognitive-routing/types.js +1 -1
- package/pi-extension/dist/index.js +236 -219
- package/pi-extension/dist/runtime/runtime-context.js +126 -286
- package/pi-extension/dist/settings/settings-ui.js +52 -336
- package/pi-extension/src/cognitive-routing/commands.ts +15 -5
- package/pi-extension/src/cognitive-routing/config.ts +16 -20
- package/pi-extension/src/cognitive-routing/controller.ts +561 -51
- package/pi-extension/src/cognitive-routing/history.ts +12 -0
- package/pi-extension/src/cognitive-routing/host.ts +110 -16
- package/pi-extension/src/cognitive-routing/pi-routing-session.ts +538 -0
- package/pi-extension/src/cognitive-routing/pi-session-control.ts +444 -0
- package/pi-extension/src/cognitive-routing/tool.ts +1 -0
- package/pi-extension/src/cognitive-routing/types.ts +1 -1
- package/pi-extension/src/index.ts +249 -239
- package/pi-extension/src/runtime/runtime-context.ts +129 -305
- package/pi-extension/src/settings/settings-ui.ts +53 -371
- package/pi-extension/tests/cognitive-routing/commands.test.js +1 -1
- package/pi-extension/tests/cognitive-routing/controller.test.js +69 -40
- package/pi-extension/tests/cognitive-routing/extension-lifecycle.test.js +128 -57
- package/pi-extension/tests/cognitive-routing/pi-normal-lifecycle.test.js +434 -0
- package/pi-extension/tests/cognitive-routing/pi-session-control.test.js +174 -0
- package/pi-extension/tests/cognitive-routing/pi-session-history.test.js +91 -0
- package/pi-extension/tests/cognitive-routing/profile-resolution.test.js +47 -4
- package/pi-extension/tests/integration/mode-free-core.test.js +218 -0
- package/pi-extension/tests/integration/pi-extension.test.js +430 -2478
- package/pi-extension/tests/integration/prompt-architecture.test.js +124 -79
- package/pi-extension/tests/integration/unaffected-regressions.test.js +411 -0
- package/runtime/prompts/cognitive-routing.md +5 -4
- package/runtime/prompts/conversation-history.md +1 -1
- package/runtime/prompts/core.md +77 -6
- package/runtime/prompts/interaction-contract.md +6 -2
- package/skills/action-selection/SKILL.md +93 -44
- package/skills/action-selection/references/trajectory-stalls.md +71 -0
- package/skills/bypass/SKILL.md +109 -39
- package/skills/commit-work/SKILL.md +94 -55
- package/skills/commit-work/references/git-state-edges.md +94 -0
- package/skills/commit-work/references/simple-push.md +92 -0
- package/skills/commit-work/references/staging-decisions.md +79 -46
- package/skills/decision-gate/SKILL.md +80 -22
- package/skills/design-for-depth/SKILL.md +208 -43
- package/skills/design-for-depth/references/design-pressure-signals.md +108 -240
- package/skills/design-for-depth/references/interface-design-loop.md +77 -97
- package/skills/design-for-depth/references/module-and-dependency-design.md +147 -0
- package/skills/design-for-depth/references/software-design-philosophy.md +127 -173
- package/skills/design-for-depth/references/state-and-failure-boundaries.md +136 -0
- package/skills/diagnose-failure/SKILL.md +198 -52
- package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +19 -5
- package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +13 -5
- package/skills/discuss/SKILL.md +118 -76
- package/skills/discuss/references/discussion-continuity.md +84 -32
- package/skills/evaluate-skill/SKILL.md +166 -52
- package/skills/evaluate-skill/references/evaluation-definition-schema.md +2 -2
- package/skills/evaluate-skill/references/evaluation-design.md +56 -30
- package/skills/evaluate-skill/references/execution-and-evidence.md +1 -1
- package/skills/evaluate-skill/references/review-and-revision.md +62 -21
- package/skills/execute-work/SKILL.md +98 -59
- package/skills/execute-work/references/code-practices.md +4 -4
- package/skills/execute-work/references/execute-work-edges.md +42 -22
- package/skills/review-artifact/SKILL.md +132 -71
- package/skills/review-artifact/references/adjudicate-artifact-review.md +101 -0
- package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +52 -41
- package/skills/review-work/SKILL.md +115 -72
- package/skills/review-work/references/adjudicate-work-review.md +97 -0
- package/skills/review-work/references/independent-work-reviewer-contract.md +40 -35
- package/skills/review-work/references/security-risk-lens.md +17 -15
- package/skills/setup-freeflow/SKILL.md +14 -17
- package/skills/setup-freeflow/references/activation-contract.md +24 -30
- package/skills/setup-freeflow/references/host-setup.md +6 -7
- package/skills/simplify-code/SKILL.md +97 -39
- package/skills/simplify-code/references/simplification-patterns.md +1 -1
- package/skills/tdd/SKILL.md +108 -41
- package/skills/tdd/references/test-design.md +1 -1
- package/skills/track-work/SKILL.md +133 -300
- package/skills/track-work/references/working-record-format.md +515 -0
- package/skills/track-work/scripts/lib/document.mjs +713 -0
- package/skills/track-work/scripts/lib/format.mjs +166 -0
- package/skills/track-work/scripts/lib/store.mjs +233 -0
- package/skills/track-work/scripts/lib/transitions.mjs +790 -0
- package/skills/track-work/scripts/lib/views.mjs +27 -430
- package/skills/track-work/scripts/working-record.mjs +292 -98
- package/skills/verify-work/SKILL.md +46 -20
- package/skills/verify-work/references/browser-runtime-evidence.md +1 -1
- package/skills/verify-work/references/integration-evidence.md +1 -7
- package/skills/verify-work/references/performance-evidence.md +1 -1
- package/skills/workflow/SKILL.md +110 -80
- package/skills/workflow/references/domain-skill-composition.md +24 -18
- package/skills/write-skill/SKILL.md +218 -62
- package/skills/write-skill/references/activation-boundaries.md +63 -21
- package/skills/write-skill/references/agent-first-instructions.md +61 -27
- package/skills/write-skill/references/progressive-disclosure.md +91 -41
- package/skills/write-skill/references/skill-dependency-graphs.md +190 -0
- package/runtime/prompts/skills.md +0 -65
- package/skills/mode-contract/SKILL.md +0 -104
- package/skills/track-work/scripts/lib/codec.mjs +0 -570
- package/skills/track-work/scripts/lib/commands.mjs +0 -568
- package/skills/track-work/scripts/lib/contract.mjs +0 -303
- package/skills/track-work/scripts/lib/model.mjs +0 -506
- package/skills/track-work/scripts/lib/operations.mjs +0 -965
- package/skills/track-work/scripts/lib/record-store.mjs +0 -264
- package/skills/track-work/scripts/lib/result.mjs +0 -37
- package/skills/track-work/scripts/lib/rewrites.mjs +0 -740
- package/skills/track-work/scripts/lib/schema.mjs +0 -277
- package/skills/track-work/scripts/lib/source-inventory.mjs +0 -162
- package/skills/track-work/scripts/lib/workspace.mjs +0 -134
|
@@ -1,122 +1,316 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
4
|
+
import { cwd } from "node:process";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
import { canonicalLines, joinLines, slugify, TASK_STATES } from "./lib/format.mjs";
|
|
7
|
+
import { parseDocument, validateDocument } from "./lib/document.mjs";
|
|
8
|
+
import { runTransition } from "./lib/transitions.mjs";
|
|
9
|
+
import {
|
|
10
|
+
createRecordPath,
|
|
11
|
+
displayPath,
|
|
12
|
+
readInput,
|
|
13
|
+
readRecord,
|
|
14
|
+
resolveRecordPath,
|
|
15
|
+
writeInitialAtomically,
|
|
16
|
+
} from "./lib/store.mjs";
|
|
17
|
+
import { renderFull, renderResume } from "./lib/views.mjs";
|
|
9
18
|
|
|
10
|
-
function
|
|
11
|
-
|
|
19
|
+
function usage() {
|
|
20
|
+
return [
|
|
21
|
+
"Usage:",
|
|
22
|
+
" working-record.mjs init --root <path> --name <task name> [--input <file|->]",
|
|
23
|
+
" working-record.mjs view resume|full --record <record.md>",
|
|
24
|
+
" working-record.mjs validate --record <record.md>",
|
|
25
|
+
" working-record.mjs <slice|checkpoint|decision|task> <operation> ...",
|
|
26
|
+
].join("\n");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const COMMAND_HELP = new Map([
|
|
30
|
+
[
|
|
31
|
+
"slice",
|
|
32
|
+
[
|
|
33
|
+
"Usage: working-record.mjs slice <operation> ...",
|
|
34
|
+
"Operations: slice propose, slice start, slice start-direct, slice pause, slice resume, slice close, slice reopen.",
|
|
35
|
+
"Run working-record.mjs <group> <operation> --help for options and input fields.",
|
|
36
|
+
"Use --input - to read Markdown fragments from stdin.",
|
|
37
|
+
].join("\n"),
|
|
38
|
+
],
|
|
39
|
+
[
|
|
40
|
+
"checkpoint",
|
|
41
|
+
[
|
|
42
|
+
"Usage: working-record.mjs checkpoint <operation> ...",
|
|
43
|
+
"Operations: checkpoint propose, checkpoint activate, checkpoint defer, checkpoint resume, checkpoint close.",
|
|
44
|
+
"Run working-record.mjs <group> <operation> --help for options and input fields.",
|
|
45
|
+
"Use --input - to read Markdown fragments from stdin.",
|
|
46
|
+
].join("\n"),
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
"decision",
|
|
50
|
+
[
|
|
51
|
+
"Usage: working-record.mjs decision <operation> ...",
|
|
52
|
+
"Operations: decision add, decision supersede, decision retire.",
|
|
53
|
+
"Run working-record.mjs <group> <operation> --help for options and input fields.",
|
|
54
|
+
"Use --input - to read Markdown fragments from stdin.",
|
|
55
|
+
].join("\n"),
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"task",
|
|
59
|
+
[
|
|
60
|
+
"Usage: working-record.mjs task <operation> ...",
|
|
61
|
+
"Operations: task set-state.",
|
|
62
|
+
"Run working-record.mjs <group> <operation> --help for options and input fields.",
|
|
63
|
+
].join("\n"),
|
|
64
|
+
],
|
|
65
|
+
[
|
|
66
|
+
"init",
|
|
67
|
+
"Usage: init --root <path> --name <task name> [--state <state>] [--input <file|->]\nInput: Goal and Next useful action required; the seven Current Context headings are accepted. Use --input - to read Markdown fragments from stdin.",
|
|
68
|
+
],
|
|
69
|
+
["view", "Usage: view resume|full --record <record.md>"],
|
|
70
|
+
["validate", "Usage: validate --record <record.md>"],
|
|
71
|
+
[
|
|
72
|
+
"slice propose",
|
|
73
|
+
"Usage: slice propose --record <record.md> --title <title> --input <file|->\nInput: Intended result required; Type, Expected evidence, and Dependencies optional. Use --input - to read the fragment from stdin.",
|
|
74
|
+
],
|
|
75
|
+
[
|
|
76
|
+
"slice start",
|
|
77
|
+
"Usage: slice start --record <record.md> --title <proposal title> --next-action <text> --input <file|->\nInput: Authority source, Scope, Expected evidence, Stop condition, and Starting state required. Use --input - to read the fragment from stdin.",
|
|
78
|
+
],
|
|
79
|
+
[
|
|
80
|
+
"slice start-direct",
|
|
81
|
+
"Usage: slice start-direct --record <record.md> --title <title> --next-action <text> --input <file|->\nInput: Intended result, Authority source, Scope, Expected evidence, Stop condition, and Starting state required; Future Work is unchanged. Use --input - to read the fragment from stdin.",
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
"slice pause",
|
|
85
|
+
"Usage: slice pause --record <record.md> --reason <reason> --resume-when <condition> --next-action <text>",
|
|
86
|
+
],
|
|
87
|
+
["slice resume", "Usage: slice resume --record <record.md> --resolution <source> --next-action <text>"],
|
|
88
|
+
[
|
|
89
|
+
"slice close",
|
|
90
|
+
"Usage: slice close --record <record.md> --state <completed|blocked|abandoned> --next-action <text> --input <file|->\nInput: Result, Evidence and limits, and Task effect required. Use --input - to read the fragment from stdin.",
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
"slice reopen",
|
|
94
|
+
"Usage: slice reopen --record <record.md> --id <S-NNN> --next-action <text> --input <file|->\nInput: fresh Authority source, Scope, Expected evidence, Stop condition, and Starting state required. Use --input - to read the fragment from stdin.",
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
"checkpoint propose",
|
|
98
|
+
"Usage: checkpoint propose --record <record.md> --title <title> --input <file|->\nInput: Type, Condition, and Applies to required. Use --input - to read the fragment from stdin.",
|
|
99
|
+
],
|
|
100
|
+
[
|
|
101
|
+
"checkpoint activate",
|
|
102
|
+
"Usage: checkpoint activate --record <record.md> --title <proposal title> [--next-action <text>]",
|
|
103
|
+
],
|
|
104
|
+
["checkpoint defer", "Usage: checkpoint defer --record <record.md> --id <C-NNN> [--next-action <text>]"],
|
|
105
|
+
["checkpoint resume", "Usage: checkpoint resume --record <record.md> --id <C-NNN> [--next-action <text>]"],
|
|
106
|
+
[
|
|
107
|
+
"checkpoint close",
|
|
108
|
+
"Usage: checkpoint close --record <record.md> --id <C-NNN> --state <completed|cancelled|replaced> [--next-action <text>] --input <file|->\nInput: Result and Task effect required; Evidence optional; Reason required for cancelled or replaced; Replaced by required for replaced. Use --input - to read the fragment from stdin.",
|
|
109
|
+
],
|
|
110
|
+
[
|
|
111
|
+
"decision add",
|
|
112
|
+
"Usage: decision add --record <record.md> --title <title> --input <file|->\nInput: Decision, Established by, Rationale, Consequences, and Revisit when required; Source references optional. Use --input - to read the fragment from stdin.",
|
|
113
|
+
],
|
|
114
|
+
[
|
|
115
|
+
"decision supersede",
|
|
116
|
+
"Usage: decision supersede --record <record.md> --id <D-NNN> --title <title> --input <file|->\nInput: Decision, Established by, Rationale, Consequences, and Revisit when required; Source references optional. Use --input - to read the fragment from stdin.",
|
|
117
|
+
],
|
|
118
|
+
["decision retire", "Usage: decision retire --record <record.md> --id <D-NNN> --reason <reason>"],
|
|
119
|
+
[
|
|
120
|
+
"task set-state",
|
|
121
|
+
"Usage: task set-state --record <record.md> --state <active|paused|completed|abandoned> --next-action <text>",
|
|
122
|
+
],
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
function commandHelp(command, operation) {
|
|
126
|
+
return `${COMMAND_HELP.get([command, operation].filter(Boolean).join(" ")) ?? COMMAND_HELP.get(command) ?? usage()}\n`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
class CliError extends Error {
|
|
130
|
+
constructor(message, exitCode = 1) {
|
|
131
|
+
super(message);
|
|
132
|
+
this.name = "CliError";
|
|
133
|
+
this.exitCode = exitCode;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function parseOptions(args) {
|
|
12
138
|
const options = {};
|
|
13
|
-
const
|
|
139
|
+
const positionals = [];
|
|
14
140
|
for (let index = 0; index < args.length; index += 1) {
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
17
|
-
positionals.push(
|
|
141
|
+
const token = args[index];
|
|
142
|
+
if (!token.startsWith("--")) {
|
|
143
|
+
positionals.push(token);
|
|
18
144
|
continue;
|
|
19
145
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (flags.has(key)) {
|
|
24
|
-
options[key] = true;
|
|
25
|
-
if (equals >= 0) fail("invalid-option", `${key} does not accept a value`);
|
|
146
|
+
if (options[token] !== undefined) throw new CliError(`Duplicate option: ${token}`);
|
|
147
|
+
if (token === "--help") {
|
|
148
|
+
options[token] = true;
|
|
26
149
|
continue;
|
|
27
150
|
}
|
|
28
|
-
const value =
|
|
29
|
-
if (value === undefined || value.startsWith("--"))
|
|
30
|
-
options[
|
|
151
|
+
const value = args[index + 1];
|
|
152
|
+
if (value === undefined || value.startsWith("--")) throw new CliError(`Missing value for ${token}`);
|
|
153
|
+
options[token] = value;
|
|
154
|
+
index += 1;
|
|
31
155
|
}
|
|
32
|
-
return {
|
|
156
|
+
return { options, positionals };
|
|
33
157
|
}
|
|
34
|
-
function usage() {
|
|
35
|
-
return `Usage: node skills/track-work/scripts/working-record.mjs <command> [options]
|
|
36
158
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
159
|
+
function allowedOptions(command, operation) {
|
|
160
|
+
const common = new Set(["--root", "--record", "--input", "--help"]);
|
|
161
|
+
const withNextAction = new Set([...common, "--next-action"]);
|
|
162
|
+
if (command === "init") return new Set(["--root", "--name", "--state", "--input", "--help"]);
|
|
163
|
+
if (command === "view") return new Set(["--root", "--record", "--view", "--help"]);
|
|
164
|
+
if (command === "validate") return new Set(["--root", "--record", "--help"]);
|
|
165
|
+
if (command === "slice") {
|
|
166
|
+
if (operation === "propose") return new Set([...common, "--title"]);
|
|
167
|
+
if (operation === "start" || operation === "start-direct") return new Set([...withNextAction, "--title"]);
|
|
168
|
+
if (operation === "pause") return new Set([...withNextAction, "--reason", "--resume-when"]);
|
|
169
|
+
if (operation === "resume") return new Set([...withNextAction, "--resolution"]);
|
|
170
|
+
if (operation === "close") return new Set([...withNextAction, "--state"]);
|
|
171
|
+
if (operation === "reopen") return new Set([...withNextAction, "--id", "--title"]);
|
|
172
|
+
}
|
|
173
|
+
if (command === "checkpoint") {
|
|
174
|
+
if (operation === "propose") return new Set([...common, "--title"]);
|
|
175
|
+
if (operation === "activate") return new Set([...withNextAction, "--title"]);
|
|
176
|
+
if (operation === "defer" || operation === "resume") return new Set([...withNextAction, "--id"]);
|
|
177
|
+
if (operation === "close") return new Set([...withNextAction, "--id", "--state"]);
|
|
178
|
+
}
|
|
179
|
+
if (command === "decision") {
|
|
180
|
+
if (operation === "add") return new Set([...common, "--title"]);
|
|
181
|
+
if (operation === "supersede") return new Set([...common, "--id", "--title"]);
|
|
182
|
+
if (operation === "retire") return new Set(["--root", "--record", "--id", "--reason", "--input", "--help"]);
|
|
183
|
+
}
|
|
184
|
+
if (command === "task" && operation === "set-state")
|
|
185
|
+
return new Set(["--root", "--record", "--state", "--next-action", "--help"]);
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
52
188
|
|
|
53
|
-
|
|
54
|
-
|
|
189
|
+
function validateCommandOptions(command, operation, options) {
|
|
190
|
+
const allowed = allowedOptions(command, operation);
|
|
191
|
+
if (!allowed) throw new CliError(`Unknown command: ${command}${operation ? ` ${operation}` : ""}`);
|
|
192
|
+
for (const name of Object.keys(options)) {
|
|
193
|
+
if (!allowed.has(name))
|
|
194
|
+
throw new CliError(`Unknown option ${name} for ${command}${operation ? ` ${operation}` : ""}`);
|
|
195
|
+
}
|
|
55
196
|
}
|
|
56
197
|
|
|
57
|
-
|
|
198
|
+
function requireOption(options, name) {
|
|
199
|
+
const value = options[name];
|
|
200
|
+
if (!value) throw new CliError(`Missing required option: ${name}`);
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
58
203
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
204
|
+
function rootOption(options) {
|
|
205
|
+
return options["--root"] ?? cwd();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function initialContent(skeletonLines, input) {
|
|
209
|
+
if (!input.trim()) return joinLines(skeletonLines, "\n");
|
|
210
|
+
const inputLines = input.replace(/\r\n?/g, "\n").split("\n");
|
|
211
|
+
const targets = new Map();
|
|
212
|
+
const names = [
|
|
213
|
+
"Goal",
|
|
214
|
+
"What defines this task",
|
|
215
|
+
"Settled",
|
|
216
|
+
"Tentative",
|
|
217
|
+
"Open",
|
|
218
|
+
"Current direction",
|
|
219
|
+
"Boundaries",
|
|
220
|
+
"Next useful action",
|
|
221
|
+
];
|
|
222
|
+
const allowed = new Set(names);
|
|
223
|
+
for (let index = 0; index < inputLines.length; index += 1) {
|
|
224
|
+
const levelThree = /^### (.+?)\s*$/.exec(inputLines[index]);
|
|
225
|
+
if (levelThree) {
|
|
226
|
+
const name = levelThree[1];
|
|
227
|
+
if (!allowed.has(name)) throw new CliError(`Unknown initialization heading: ${name}`);
|
|
228
|
+
if (targets.has(name)) throw new CliError(`Duplicate initialization heading: ${name}`);
|
|
229
|
+
const content = [];
|
|
230
|
+
for (let next = index + 1; next < inputLines.length; next += 1) {
|
|
231
|
+
if (/^### /.test(inputLines[next]) || /^## /.test(inputLines[next])) break;
|
|
232
|
+
content.push(inputLines[next]);
|
|
233
|
+
}
|
|
234
|
+
targets.set(name, content);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (/^## /.test(inputLines[index])) throw new CliError(`Unknown initialization heading: ${inputLines[index]}`);
|
|
69
238
|
}
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
239
|
+
const output = [...skeletonLines];
|
|
240
|
+
for (const name of names) {
|
|
241
|
+
const content = targets.get(name);
|
|
242
|
+
if (!content) continue;
|
|
243
|
+
const headingIndex = output.findIndex((line) => line === `### ${name}`);
|
|
244
|
+
if (headingIndex < 0) continue;
|
|
245
|
+
let end = headingIndex + 1;
|
|
246
|
+
while (end < output.length && !/^### |^## /.test(output[end])) end += 1;
|
|
247
|
+
const trimmed = [...content];
|
|
248
|
+
while (trimmed.length && trimmed[0].trim() === "") trimmed.shift();
|
|
249
|
+
while (trimmed.length && trimmed[trimmed.length - 1].trim() === "") trimmed.pop();
|
|
250
|
+
output.splice(headingIndex + 1, end - headingIndex - 1, "", ...trimmed, "");
|
|
81
251
|
}
|
|
82
|
-
|
|
83
|
-
else if (result.status === "failed") process.exitCode = 1;
|
|
252
|
+
return joinLines(output, "\n");
|
|
84
253
|
}
|
|
85
254
|
|
|
86
|
-
|
|
255
|
+
async function initialize(options) {
|
|
256
|
+
const root = rootOption(options);
|
|
257
|
+
const name = requireOption(options, "--name");
|
|
258
|
+
const state = options["--state"] ?? "active";
|
|
259
|
+
if (!TASK_STATES.has(state)) throw new CliError(`Invalid task state: ${state}`);
|
|
260
|
+
const input = await readInput(options["--input"], cwd());
|
|
261
|
+
const text = initialContent(canonicalLines(name, state), input);
|
|
262
|
+
parseDocument(text);
|
|
263
|
+
const created = await createRecordPath(root, name, slugify(name));
|
|
87
264
|
try {
|
|
88
|
-
await
|
|
265
|
+
await writeInitialAtomically(root, created.path, text);
|
|
89
266
|
} catch (error) {
|
|
90
|
-
if (error
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
267
|
+
if (error?.exitCode !== 2) await rm(dirname(created.path), { recursive: true, force: true }).catch(() => undefined);
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
270
|
+
return `${created.path}\n`;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function readExisting(options) {
|
|
274
|
+
const root = rootOption(options);
|
|
275
|
+
const recordOption = requireOption(options, "--record");
|
|
276
|
+
const loaded = await readRecord(root, resolveRecordPath(root, recordOption));
|
|
277
|
+
return { root, ...loaded };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async function runCore(command, rest) {
|
|
281
|
+
const { options, positionals } = parseOptions(rest);
|
|
282
|
+
const operation = positionals[0];
|
|
283
|
+
if (options["--help"]) return commandHelp(command, operation);
|
|
284
|
+
validateCommandOptions(command, operation, options);
|
|
285
|
+
if (command === "init") return initialize(options);
|
|
286
|
+
if (command === "view") {
|
|
287
|
+
if (positionals.length > 1) throw new CliError("View accepts only resume or full");
|
|
288
|
+
const view = positionals[0] ?? options["--view"];
|
|
289
|
+
if (!view || !["resume", "full"].includes(view)) throw new CliError("View must be resume or full");
|
|
290
|
+
const loaded = await readExisting(options);
|
|
291
|
+
if (view === "full") return renderFull(loaded.text);
|
|
292
|
+
return renderResume(loaded.text);
|
|
293
|
+
}
|
|
294
|
+
if (command === "validate") {
|
|
295
|
+
if (positionals.length) throw new CliError("Validate does not accept positional arguments");
|
|
296
|
+
const loaded = await readExisting(options);
|
|
297
|
+
validateDocument(parseDocument(loaded.text));
|
|
298
|
+
return `valid\n${displayPath(loaded.root, loaded.path)}\n`;
|
|
299
|
+
}
|
|
300
|
+
if (positionals.length !== 1) throw new CliError(`Expected one operation for ${command}`);
|
|
301
|
+
const loaded = await readExisting(options);
|
|
302
|
+
const input = await readInput(options["--input"], cwd());
|
|
303
|
+
return runTransition(command, positionals, options, input, loaded);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
try {
|
|
307
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
308
|
+
if (!command || command === "--help" || command === "help") {
|
|
309
|
+
process.stdout.write(`${usage()}\n`);
|
|
310
|
+
} else {
|
|
311
|
+
process.stdout.write(await runCore(command, rest));
|
|
121
312
|
}
|
|
313
|
+
} catch (error) {
|
|
314
|
+
process.stderr.write(`Error: ${error.message}\n`);
|
|
315
|
+
process.exitCode = error.exitCode ?? 1;
|
|
122
316
|
}
|
|
@@ -11,7 +11,7 @@ Verification is factual: what ran, what happened, and what that result proves. T
|
|
|
11
11
|
|
|
12
12
|
## Name The Claim
|
|
13
13
|
|
|
14
|
-
State the claim before choosing the check. Include the behavior or property and the boundary where it must hold.
|
|
14
|
+
State the claim before choosing the check. Include the behavior or property and the boundary where it must hold. Keep this compact when both are obvious; do not let an available check silently narrow a broader claim.
|
|
15
15
|
|
|
16
16
|
Claims may concern:
|
|
17
17
|
|
|
@@ -22,21 +22,21 @@ Claims may concern:
|
|
|
22
22
|
- performance or resource bounds;
|
|
23
23
|
- artifact completeness or repository state.
|
|
24
24
|
|
|
25
|
-
Do not let an available check silently narrow a broader claim.
|
|
26
|
-
|
|
27
25
|
## Choose Evidence That Can Disagree
|
|
28
26
|
|
|
29
27
|
Use the smallest direct evidence that can falsify the claim. Evidence must be fresh for the code, configuration, environment, and artifact being assessed.
|
|
30
28
|
|
|
31
|
-
Verification inherits the current authority envelope. Existing evidence may be inspected without a new run. Run a new active check only when that envelope covers it directly or as contained verification; otherwise return its purpose, expected evidence, and stop condition to Workflow and wait.
|
|
29
|
+
Verification inherits the current authority envelope. Existing evidence may be inspected without a new run. Run a new active check only when that envelope covers it directly or as contained verification; otherwise return its purpose, expected evidence, and stop condition to [Workflow](../../skills/workflow/SKILL.md) and wait.
|
|
30
|
+
|
|
31
|
+
Verify Work owns the claim and required evidence boundary. When several covered observers can falsify the same claim, or the likely check is broad, use [Action Selection](../../skills/action-selection/SKILL.md) to choose and bound one environment interaction. It returns the observation; Verify Work interprets and classifies support. Skip it when one exact check is already selected.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Before running covered checks concurrently, compare what each may write or remove. Run checks serially when they share generated directories, caches, build outputs, package roots, fixture state, ports, databases, or intentional stale-artifact files. A concurrency-induced red signal is orchestration evidence, not automatically an implementation defect; reproduce it under a non-overlapping or serial schedule before changing production code.
|
|
34
34
|
|
|
35
35
|
Passing tests do not prove behavior they do not exercise. A happy path does not prove failure handling. Source inspection does not prove runtime execution. A helper call does not prove registration, host dispatch, or installed-package behavior.
|
|
36
36
|
|
|
37
37
|
Before selecting or running evidence:
|
|
38
38
|
|
|
39
|
-
- read [integration evidence](references/integration-evidence.md) when a claim depends on a registered callback or executor, host lifecycle, producer invocation, fallback protocol, installed package, absence counter
|
|
39
|
+
- read [integration evidence](references/integration-evidence.md) when a claim depends on a registered callback or executor, host lifecycle, producer invocation, fallback protocol, installed package, or absence counter;
|
|
40
40
|
- read [browser runtime evidence](references/browser-runtime-evidence.md) when a claim depends on rendered UI, browser behavior, accessibility, client networking, console state, visual output, or browser runtime performance;
|
|
41
41
|
- read [performance evidence](references/performance-evidence.md) when verifying latency, throughput, memory, CPU, bundle, query, rendering, capacity, or resource-regression claims.
|
|
42
42
|
|
|
@@ -50,25 +50,28 @@ Once the selected check is authorized:
|
|
|
50
50
|
|
|
51
51
|
1. Run the complete selected check.
|
|
52
52
|
2. Read the relevant output, exit status, and lower-level evidence that can contradict a summary.
|
|
53
|
-
3. Confirm the intended success or failure path
|
|
54
|
-
4.
|
|
55
|
-
5.
|
|
56
|
-
6.
|
|
53
|
+
3. Confirm the defined assertion and intended success or failure path were exercised.
|
|
54
|
+
4. Confirm the observing boundary actually matched the claim.
|
|
55
|
+
5. Compare the observation with the exact claim and source requirement.
|
|
56
|
+
6. Preserve contradictory evidence; do not rerun until an unfavorable result disappears.
|
|
57
|
+
7. State unavailable, stale, partial, or reduced-fidelity evidence honestly.
|
|
57
58
|
|
|
58
59
|
Do not convert missing evidence into zero, safe, passed, or probably correct. If the user skips a check, respect that choice and leave the corresponding claim unverified.
|
|
59
60
|
|
|
60
|
-
Do not change implementation, tests, checks,
|
|
61
|
+
Do not change implementation, tests, checks, Specs, policies, or acceptance merely to make the signal green. When the cause of a contradiction is unclear, report the contradiction rather than inventing one.
|
|
61
62
|
|
|
62
63
|
## Classify The Result
|
|
63
64
|
|
|
64
65
|
Keep check execution separate from claim support.
|
|
65
66
|
|
|
66
|
-
**Check result
|
|
67
|
+
**Check result** is relative to the check's defined assertion—not whether the target operation happened to succeed or fail:
|
|
67
68
|
|
|
68
|
-
- **Passed:** the check
|
|
69
|
-
- **Failed:** the check
|
|
70
|
-
- **Error:** the
|
|
71
|
-
- **Unavailable:** the required check could not be
|
|
69
|
+
- **Passed:** the check executed validly and its defined assertion held.
|
|
70
|
+
- **Failed:** the check executed validly and its defined assertion did not hold.
|
|
71
|
+
- **Error:** the observing mechanism or check execution was invalid.
|
|
72
|
+
- **Unavailable:** the required check could not be attempted safely or reliably.
|
|
73
|
+
|
|
74
|
+
A check can Pass while intentionally observing rejection, failure, rollback, or fail-closed behavior.
|
|
72
75
|
|
|
73
76
|
**Claim result:**
|
|
74
77
|
|
|
@@ -77,11 +80,34 @@ Keep check execution separate from claim support.
|
|
|
77
80
|
- **Inconclusive:** evidence exists but cannot establish or refute the claim at the required boundary.
|
|
78
81
|
- **Unavailable:** the required evidence cannot currently be obtained safely or reliably.
|
|
79
82
|
|
|
80
|
-
A
|
|
83
|
+
A Passed check may still leave the claim Inconclusive. A Failed check may expose an implementation defect, an invalid expectation, an environment problem, or a source conflict; classify only what evidence supports.
|
|
84
|
+
|
|
85
|
+
When contradictory evidence is unexplained or failure repeats, read [Diagnose Failure](../../skills/diagnose-failure/SKILL.md). When evidence exposes a user-owned decision or source conflict, read [Decision Gate](../../skills/decision-gate/SKILL.md).
|
|
86
|
+
|
|
87
|
+
## Return Evidence To Review
|
|
88
|
+
|
|
89
|
+
When verification answers a review **Needs evidence** item, preserve the original review-item pointer, claim, required observing boundary, available evidence and prior limit, and why the gap affects review judgment.
|
|
90
|
+
|
|
91
|
+
Return the verification result to the receiving agent for adjudication:
|
|
92
|
+
|
|
93
|
+
- **Supported:** the factual gap may be resolved; do not infer review Pass.
|
|
94
|
+
- **Contradicted:** the finding may be established, invalidated, or expose a source conflict; do not classify the review item here.
|
|
95
|
+
- **Inconclusive:** the review item remains Open when the gap is material.
|
|
96
|
+
- **Unavailable:** the review item remains Open and the observing limitation must remain explicit.
|
|
81
97
|
|
|
82
|
-
|
|
98
|
+
Verification does not revise the independent review report, adjudicate findings, authorize correction, or select follow-up review.
|
|
99
|
+
|
|
100
|
+
## Report Proportionately
|
|
101
|
+
|
|
102
|
+
For one straightforward Supported claim with an obvious check and boundary, use the compact form:
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
Claim @ required boundary: Supported ([check result]) by [evidence].
|
|
106
|
+
Proves:
|
|
107
|
+
Does not prove:
|
|
108
|
+
```
|
|
83
109
|
|
|
84
|
-
|
|
110
|
+
Use the full form when the result is Contradicted, Inconclusive, or Unavailable; several claims or boundaries are involved; evidence conflicts; the claim is consequential; or the result returns to review adjudication:
|
|
85
111
|
|
|
86
112
|
```text
|
|
87
113
|
Claim:
|
|
@@ -94,4 +120,4 @@ Does not prove:
|
|
|
94
120
|
Required next evidence:
|
|
95
121
|
```
|
|
96
122
|
|
|
97
|
-
Omit `Required next evidence` when the claim is fully
|
|
123
|
+
When returning evidence for adjudication, prepend `Review item:` with the original item pointer. Omit `Required next evidence` when the claim is fully Supported or Contradicted. When the result changes or ends the current path, return it to [Workflow](../../skills/workflow/SKILL.md) to choose what follows.
|
|
@@ -52,4 +52,4 @@ Stop or downgrade the claim when:
|
|
|
52
52
|
- only a nearby path, screenshot, or mocked page was tested;
|
|
53
53
|
- browser evidence contradicts tests, specs, or accepted behavior.
|
|
54
54
|
|
|
55
|
-
Read [Diagnose Failure](
|
|
55
|
+
Read [Diagnose Failure](../../../skills/diagnose-failure/SKILL.md) for unexplained browser failures. Read [Decision Gate](../../../skills/decision-gate/SKILL.md) when browser evidence conflicts with accepted behavior or exposes a user-owned decision.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Integration Evidence
|
|
2
2
|
|
|
3
|
-
Read this before selecting or running evidence when a claim depends on a registered callback or executor, host lifecycle, producer invocation, fallback protocol, installed package, absence counter
|
|
3
|
+
Read this before selecting or running evidence when a claim depends on a registered callback or executor, host lifecycle, producer invocation, fallback protocol, installed package, or absence counter.
|
|
4
4
|
|
|
5
5
|
## Match The Boundary
|
|
6
6
|
|
|
@@ -28,12 +28,6 @@ A zero value proves absence only when:
|
|
|
28
28
|
|
|
29
29
|
Prefer an adversarial disproof: bypass the producer, forge or replay the event, call the helper directly, or resolve code from the checkout instead of the installed root. The proof should fail before downstream work when the claimed boundary was not crossed.
|
|
30
30
|
|
|
31
|
-
## Compare Mutation Footprints
|
|
32
|
-
|
|
33
|
-
Before running checks concurrently, compare what each check may write or remove. Run checks serially when they share generated directories, caches, build outputs, package roots, fixture state, ports, databases, or intentional stale-artifact files.
|
|
34
|
-
|
|
35
|
-
A concurrency-induced red signal is orchestration evidence, not automatically an implementation defect. Reproduce it under a non-overlapping or serial schedule before changing production code.
|
|
36
|
-
|
|
37
31
|
## Claim Map
|
|
38
32
|
|
|
39
33
|
For sensitive or proof-bearing claims, record:
|
|
@@ -54,4 +54,4 @@ Stop or downgrade the claim when:
|
|
|
54
54
|
- only a nearby operation improved;
|
|
55
55
|
- required production evidence is unavailable.
|
|
56
56
|
|
|
57
|
-
Read [Diagnose Failure](
|
|
57
|
+
Read [Diagnose Failure](../../../skills/diagnose-failure/SKILL.md) for unexplained regressions. Read [Decision Gate](../../../skills/decision-gate/SKILL.md) when the next step depends on a product, SLO, cost, or resource tradeoff owned by the user.
|