auditor-lambda 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/audit-code-wrapper-lib.mjs +318 -240
- package/dist/cli.js +85 -1
- package/dist/io/runArtifacts.js +2 -2
- package/dist/orchestrator/internalExecutors.js +1 -0
- package/dist/orchestrator/selectiveDeepening.d.ts +4 -0
- package/dist/orchestrator/selectiveDeepening.js +359 -0
- package/dist/prompts/renderWorkerPrompt.js +3 -4
- package/dist/types.d.ts +9 -0
- package/dist/validation/auditResults.js +158 -0
- package/docs/agent-integrations.md +1 -1
- package/docs/bootstrap-install.md +6 -1
- package/docs/contract.md +3 -0
- package/docs/dispatch-implementation-plan.md +19 -1
- package/docs/github-copilot.md +1 -1
- package/docs/model-selection.md +11 -0
- package/docs/next-steps.md +2 -2
- package/docs/packaging.md +4 -2
- package/docs/production-launch-bar.md +3 -1
- package/docs/production-readiness.md +6 -6
- package/package.json +1 -1
- package/schemas/audit_result.schema.json +28 -0
- package/skills/audit-code/SKILL.md +4 -0
- package/skills/audit-code/audit-code.prompt.md +5 -0
|
@@ -10,6 +10,8 @@ const REQUIRED_FINDING_FIELDS = [
|
|
|
10
10
|
];
|
|
11
11
|
const VALID_SEVERITIES = new Set(["critical", "high", "medium", "low", "info"]);
|
|
12
12
|
const VALID_CONFIDENCES = new Set(["high", "medium", "low"]);
|
|
13
|
+
const VALID_PRIORITIES = new Set(["high", "medium", "low"]);
|
|
14
|
+
const LENS_VERIFICATION_TAG = "lens_verification";
|
|
13
15
|
const VALID_LENSES = new Set([
|
|
14
16
|
"correctness",
|
|
15
17
|
"architecture",
|
|
@@ -207,6 +209,161 @@ function validateFinding(finding, label, taskId, resultIndex) {
|
|
|
207
209
|
}
|
|
208
210
|
return issues;
|
|
209
211
|
}
|
|
212
|
+
function validateOptionalStringArray(value, label, taskId, resultIndex, issues) {
|
|
213
|
+
if (value === undefined) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!Array.isArray(value)) {
|
|
217
|
+
pushIssue(issues, {
|
|
218
|
+
result_index: resultIndex,
|
|
219
|
+
task_id: taskId,
|
|
220
|
+
field: label,
|
|
221
|
+
message: `${label} must be an array of strings, got ${describeValue(value)}.`,
|
|
222
|
+
});
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (let index = 0; index < value.length; index++) {
|
|
226
|
+
if (typeof value[index] !== "string") {
|
|
227
|
+
pushIssue(issues, {
|
|
228
|
+
result_index: resultIndex,
|
|
229
|
+
task_id: taskId,
|
|
230
|
+
field: `${label}[${index}]`,
|
|
231
|
+
message: `${label}[${index}] must be a string, got ${describeValue(value[index])}.`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function validateVerificationFollowupTask(task, label, taskId, resultIndex, expectedLens, allowedPaths, issues) {
|
|
237
|
+
if (!isRecord(task)) {
|
|
238
|
+
pushIssue(issues, {
|
|
239
|
+
result_index: resultIndex,
|
|
240
|
+
task_id: taskId,
|
|
241
|
+
field: label,
|
|
242
|
+
message: `${label} must be an AuditTask object, got ${describeValue(task)}.`,
|
|
243
|
+
});
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
for (const field of ["task_id", "unit_id", "pass_id", "lens", "rationale"]) {
|
|
247
|
+
validateRequiredStringField(task[field], `${label}.${field}`, taskId, resultIndex, issues);
|
|
248
|
+
}
|
|
249
|
+
if (typeof task.lens === "string" && !VALID_LENSES.has(task.lens)) {
|
|
250
|
+
pushIssue(issues, {
|
|
251
|
+
result_index: resultIndex,
|
|
252
|
+
task_id: taskId,
|
|
253
|
+
field: `${label}.lens`,
|
|
254
|
+
message: `Invalid lens '${task.lens}'. Must be one of: ${[...VALID_LENSES].join(", ")}.`,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
if (typeof expectedLens === "string" &&
|
|
258
|
+
typeof task.lens === "string" &&
|
|
259
|
+
task.lens !== expectedLens) {
|
|
260
|
+
pushIssue(issues, {
|
|
261
|
+
result_index: resultIndex,
|
|
262
|
+
task_id: taskId,
|
|
263
|
+
field: `${label}.lens`,
|
|
264
|
+
message: `${label}.lens must match the lens verification task ` +
|
|
265
|
+
`(expected '${expectedLens}', got '${task.lens}').`,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (task.priority !== undefined &&
|
|
269
|
+
(typeof task.priority !== "string" || !VALID_PRIORITIES.has(task.priority))) {
|
|
270
|
+
pushIssue(issues, {
|
|
271
|
+
result_index: resultIndex,
|
|
272
|
+
task_id: taskId,
|
|
273
|
+
field: `${label}.priority`,
|
|
274
|
+
message: `${label}.priority must be one of: ${[...VALID_PRIORITIES].join(", ")}.`,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
if (!Array.isArray(task.file_paths) || task.file_paths.length === 0) {
|
|
278
|
+
pushIssue(issues, {
|
|
279
|
+
result_index: resultIndex,
|
|
280
|
+
task_id: taskId,
|
|
281
|
+
field: `${label}.file_paths`,
|
|
282
|
+
message: `${label}.file_paths must be a non-empty array.`,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
for (let index = 0; index < task.file_paths.length; index++) {
|
|
287
|
+
const path = task.file_paths[index];
|
|
288
|
+
if (!isNonEmptyString(path)) {
|
|
289
|
+
pushIssue(issues, {
|
|
290
|
+
result_index: resultIndex,
|
|
291
|
+
task_id: taskId,
|
|
292
|
+
field: `${label}.file_paths[${index}]`,
|
|
293
|
+
message: `${label}.file_paths[${index}] must be a non-empty string.`,
|
|
294
|
+
});
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (!allowedPaths.has(path)) {
|
|
298
|
+
pushIssue(issues, {
|
|
299
|
+
result_index: resultIndex,
|
|
300
|
+
task_id: taskId,
|
|
301
|
+
field: `${label}.file_paths[${index}]`,
|
|
302
|
+
message: `${label}.file_paths[${index}] references '${path}', which is outside the verification task's file_coverage.`,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
validateOptionalStringArray(task.tags, `${label}.tags`, taskId, resultIndex, issues);
|
|
308
|
+
}
|
|
309
|
+
function validateVerification(value, result, task, coverage, taskId, resultIndex, issues) {
|
|
310
|
+
if (value === undefined) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (!isRecord(value)) {
|
|
314
|
+
pushIssue(issues, {
|
|
315
|
+
result_index: resultIndex,
|
|
316
|
+
task_id: taskId,
|
|
317
|
+
field: "verification",
|
|
318
|
+
message: `verification must be an object, got ${describeValue(value)}.`,
|
|
319
|
+
});
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (typeof value.verified !== "boolean") {
|
|
323
|
+
pushIssue(issues, {
|
|
324
|
+
result_index: resultIndex,
|
|
325
|
+
task_id: taskId,
|
|
326
|
+
field: "verification.verified",
|
|
327
|
+
message: `verification.verified must be a boolean, got ${describeValue(value.verified)}.`,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (typeof value.needs_followup !== "boolean") {
|
|
331
|
+
pushIssue(issues, {
|
|
332
|
+
result_index: resultIndex,
|
|
333
|
+
task_id: taskId,
|
|
334
|
+
field: "verification.needs_followup",
|
|
335
|
+
message: `verification.needs_followup must be a boolean, got ${describeValue(value.needs_followup)}.`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
if (task && !task.tags?.includes(LENS_VERIFICATION_TAG)) {
|
|
339
|
+
pushIssue(issues, {
|
|
340
|
+
result_index: resultIndex,
|
|
341
|
+
task_id: taskId,
|
|
342
|
+
field: "verification",
|
|
343
|
+
message: "verification is intended only for tasks tagged lens_verification.",
|
|
344
|
+
severity: "warning",
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
validateOptionalStringArray(value.concerns, "verification.concerns", taskId, resultIndex, issues);
|
|
348
|
+
validateOptionalStringArray(value.coverage_concerns, "verification.coverage_concerns", taskId, resultIndex, issues);
|
|
349
|
+
validateOptionalStringArray(value.confidence_concerns, "verification.confidence_concerns", taskId, resultIndex, issues);
|
|
350
|
+
if (value.followup_tasks === undefined) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (!Array.isArray(value.followup_tasks)) {
|
|
354
|
+
pushIssue(issues, {
|
|
355
|
+
result_index: resultIndex,
|
|
356
|
+
task_id: taskId,
|
|
357
|
+
field: "verification.followup_tasks",
|
|
358
|
+
message: `verification.followup_tasks must be an array, got ${describeValue(value.followup_tasks)}.`,
|
|
359
|
+
});
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const allowedPaths = new Set(coverage.map((entry) => entry.path));
|
|
363
|
+
for (let index = 0; index < value.followup_tasks.length; index++) {
|
|
364
|
+
validateVerificationFollowupTask(value.followup_tasks[index], `verification.followup_tasks[${index}]`, taskId, resultIndex, result.lens, allowedPaths, issues);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
210
367
|
function coversAffectedSpan(coverage, path, start, end) {
|
|
211
368
|
return coverage.some((entry) => entry.path === path &&
|
|
212
369
|
start > 0 &&
|
|
@@ -438,6 +595,7 @@ export function validateAuditResults(results, tasks, options = {}) {
|
|
|
438
595
|
}
|
|
439
596
|
}
|
|
440
597
|
}
|
|
598
|
+
validateVerification(result.verification, result, task, normalizedFileCoverage, taskId, i, issues);
|
|
441
599
|
}
|
|
442
600
|
return issues;
|
|
443
601
|
}
|
|
@@ -254,7 +254,7 @@ The current implementation shipped the shared installer and MCP substrate. The r
|
|
|
254
254
|
|
|
255
255
|
Highest-value follow-through:
|
|
256
256
|
|
|
257
|
-
1. validate the generated Codex, Claude Desktop, OpenCode,
|
|
257
|
+
1. validate the generated Codex, Claude Desktop, OpenCode, VS Code, and Antigravity assets inside the real products they target
|
|
258
258
|
2. tighten generated quick-start guidance anywhere those host smoke tests expose ambiguity
|
|
259
259
|
3. document exactly how Antigravity artifacts should map into `import_results` and `import_runtime_updates`
|
|
260
260
|
4. keep host claims conservative until those end-to-end product checks are complete
|
|
@@ -10,6 +10,9 @@ That command installs the repo-local `/audit-code` surfaces we can automate toda
|
|
|
10
10
|
It is also the single refresh path: rerun `audit-code install` after prompt or
|
|
11
11
|
skill updates to rewrite the shared install assets and every generated
|
|
12
12
|
host-specific surface from the same source files.
|
|
13
|
+
The generated manifest records the canonical prompt and skill source paths so
|
|
14
|
+
host surfaces can be checked against one shared source of truth instead of
|
|
15
|
+
drifting independently.
|
|
13
16
|
|
|
14
17
|
After bootstrap, run:
|
|
15
18
|
|
|
@@ -28,6 +31,7 @@ Installed shared surfaces:
|
|
|
28
31
|
- `.audit-code/install/GETTING-STARTED.md`
|
|
29
32
|
- `.audit-code/install/manifest.json`
|
|
30
33
|
- `.audit-code/install/run-mcp-server.mjs`
|
|
34
|
+
- `.audit-artifacts/session-config.json` when no backend fallback config exists yet
|
|
31
35
|
|
|
32
36
|
Installed host-specific surfaces:
|
|
33
37
|
|
|
@@ -76,6 +80,7 @@ without supplying extra root paths, provider flags, or model-selection arguments
|
|
|
76
80
|
## What is fully automated today
|
|
77
81
|
|
|
78
82
|
- shared installer output, manifest generation, and repo-local MCP launcher generation
|
|
83
|
+
- default backend fallback session-config creation when no config exists yet
|
|
79
84
|
- Codex skill-bundle and AGENTS-oriented install output
|
|
80
85
|
- OpenCode command, skill, prompt, and config generation
|
|
81
86
|
- VS Code prompt, custom-agent, instruction, and MCP config generation
|
|
@@ -84,7 +89,7 @@ without supplying extra root paths, provider flags, or model-selection arguments
|
|
|
84
89
|
|
|
85
90
|
## What is not fully automated today
|
|
86
91
|
|
|
87
|
-
- product-level smoke validation for the generated Codex, Claude Desktop, OpenCode,
|
|
92
|
+
- product-level smoke validation for the generated Codex, Claude Desktop, OpenCode, VS Code, and Antigravity assets
|
|
88
93
|
- one-click proof that the generated Claude Desktop bundle installs cleanly in a real Desktop environment
|
|
89
94
|
- documented Antigravity artifact round-tripping back through `import_results` and `import_runtime_updates`
|
|
90
95
|
|
package/docs/contract.md
CHANGED
|
@@ -31,6 +31,9 @@ Important rules:
|
|
|
31
31
|
- each finding lens must match the assigned task lens.
|
|
32
32
|
- `findings[].affected_files` must be objects, not strings.
|
|
33
33
|
- `findings[].evidence` must be an array of plain strings.
|
|
34
|
+
- lens steward tasks are tagged `lens_verification`; they must emit
|
|
35
|
+
`findings: []` plus `verification` metadata. Suggested `verification.followup_tasks`
|
|
36
|
+
are treated as bounded follow-up requests, not direct findings.
|
|
34
37
|
|
|
35
38
|
Use `audit-code validate-results --results <file>` before ingestion to validate
|
|
36
39
|
results against the active task manifest.
|
|
@@ -121,13 +121,31 @@ The command prints a compact JSON envelope:
|
|
|
121
121
|
{
|
|
122
122
|
"packet_id": "src-auth:security-correctness:packet-1-...",
|
|
123
123
|
"description": "Audit 2 file(s), 2 task(s), 2 lens(es) (~70 lines)",
|
|
124
|
-
"prompt_path": ".audit-artifacts/runs/run-1/task-results/src-auth_security-correctness_packet-1_ab12cd34ef56.prompt.md"
|
|
124
|
+
"prompt_path": ".audit-artifacts/runs/run-1/task-results/src-auth_security-correctness_packet-1_ab12cd34ef56.prompt.md",
|
|
125
|
+
"complexity": {
|
|
126
|
+
"priority": "high",
|
|
127
|
+
"task_count": 2,
|
|
128
|
+
"file_count": 2,
|
|
129
|
+
"total_lines": 70,
|
|
130
|
+
"estimated_tokens": 1180,
|
|
131
|
+
"lenses": ["security", "correctness"],
|
|
132
|
+
"tags": ["critical_flow"],
|
|
133
|
+
"large_file_mode": false
|
|
134
|
+
},
|
|
135
|
+
"model_hint": {
|
|
136
|
+
"tier": "deep",
|
|
137
|
+
"reasons": ["high_priority", "critical_flow"]
|
|
138
|
+
}
|
|
125
139
|
}
|
|
126
140
|
```
|
|
127
141
|
|
|
128
142
|
The orchestrator should launch one subagent per entry with the entry
|
|
129
143
|
description and a prompt that tells the subagent to read and follow
|
|
130
144
|
`entry.prompt_path`.
|
|
145
|
+
If the host supports per-subagent model selection, it may map
|
|
146
|
+
`entry.model_hint.tier` (`small`, `standard`, or `deep`) to local model names.
|
|
147
|
+
These hints are provider-neutral; the backend does not hardcode model names or
|
|
148
|
+
require model selection during normal use.
|
|
131
149
|
|
|
132
150
|
## Large File Mode
|
|
133
151
|
|
package/docs/github-copilot.md
CHANGED
|
@@ -30,7 +30,7 @@ audit-code install --host vscode
|
|
|
30
30
|
## Behavior
|
|
31
31
|
|
|
32
32
|
- the command copies the canonical prompt payload from `skills/audit-code/audit-code.prompt.md`
|
|
33
|
-
- the generated prompt file explicitly sets `agent:
|
|
33
|
+
- the generated prompt file explicitly sets `agent: auditor` so Copilot Chat uses the generated auditor custom agent
|
|
34
34
|
- the installer upserts its managed compatibility block into `.github/copilot-instructions.md` instead of clobbering unrelated instructions
|
|
35
35
|
- it prints machine-readable JSON describing the installed targets
|
|
36
36
|
|
package/docs/model-selection.md
CHANGED
|
@@ -13,6 +13,17 @@ For that surface, the default model rule is:
|
|
|
13
13
|
|
|
14
14
|
That is the intended product contract.
|
|
15
15
|
|
|
16
|
+
When packet dispatch is prepared, `dispatch-plan.json` includes
|
|
17
|
+
provider-neutral complexity metadata and a `model_hint.tier` value:
|
|
18
|
+
|
|
19
|
+
- `small` for tiny, low-priority packets without sensitive lenses or risk tags
|
|
20
|
+
- `standard` for ordinary bounded review packets
|
|
21
|
+
- `deep` for high-priority, large, critical-flow, or external-signal packets
|
|
22
|
+
|
|
23
|
+
Hosts that support per-subagent model choice may map those tiers to their own
|
|
24
|
+
available models. Hosts that do not support model choice can ignore the fields.
|
|
25
|
+
The backend still does not prescribe concrete model names.
|
|
26
|
+
|
|
16
27
|
## 2. Backend provider rule
|
|
17
28
|
|
|
18
29
|
When the local backend delegates bounded worker runs into an external provider, model selection becomes provider-specific.
|
package/docs/next-steps.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
This document tracks the next meaningful implementation work after the packet
|
|
4
4
|
review-dispatch refactor and the current skill-first productionization pass.
|
|
5
5
|
|
|
6
|
-
As of April
|
|
6
|
+
As of April 30, 2026, the shared MCP substrate and the host-native installer pass have landed, but this repository is not yet ready for a public production launch.
|
|
7
7
|
|
|
8
8
|
See:
|
|
9
9
|
|
|
@@ -144,7 +144,7 @@ Status:
|
|
|
144
144
|
|
|
145
145
|
Most likely shape:
|
|
146
146
|
|
|
147
|
-
- run fresh-repo smoke checks inside Codex, Claude Desktop, OpenCode, and VS Code
|
|
147
|
+
- run fresh-repo smoke checks inside Codex, Claude Desktop, OpenCode, and VS Code, with Antigravity validated against its planning-mode path
|
|
148
148
|
- confirm that the generated files are both syntactically valid and actually discovered by each host
|
|
149
149
|
- tighten generated docs wherever operator confusion appears during those checks
|
|
150
150
|
- keep Antigravity as a documented planning-mode path unless a stable project config contract is published
|
package/docs/packaging.md
CHANGED
|
@@ -17,6 +17,8 @@ The primary product surface is `/audit-code` in conversation.
|
|
|
17
17
|
That means the package needs to ship:
|
|
18
18
|
|
|
19
19
|
- the canonical prompt asset at `skills/audit-code/audit-code.prompt.md`
|
|
20
|
+
- the companion Codex/OpenCode skill asset at `skills/audit-code/SKILL.md`
|
|
21
|
+
- packet-dispatch support data such as `dispatch/lens-definitions.json`
|
|
20
22
|
- the backend fallback wrapper exposed as `audit-code`
|
|
21
23
|
|
|
22
24
|
A linked-command smoke test proves the installed wrapper and prompt lookup work from the working tree.
|
|
@@ -76,11 +78,11 @@ The repository now includes packaging metadata and lifecycle hooks intended for
|
|
|
76
78
|
|
|
77
79
|
- `package.json` is no longer marked private
|
|
78
80
|
- `publishConfig.access` defaults publication to the public npm access level
|
|
79
|
-
- package contents are curated with a `files` allowlist that includes the canonical prompt
|
|
81
|
+
- package contents are curated with a `files` allowlist that includes the canonical prompt, skill, dispatch, schema, and runtime assets
|
|
80
82
|
- `prepack` and `prepare` build the runtime artifact
|
|
81
83
|
- `verify:release` codifies the minimum in-repo release gate
|
|
82
84
|
- `prepublishOnly` now runs that full release gate, including both linked-install and packaged-install smoke validation
|
|
83
|
-
- packaged smoke now verifies the tarball includes `audit-code-wrapper-lib.mjs`, the prompt
|
|
85
|
+
- packaged smoke now verifies the tarball includes `audit-code-wrapper-lib.mjs`, the prompt and skill assets, dispatch lens definitions, the response schema, and `dist/` entrypoints before install-time smoke runs
|
|
84
86
|
- the GitHub publish workflow uses the same release gate before `npm publish`
|
|
85
87
|
- the GitHub publish workflow uses npm Trusted Publishing with GitHub OIDC instead of a long-lived publish token
|
|
86
88
|
- prerelease versions now default to the `next` dist-tag in the publish workflow unless an explicit tag override is chosen on manual dispatch
|
|
@@ -25,6 +25,8 @@ Anything below `dist/index.js` remains a backend or development interface rather
|
|
|
25
25
|
- packaged installs must include:
|
|
26
26
|
- `audit-code`
|
|
27
27
|
- `audit-code-wrapper-lib.mjs`
|
|
28
|
+
- `dispatch/lens-definitions.json`
|
|
29
|
+
- `skills/audit-code/SKILL.md`
|
|
28
30
|
- `skills/audit-code/audit-code.prompt.md`
|
|
29
31
|
- `schemas/audit-code-v1alpha1.schema.json`
|
|
30
32
|
- the checked-in `dist/` output is part of the shipped runtime contract for installed usage
|
|
@@ -38,7 +40,7 @@ Anything below `dist/index.js` remains a backend or development interface rather
|
|
|
38
40
|
### Host surfaces
|
|
39
41
|
|
|
40
42
|
- ChatGPT-style project conversations are the intended `/audit-code` product surface
|
|
41
|
-
- VS Code / GitHub Copilot,
|
|
43
|
+
- Codex, Claude Desktop, OpenCode, VS Code / GitHub Copilot, and Antigravity repository surfaces are generated through `audit-code install`
|
|
42
44
|
- editor integrations that import `skills/audit-code/audit-code.prompt.md` are supported as prompt-based integrations
|
|
43
45
|
- no editor-specific native install surface should be called production-ready until it has explicit documentation and a repeatable verification path
|
|
44
46
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Verdict
|
|
4
4
|
|
|
5
|
-
As of April
|
|
5
|
+
As of April 30, 2026, the package release path has a strong in-repo release gate, but the broader host experience still has follow-through work before it should be described as a frictionless production launch.
|
|
6
6
|
|
|
7
7
|
What is already true:
|
|
8
8
|
|
|
@@ -11,9 +11,9 @@ What is already true:
|
|
|
11
11
|
- linked-install smoke coverage passes
|
|
12
12
|
- packaged-install smoke coverage passes
|
|
13
13
|
- packaged tarball contract verification passes
|
|
14
|
-
- `npm run verify:release`
|
|
15
|
-
- local `npm publish --dry-run`
|
|
16
|
-
- npm
|
|
14
|
+
- `npm run verify:release` is the authoritative local release gate for the current worktree
|
|
15
|
+
- local `npm publish --dry-run` should be run before any release candidate publish
|
|
16
|
+
- npm registry state should be verified at release time rather than inferred from checked-in docs
|
|
17
17
|
- malformed config and corrupted artifact handling are explicit
|
|
18
18
|
- blocked fallback runs now emit structured operator handoff guidance
|
|
19
19
|
- supported repo-local hosts now share a bootstrap install path via `audit-code install`
|
|
@@ -27,7 +27,7 @@ The biggest remaining gaps are product and release-operational, not core wrapper
|
|
|
27
27
|
1. npm publication is not fully proven end to end.
|
|
28
28
|
The repo now has a Trusted Publishing workflow and a passing local dry run, but npm-side trusted publisher setup plus the first GitHub Actions dry run still need to be completed outside the codebase.
|
|
29
29
|
2. The primary conversation-first product still has setup friction on hosts without a verified repo-local slash-command surface.
|
|
30
|
-
VS Code / Copilot,
|
|
30
|
+
Codex, Claude Desktop, OpenCode, VS Code / Copilot, and Antigravity now share the same bootstrap command, but each generated host surface still needs real-product verification before it can be called frictionless.
|
|
31
31
|
3. Provider-assisted continuation still needs polish outside the happy path.
|
|
32
32
|
Configured interactive bridges can now continue through audit-task review, but operator guidance and host-specific ergonomics still need refinement when a provider cannot produce results cleanly.
|
|
33
33
|
|
|
@@ -38,7 +38,7 @@ The explicit launch bar is now documented in `docs/production-launch-bar.md`, an
|
|
|
38
38
|
1. Confirm release operations externally.
|
|
39
39
|
Validate npm package-name ownership for `auditor-lambda`, configure npm Trusted Publishing for `.github/workflows/publish-package.yml`, and run a real GitHub Actions dry run or prerelease publish from that workflow path.
|
|
40
40
|
2. Extend bootstrap coverage beyond the currently automated hosts.
|
|
41
|
-
Keep `audit-code install` stable for VS Code / Copilot,
|
|
41
|
+
Keep `audit-code install` stable for Codex, Claude Desktop, OpenCode, VS Code / Copilot, and Antigravity, and close the remaining friction gap for hosts that still lack a verified repo-local install surface.
|
|
42
42
|
3. Polish provider-assisted UX.
|
|
43
43
|
Keep the new continuation path explicit and inspectable while improving failure hints, host guidance, and operator recovery when a provider bridge misbehaves.
|
|
44
44
|
|
package/package.json
CHANGED
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"$defs": {
|
|
15
15
|
"Finding": {
|
|
16
16
|
"$ref": "finding.schema.json"
|
|
17
|
+
},
|
|
18
|
+
"AuditTask": {
|
|
19
|
+
"$ref": "audit_task.schema.json"
|
|
17
20
|
}
|
|
18
21
|
},
|
|
19
22
|
"properties": {
|
|
@@ -50,6 +53,31 @@
|
|
|
50
53
|
"followup_tasks": {
|
|
51
54
|
"type": "array",
|
|
52
55
|
"items": { "type": "string" }
|
|
56
|
+
},
|
|
57
|
+
"verification": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"required": ["verified", "needs_followup"],
|
|
60
|
+
"properties": {
|
|
61
|
+
"verified": { "type": "boolean" },
|
|
62
|
+
"needs_followup": { "type": "boolean" },
|
|
63
|
+
"concerns": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"items": { "type": "string" }
|
|
66
|
+
},
|
|
67
|
+
"coverage_concerns": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"items": { "type": "string" }
|
|
70
|
+
},
|
|
71
|
+
"confidence_concerns": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"items": { "type": "string" }
|
|
74
|
+
},
|
|
75
|
+
"followup_tasks": {
|
|
76
|
+
"type": "array",
|
|
77
|
+
"items": { "$ref": "#/$defs/AuditTask" }
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"additionalProperties": false
|
|
53
81
|
}
|
|
54
82
|
},
|
|
55
83
|
"additionalProperties": false
|
|
@@ -28,6 +28,10 @@ command, then stop so the user can rerun `/audit-code` from fresh context.
|
|
|
28
28
|
Subagent fan-out belongs to the host agent runtime rather than to repo-local
|
|
29
29
|
backend provider settings.
|
|
30
30
|
|
|
31
|
+
When dispatch-plan entries include provider-neutral complexity and
|
|
32
|
+
`model_hint.tier` metadata, a capable host may map those tiers to its own
|
|
33
|
+
subagent models. The backend should not prescribe concrete model names.
|
|
34
|
+
|
|
31
35
|
Bounded steps are a backend implementation detail, not the intended user experience.
|
|
32
36
|
|
|
33
37
|
## Embedded Prompt Payload
|
|
@@ -81,6 +81,11 @@ In a single message, launch one Agent/subagent call per dispatch-plan entry:
|
|
|
81
81
|
Agent({ description: entry.description, prompt: "Read and follow the audit instructions in: " + entry.prompt_path })
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
+
If the host supports per-subagent model selection, use `entry.model_hint.tier`
|
|
85
|
+
as a provider-neutral routing hint (`small`, `standard`, or `deep`). Map it to
|
|
86
|
+
available host models without asking the user to choose model names. If model
|
|
87
|
+
selection is unavailable, ignore the hint and dispatch normally.
|
|
88
|
+
|
|
84
89
|
If the host supports per-subagent tool restrictions, give review subagents no
|
|
85
90
|
Write tool and allow shell access only for the `audit-code submit-packet`
|
|
86
91
|
command printed in their prompt.
|