auditor-lambda 0.3.13 → 0.3.15

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.
Files changed (60) hide show
  1. package/README.md +21 -24
  2. package/audit-code-wrapper-lib.mjs +62 -104
  3. package/dist/cli.js +41 -4
  4. package/dist/coverage.js +3 -1
  5. package/dist/extractors/disposition.js +8 -1
  6. package/dist/extractors/graph.d.ts +3 -1
  7. package/dist/extractors/graph.js +1147 -67
  8. package/dist/extractors/graphManifestEdges.d.ts +14 -0
  9. package/dist/extractors/graphManifestEdges.js +1158 -0
  10. package/dist/extractors/graphPathUtils.d.ts +5 -0
  11. package/dist/extractors/graphPathUtils.js +75 -0
  12. package/dist/extractors/pathPatterns.d.ts +1 -0
  13. package/dist/extractors/pathPatterns.js +3 -0
  14. package/dist/io/artifacts.d.ts +10 -1
  15. package/dist/io/artifacts.js +23 -3
  16. package/dist/orchestrator/internalExecutors.d.ts +4 -0
  17. package/dist/orchestrator/internalExecutors.js +35 -6
  18. package/dist/orchestrator/reviewPackets.js +1003 -31
  19. package/dist/orchestrator/syntaxResolutionExecutor.js +34 -0
  20. package/dist/types/externalAnalyzer.d.ts +9 -0
  21. package/dist/types/graph.d.ts +3 -0
  22. package/dist/types/reviewPlanning.d.ts +39 -0
  23. package/docs/contracts.md +215 -0
  24. package/docs/development.md +210 -0
  25. package/docs/handoff.md +204 -0
  26. package/docs/history.md +40 -0
  27. package/docs/operator-guide.md +190 -0
  28. package/docs/product.md +185 -0
  29. package/docs/release.md +131 -0
  30. package/package.json +1 -1
  31. package/schemas/audit_plan_metrics.schema.json +347 -0
  32. package/schemas/external_analyzer_results.schema.json +35 -0
  33. package/schemas/graph_bundle.schema.json +47 -2
  34. package/schemas/review_packets.schema.json +160 -0
  35. package/scripts/postinstall.mjs +49 -0
  36. package/docs/agent-integrations.md +0 -318
  37. package/docs/agent-roles.md +0 -69
  38. package/docs/architecture.md +0 -90
  39. package/docs/artifacts.md +0 -36
  40. package/docs/bootstrap-install.md +0 -136
  41. package/docs/contract.md +0 -54
  42. package/docs/dispatch-implementation-plan.md +0 -302
  43. package/docs/field-trial-bug-report.md +0 -237
  44. package/docs/github-copilot.md +0 -66
  45. package/docs/model-selection.md +0 -97
  46. package/docs/next-steps.md +0 -202
  47. package/docs/packaging.md +0 -120
  48. package/docs/pipeline.md +0 -152
  49. package/docs/product-direction.md +0 -154
  50. package/docs/production-launch-bar.md +0 -92
  51. package/docs/production-readiness.md +0 -58
  52. package/docs/releasing.md +0 -145
  53. package/docs/remediation-baseline.md +0 -75
  54. package/docs/repo-layout.md +0 -30
  55. package/docs/run-flow.md +0 -56
  56. package/docs/session-config.md +0 -319
  57. package/docs/supervisor.md +0 -100
  58. package/docs/usage.md +0 -215
  59. package/docs/windows-setup.md +0 -146
  60. package/docs/workflow-refactor-brief.md +0 -124
@@ -1,90 +0,0 @@
1
- # Architecture
2
-
3
- ## Objective
4
-
5
- `auditor-lambda` is a portable code-auditing framework for arbitrary repositories. It separates deterministic extraction from bounded LLM judgment so that large or mixed-language codebases can be audited systematically.
6
-
7
- ## Design principles
8
-
9
- 1. Tool outputs first
10
- 2. Artifact-driven orchestration
11
- 3. Bounded LLM tasks
12
- 4. Explicit coverage accounting
13
- 5. Multi-pass review for critical code
14
- 6. Strict schemas for interoperability
15
-
16
- ## System layers
17
-
18
- ### 1. Intake
19
-
20
- - file discovery
21
- - stack detection
22
- - ignore handling
23
- - normalization
24
-
25
- ### 2. Extractors
26
-
27
- - service and package detection
28
- - route, job, command, workflow extraction
29
- - file bucketing
30
- - graph extraction
31
-
32
- ### 3. Mechanical analyzers
33
-
34
- - lint
35
- - typecheck
36
- - tests
37
- - test coverage
38
- - secret scanning
39
- - dependency scanning
40
- - static security scanning
41
- - complexity and duplication metrics
42
-
43
- ### 4. Orchestrator
44
-
45
- - builds audit units
46
- - assigns passes and lenses
47
- - chunks large files
48
- - tracks line coverage and pass overlap
49
- - requeues uncovered ranges
50
-
51
- ### 5. LLM agents
52
-
53
- - ambiguous classification
54
- - blind-spot mapping
55
- - per-lens audits
56
- - cross-cutting audits
57
- - synthesis
58
-
59
- ### 6. Validation
60
-
61
- - targeted runtime checks
62
- - startup/config probes
63
- - adversarial repros
64
-
65
- ### 7. Reporting
66
-
67
- - normalized findings
68
- - coverage matrices
69
- - root-cause clustering
70
- - remediation planning
71
-
72
- ## Core pipeline
73
-
74
- 1. Intake and normalize repository
75
- 2. Extract structure and graph artifacts
76
- 3. Run mechanical analyzers
77
- 4. Build audit units and risk register
78
- 5. Run blind-spot mapping
79
- 6. Run lens-based unit audits
80
- 7. Run cross-cutting audits
81
- 8. Run dynamic validation on targeted cases
82
- 9. Verify file and line coverage
83
- 10. Synthesize findings and remediation plan
84
-
85
- ## Portability rules
86
-
87
- - Tool-specific collectors should write into tool-agnostic JSON artifacts.
88
- - LLM prompts should consume artifacts, not raw repos by default.
89
- - All review work should be attributable to files, line ranges, lenses, and passes.
90
- - Coverage gaps should be machine-detectable.
package/docs/artifacts.md DELETED
@@ -1,36 +0,0 @@
1
- # Core Artifacts
2
-
3
- This document follows [audit-goals.md](C:/Code/auditor-lambda/spec/audit-goals.md).
4
-
5
- ## Incomplete-run artifacts
6
-
7
- During an incomplete or blocked audit, `.audit-artifacts/` may contain:
8
-
9
- - `repo_manifest.json`
10
- - `file_disposition.json`
11
- - `unit_manifest.json`
12
- - `graph_bundle.json`
13
- - `surface_manifest.json`
14
- - `critical_flows.json`
15
- - `flow_coverage.json`
16
- - `risk_register.json`
17
- - `coverage_matrix.json`
18
- - `runtime_validation_tasks.json` when deterministic runtime validation is planned
19
- - `runtime_validation_report.json` when runtime validation has executed or been updated
20
- - `external_analyzer_results.json`
21
- - `audit_tasks.json`
22
- - `audit_results.jsonl`
23
- - `requeue_tasks.json`
24
- - dispatch files for the currently active worker task
25
-
26
- ## Scope rule
27
-
28
- Excluded files remain visible in deterministic intake/disposition where useful,
29
- but they must not create audit work. This includes logs, licenses, lockfiles,
30
- generated artifacts, vendored artifacts, binaries, and trivial non-code files.
31
-
32
- ## Completion rule
33
-
34
- These artifacts are transient implementation state only. When the audit
35
- completes, `.audit-artifacts/` is removed and only repo-root `audit-report.md`
36
- remains.
@@ -1,136 +0,0 @@
1
- # Bootstrap install
2
-
3
- The intended user setup is one global package install:
4
-
5
- ```bash
6
- npm install -g auditor-lambda
7
- ```
8
-
9
- That makes the `audit-code` command available from any repository. Package
10
- install also seeds user-level command or skill assets for hosts we can update
11
- safely, including the Claude command file and global Codex skill bundle.
12
-
13
- After that, the normal user flow is to invoke `/audit-code` in a supported host.
14
- The prompt starts by running:
15
-
16
- ```bash
17
- audit-code ensure --quiet
18
- ```
19
-
20
- `ensure` is idempotent. From the target repository root, it writes the
21
- repo-local `/audit-code` surfaces only when they are missing or stale.
22
-
23
- The explicit repair or compatibility command remains:
24
-
25
- ```bash
26
- audit-code install
27
- ```
28
-
29
- That command always rewrites the repo-local `/audit-code` surfaces we can
30
- automate today. `audit-code ensure --force` is the equivalent self-bootstrap
31
- entrypoint when you want forced refresh semantics.
32
- The generated manifest records the canonical prompt and skill source paths so
33
- host surfaces can be checked against one shared source of truth instead of
34
- drifting independently.
35
-
36
- After bootstrap, run:
37
-
38
- ```bash
39
- audit-code verify-install
40
- ```
41
-
42
- That smoke-tests the generated host assets plus the shared repo-local MCP launcher without waiting for a full editor walkthrough.
43
-
44
- ## What it writes
45
-
46
- Installed shared surfaces:
47
-
48
- - `.audit-code/install/audit-code.import.md`
49
- - `.audit-code/install/SKILL.md`
50
- - `.audit-code/install/GETTING-STARTED.md`
51
- - `.audit-code/install/manifest.json`
52
- - `.audit-code/install/run-mcp-server.mjs`
53
- - `.audit-artifacts/session-config.json` when no backend fallback config exists yet
54
-
55
- Installed host-specific surfaces:
56
-
57
- - Codex:
58
- - `AGENTS.md` managed fallback block when needed
59
- - Claude Desktop:
60
- - `.audit-code/install/claude-desktop/PROJECT-TEMPLATE.md`
61
- - `.audit-code/install/claude-desktop/remote-mcp-connector.json`
62
- - `.audit-code/install/claude-desktop/auditor-lambda.dxt`
63
- - `.audit-code/install/claude-desktop/auditor-lambda.mcpb`
64
- - OpenCode:
65
- - `.opencode/commands/audit-code.md`
66
- - `.opencode/skills/audit-code/*`
67
- - `opencode.json`
68
- - `AGENTS.md` managed block when needed
69
- - VS Code:
70
- - `.github/prompts/audit-code.prompt.md`
71
- - `.github/copilot-instructions.md`
72
- - `.github/agents/auditor.agent.md`
73
- - `.vscode/mcp.json`
74
- - Antigravity:
75
- - `.audit-code/install/antigravity/PLANNING-MODE.md`
76
- - `AGENTS.md` managed block when needed
77
-
78
- The generated `GETTING-STARTED.md` now includes dedicated quick-start sections for:
79
-
80
- - Codex
81
- - Claude Desktop
82
- - OpenCode
83
- - VS Code
84
- - Antigravity
85
-
86
- ## Goal
87
-
88
- After bootstrap, the user should be able to open a supported host surface in the repository and invoke:
89
-
90
- ```text
91
- /audit-code
92
- ```
93
-
94
- without supplying extra root paths, provider flags, or model-selection arguments, or connect through the shared MCP server when the host prefers tool-driven integration.
95
-
96
- ## What is fully automated today
97
-
98
- - global `npm install -g auditor-lambda` seeds user-level Claude command and
99
- global Codex skill assets when filesystem permissions allow it
100
- - `/audit-code` runs `audit-code ensure --quiet` before advancing the audit
101
- - shared installer output, manifest generation, and repo-local MCP launcher generation
102
- - default backend fallback session-config creation when no config exists yet
103
- - Codex global-skill and AGENTS-oriented install output
104
- - OpenCode command, skill, prompt, and config generation
105
- - VS Code prompt, custom-agent, instruction, and MCP config generation
106
- - Claude Desktop project-template, remote-connector, and local bundle generation
107
- - Antigravity planning-mode guidance generation
108
-
109
- ## What is not fully automated today
110
-
111
- - product-level smoke validation for the generated Codex, Claude Desktop, OpenCode, VS Code, and Antigravity assets
112
- - one-click proof that the generated Claude Desktop bundle installs cleanly in a real Desktop environment
113
- - documented Antigravity artifact round-tripping back through `import_results` and `import_runtime_updates`
114
-
115
- For those gaps, the bootstrap command now writes the repo-local assets and guidance, but the final operator experience still needs end-to-end host verification.
116
-
117
- Use `.audit-code/install/GETTING-STARTED.md` as the low-guess repo-local handoff, and treat `.audit-code/install/manifest.json` as the machine-readable source of truth for what was generated.
118
-
119
- ## Narrow compatibility alias
120
-
121
- The older host-specific helper still exists:
122
-
123
- ```bash
124
- audit-code install-host --host copilot
125
- ```
126
-
127
- Use it only when you intentionally want the smaller Copilot-only install path instead of the default bootstrap.
128
-
129
- ## Remaining steps
130
-
131
- The installer foundation is now in place. The remaining work is:
132
-
133
- 1. smoke-test each claimed host in the real product, not only via file-generation tests
134
- 2. tighten `GETTING-STARTED.md` and host-specific setup docs where those smoke tests show friction
135
- 3. prove the Claude Desktop local bundle install path operationally
136
- 4. document Antigravity artifact-import workflows more concretely
package/docs/contract.md DELETED
@@ -1,54 +0,0 @@
1
- # audit-code Response Contract
2
-
3
- This document follows [audit-goals.md](C:/Code/auditor-lambda/spec/audit-goals.md).
4
-
5
- ## Canonical output
6
-
7
- The authoritative completed-audit output is repo-root `audit-report.md`.
8
-
9
- Until completion, the wrapper response remains a JSON envelope with:
10
-
11
- - `contract_version`
12
- - `audit_state`
13
- - `selected_obligation`
14
- - `selected_executor`
15
- - `progress_made`
16
- - `artifacts_written`
17
- - `progress_summary`
18
- - `next_likely_step`
19
- - `handoff`
20
-
21
- ## AuditResult contract
22
-
23
- Workers submit `AuditResult[]` shaped by `schemas/audit_result.schema.json`.
24
-
25
- Important rules:
26
-
27
- - `file_coverage` is required and must include every assigned file.
28
- - `file_coverage` must not include files outside the assigned task.
29
- - `file_coverage[].total_lines` must match the current file line count.
30
- - `task_id`, `unit_id`, `pass_id`, and `lens` must match the assigned task.
31
- - each finding lens must match the assigned task lens.
32
- - `findings[].affected_files` must be objects, not strings.
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.
37
-
38
- Use `audit-code validate-results --results <file>` before ingestion to validate
39
- results against the active task manifest.
40
-
41
- ## Internal artifacts during incomplete runs
42
-
43
- The engine may keep resumable artifacts under `.audit-artifacts/`, including:
44
-
45
- - intake/structure/planning artifacts
46
- - `audit_tasks.json`
47
- - `audit_results.jsonl`
48
- - `requeue_tasks.json`
49
- - `runtime_validation_tasks.json`
50
- - `runtime_validation_report.json` when runtime validation is planned
51
- - dispatch files for the active worker task
52
-
53
- These artifacts are internal and transient. On successful completion, they are
54
- cleared out and only `audit-report.md` remains.
@@ -1,302 +0,0 @@
1
- # Dispatch Automation Reference
2
-
3
- This document describes the implemented review-dispatch path for `/audit-code`.
4
- The original dispatch plan was one agent per audit task. The current path keeps
5
- the existing `AuditTask` and `AuditResult` contracts, but groups related tasks
6
- into review packets so a worker can read a coherent file set once and submit
7
- one validated result for each assigned task through a backend-owned write path.
8
-
9
- ## Current Workflow
10
-
11
- ```text
12
- 1. audit-code
13
- -> advances deterministic state until semantic review is needed
14
- -> emits a blocked handoff with active_review_run.run_id
15
-
16
- 2. audit-code prepare-dispatch --run-id <run_id> --artifacts-dir <artifacts_dir>
17
- -> reads pending-audit-tasks.json and review planning artifacts
18
- -> writes a slim dispatch-plan.json
19
- -> writes backend-owned dispatch-result-map.json
20
- -> writes one packet prompt per dispatch-plan entry
21
- -> prints one compact JSON envelope
22
-
23
- 3. Conversation orchestrator reads only dispatch-plan.json
24
- -> launches one subagent per packet
25
- -> each subagent reads its packet prompt and assigned files
26
- -> each subagent pipes AuditResult[] to the submit-packet command in the prompt
27
- -> submit-packet validates and writes only backend-assigned result files
28
- -> each subagent replies: valid: <packet_id>, findings=<n>
29
-
30
- 4. audit-code merge-and-ingest --run-id <run_id> --artifacts-dir <artifacts_dir>
31
- -> validates that every assigned task has exactly one valid result
32
- -> rejects missing, unknown, duplicate, malformed, or out-of-scope results
33
- -> writes audit-results.json as the existing AuditResult[] shape
34
- -> ingests accepted results through the normal result_ingestion_executor
35
- -> prints one compact JSON envelope
36
-
37
- 5. Repeat `audit-code` until complete.
38
- ```
39
-
40
- The parent orchestrator should not read prompt files, pending tasks, completed
41
- task result payloads, or source files during the packet dispatch path unless a
42
- backend command fails and the error requires diagnosis.
43
-
44
- ## Planning Artifacts
45
-
46
- Planning writes two packet-specific artifacts alongside the existing task and
47
- coverage artifacts:
48
-
49
- - `review_packets.json`: deterministic packets derived from current
50
- `AuditTask` records.
51
- - `audit_plan_metrics.json`: task count, packet count, repeated file/line
52
- estimates, largest packet, and estimated agent-count reduction.
53
-
54
- Packets preserve task identity. They change the worker-facing unit of work, not
55
- the backend-owned validation or ingestion contract.
56
-
57
- ## Packet Construction
58
-
59
- Packet planning is deterministic and compatibility-preserving:
60
-
61
- - tasks sharing the same file set and scope are grouped across lenses
62
- - tiny homogeneous test files are batched before dispatch
63
- - graph edges from imports, calls, and references can merge related task groups
64
- - heuristic container edges do not force packet expansion
65
- - packet chunking respects task-count and line-budget limits
66
- - a single file that exceeds the packet target is isolated rather than split
67
- - high-priority packets sort ahead of lower-priority packets
68
-
69
- Generated packets include:
70
-
71
- ```json
72
- {
73
- "packet_id": "src-auth:security-correctness:packet-1-...",
74
- "task_ids": ["src-auth:security", "src-auth:correctness"],
75
- "lenses": ["security", "correctness"],
76
- "file_paths": ["src/api/auth.ts", "src/lib/session.ts"],
77
- "total_lines": 70,
78
- "estimated_tokens": 1180
79
- }
80
- ```
81
-
82
- ## `prepare-dispatch` Output
83
-
84
- Command:
85
-
86
- ```bash
87
- audit-code prepare-dispatch --run-id <run_id> --artifacts-dir <artifacts_dir>
88
- ```
89
-
90
- Artifacts:
91
-
92
- - `<artifacts_dir>/runs/<run_id>/dispatch-plan.json`
93
- - `<artifacts_dir>/runs/<run_id>/dispatch-result-map.json`
94
- - `<artifacts_dir>/runs/<run_id>/task-results/<packet_id>.prompt.md`
95
- - `<artifacts_dir>/runs/<run_id>/task-results/<packet_id>.anchors.json`,
96
- only for isolated large-file packets
97
- - `<artifacts_dir>/runs/<run_id>/dispatch-warnings.json`, only when warnings
98
- exist
99
-
100
- The command prints a compact JSON envelope:
101
-
102
- ```json
103
- {
104
- "run_id": "run-1",
105
- "dispatch_plan_path": ".audit-artifacts/runs/run-1/dispatch-plan.json",
106
- "packet_count": 4,
107
- "task_count": 18,
108
- "largest_packet": {
109
- "packet_id": "src-auth:security-correctness:packet-1-...",
110
- "total_lines": 1320,
111
- "estimated_tokens": 6180
112
- },
113
- "warning_count": 0,
114
- "dispatch_warnings_path": null
115
- }
116
- ```
117
-
118
- `dispatch-plan.json` entries are intentionally small:
119
-
120
- ```json
121
- {
122
- "packet_id": "src-auth:security-correctness:packet-1-...",
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",
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
- }
139
- }
140
- ```
141
-
142
- The orchestrator should launch one subagent per entry with the entry
143
- description and a prompt that tells the subagent to read and follow
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.
149
-
150
- ## Large File Mode
151
-
152
- The workflow does not impose a hard single-file size limit. When a packet is
153
- large because it contains one large file, `prepare-dispatch` keeps that file in
154
- an isolated packet and writes a mechanical anchor summary next to the packet
155
- prompt. The anchor summary may include:
156
-
157
- - file boundaries
158
- - imports and exports
159
- - top-level symbols
160
- - route-like declarations
161
- - risk keywords
162
- - graph edges
163
- - external analyzer signals
164
-
165
- The packet prompt points the worker at the anchor file and asks for targeted
166
- reads/searches within the assigned file. The backend still validates and writes
167
- results through `submit-packet`. This keeps large-file review bounded by
168
- mechanically generated structure without slicing files into arbitrary line
169
- ranges.
170
-
171
- ## Packet Prompt Contract
172
-
173
- Each packet prompt tells the worker to:
174
-
175
- - review the packet once
176
- - read only the listed repo-relative files
177
- - produce one JSON object per listed task
178
- - pipe one JSON array to the prompt's `submit-packet` command
179
- - preserve the existing `AuditResult` fields:
180
- `task_id`, `unit_id`, `pass_id`, `lens`, `file_coverage`, `findings`
181
- - keep `file_coverage[]` as `{ path, total_lines }`
182
- - keep every finding lens equal to the task lens
183
- - avoid direct file writes, source edits, remediation, extra task results, and
184
- unrelated audits
185
- - reply exactly `valid: <packet_id>, findings=<total finding count>` after the
186
- submit command accepts the packet
187
-
188
- This keeps packet review efficient while leaving merge and ingestion
189
- mechanically deterministic.
190
-
191
- ## Submission and Validation
192
-
193
- Packet submission is exposed through:
194
-
195
- ```bash
196
- audit-code submit-packet --run-id <run_id> --packet-id <packet_id> --artifacts-dir <artifacts_dir>
197
- ```
198
-
199
- The command reads `AuditResult[]` from stdin, validates the complete assigned
200
- packet, and writes only the backend-assigned per-task result paths from
201
- `dispatch-result-map.json`. This keeps result writes out of the LLM prompt and
202
- prevents swapped or unknown task result files from being ingested.
203
-
204
- Per-task validation is exposed through:
205
-
206
- ```bash
207
- audit-code validate-result --run-id <run_id> --task-id <task_id> --artifacts-dir <artifacts_dir>
208
- ```
209
-
210
- Generated packet prompts may pass run ids, packet ids, task ids, and artifact paths through
211
- base64url flags such as `--run-id-b64`, `--packet-id-b64`, `--task-id-b64`, and
212
- `--artifacts-dir-b64` when raw values could contain shell-sensitive characters.
213
-
214
- The validator checks the result against the assigned task set and enforces the
215
- mechanical constraints that matter for ingestion:
216
-
217
- - required `AuditResult` and finding fields
218
- - finding lens matches the task lens
219
- - cited and affected paths are in assigned coverage
220
- - line spans do not exceed known `total_lines`
221
- - result fields conform to the shipped schemas
222
-
223
- Workers should retry rejected submissions up to the bounded retry count in the prompt.
224
-
225
- ## `merge-and-ingest` Output
226
-
227
- Command:
228
-
229
- ```bash
230
- audit-code merge-and-ingest --run-id <run_id> --artifacts-dir <artifacts_dir>
231
- ```
232
-
233
- Merge behavior:
234
-
235
- - validates every backend-assigned result-map path
236
- - rejects unexpected JSON files under `task-results/`
237
- - rejects task IDs that appear in the wrong assigned result path
238
- - rejects duplicate task results
239
- - rejects unknown task IDs
240
- - rejects missing assigned task results
241
- - writes `failed-tasks.json` and exits non-zero when any assigned result is
242
- missing or invalid
243
- - writes `audit-results.json` only from passing results
244
- - invokes the normal result ingestion path only after the assigned set is clean
245
-
246
- On success the command prints one compact JSON envelope:
247
-
248
- ```json
249
- {
250
- "run_id": "run-1",
251
- "status": "completed",
252
- "accepted_count": 18,
253
- "rejected_count": 0,
254
- "finding_count": 3,
255
- "audit_results_path": ".audit-artifacts/runs/run-1/audit-results.json",
256
- "selected_executor": "result_ingestion_executor",
257
- "progress_made": true,
258
- "progress_summary": "Ingested 18 audit result entries and refreshed dependent artifacts.",
259
- "next_likely_step": "runtime_validation"
260
- }
261
- ```
262
-
263
- If the command exits non-zero, the orchestrator should stop and report the exact
264
- error instead of manually editing task results or audit state.
265
-
266
- ## Selective Deepening
267
-
268
- Result ingestion may add follow-up `AuditTask` records for bounded selective
269
- deepening. Triggers include:
270
-
271
- - high-severity findings
272
- - low-confidence or ambiguous findings
273
- - conflicting conclusions across related results
274
- - high-risk no-finding sampling unless explicitly marked unnecessary
275
- - runtime-validation disagreement
276
-
277
- When follow-up tasks are added, the backend refreshes `review_packets.json` and
278
- `audit_plan_metrics.json`. The next dispatch cycle handles those tasks through
279
- the same packet contract.
280
-
281
- ## Compatibility Notes
282
-
283
- - `AuditTask` remains the planning and coverage identity.
284
- - `AuditResult[]` remains the ingestion shape.
285
- - The older `.audit-artifacts/dispatch/current-*` files still exist for
286
- repo-local backend fallback and single-task handoff flows.
287
- - Backend provider adapters remain compatibility bridges. The canonical
288
- `/audit-code` flow expects the active conversation orchestrator to dispatch
289
- packet subagents when the host supports them.
290
- - The `dispatch/` directory is packaged because `lens-definitions.json` and
291
- validation support are part of the installed packet workflow.
292
-
293
- ## Verification
294
-
295
- Run the normal project gate:
296
-
297
- ```bash
298
- npm test
299
- ```
300
-
301
- Focused packet coverage lives in `tests/review-packets.test.mjs` and
302
- `tests/audit-code-wrapper.test.mjs`.