@zhixuan92/multi-model-agent-core 4.0.6 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bounded-execution/index.d.ts +2 -0
- package/dist/bounded-execution/index.d.ts.map +1 -1
- package/dist/bounded-execution/index.js +2 -0
- package/dist/bounded-execution/index.js.map +1 -1
- package/dist/bounded-execution/safety-max-turns.d.ts +17 -0
- package/dist/bounded-execution/safety-max-turns.d.ts.map +1 -0
- package/dist/bounded-execution/safety-max-turns.js +17 -0
- package/dist/bounded-execution/safety-max-turns.js.map +1 -0
- package/dist/bounded-execution/stall-watchdog.d.ts +16 -0
- package/dist/bounded-execution/stall-watchdog.d.ts.map +1 -0
- package/dist/bounded-execution/stall-watchdog.js +69 -0
- package/dist/bounded-execution/stall-watchdog.js.map +1 -0
- package/dist/intake/brief-compiler-slots/delegate.d.ts +18 -0
- package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
- package/dist/intake/brief-compiler-slots/delegate.js +36 -3
- package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
- package/dist/lifecycle/handlers/execution-context-builder.d.ts.map +1 -1
- package/dist/lifecycle/handlers/execution-context-builder.js +2 -1
- package/dist/lifecycle/handlers/execution-context-builder.js.map +1 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.js +10 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -1
- package/dist/lifecycle/parallel-criteria-dispatcher.d.ts +62 -0
- package/dist/lifecycle/parallel-criteria-dispatcher.d.ts.map +1 -0
- package/dist/lifecycle/parallel-criteria-dispatcher.js +328 -0
- package/dist/lifecycle/parallel-criteria-dispatcher.js.map +1 -0
- package/dist/lifecycle/parallel-criteria-routes.d.ts +16 -0
- package/dist/lifecycle/parallel-criteria-routes.d.ts.map +1 -0
- package/dist/lifecycle/parallel-criteria-routes.js +147 -0
- package/dist/lifecycle/parallel-criteria-routes.js.map +1 -0
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +268 -97
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-messages-adapter.js +8 -1
- package/dist/providers/anthropic-messages-adapter.js.map +1 -1
- package/dist/providers/provider-factory.d.ts.map +1 -1
- package/dist/providers/provider-factory.js +2 -1
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/providers/runner-adapter.d.ts +8 -0
- package/dist/providers/runner-adapter.d.ts.map +1 -1
- package/dist/providers/runner-shell-types.d.ts +7 -0
- package/dist/providers/runner-shell-types.d.ts.map +1 -1
- package/dist/providers/runner-shell.d.ts +51 -1
- package/dist/providers/runner-shell.d.ts.map +1 -1
- package/dist/providers/runner-shell.js +130 -0
- package/dist/providers/runner-shell.js.map +1 -1
- package/dist/reporting/report-parser-slots/investigate-report.d.ts.map +1 -1
- package/dist/reporting/report-parser-slots/investigate-report.js +41 -2
- package/dist/reporting/report-parser-slots/investigate-report.js.map +1 -1
- package/dist/review/annotator-engine.d.ts +7 -1
- package/dist/review/annotator-engine.d.ts.map +1 -1
- package/dist/review/annotator-engine.js +15 -2
- package/dist/review/annotator-engine.js.map +1 -1
- package/dist/review/annotator-prompt-builder.d.ts.map +1 -1
- package/dist/review/annotator-prompt-builder.js +10 -2
- package/dist/review/annotator-prompt-builder.js.map +1 -1
- package/dist/review/reviewer-engine.d.ts.map +1 -1
- package/dist/review/reviewer-engine.js +4 -3
- package/dist/review/reviewer-engine.js.map +1 -1
- package/dist/review/templates/annotator-audit.d.ts.map +1 -1
- package/dist/review/templates/annotator-audit.js +5 -3
- package/dist/review/templates/annotator-audit.js.map +1 -1
- package/dist/review/templates/annotator-debug.d.ts.map +1 -1
- package/dist/review/templates/annotator-debug.js +11 -7
- package/dist/review/templates/annotator-debug.js.map +1 -1
- package/dist/review/templates/annotator-investigate.d.ts.map +1 -1
- package/dist/review/templates/annotator-investigate.js +6 -3
- package/dist/review/templates/annotator-investigate.js.map +1 -1
- package/dist/review/templates/annotator-review.d.ts.map +1 -1
- package/dist/review/templates/annotator-review.js +13 -6
- package/dist/review/templates/annotator-review.js.map +1 -1
- package/dist/review/templates/annotator-shared.d.ts +8 -1
- package/dist/review/templates/annotator-shared.d.ts.map +1 -1
- package/dist/review/templates/annotator-shared.js.map +1 -1
- package/dist/review/templates/annotator-verify.d.ts.map +1 -1
- package/dist/review/templates/annotator-verify.js +11 -5
- package/dist/review/templates/annotator-verify.js.map +1 -1
- package/dist/tools/audit/implementer-criteria.d.ts +60 -4
- package/dist/tools/audit/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/audit/implementer-criteria.js +118 -11
- package/dist/tools/audit/implementer-criteria.js.map +1 -1
- package/dist/tools/audit/schema.d.ts +3 -10
- package/dist/tools/audit/schema.d.ts.map +1 -1
- package/dist/tools/audit/schema.js +3 -4
- package/dist/tools/audit/schema.js.map +1 -1
- package/dist/tools/audit/tool-config.d.ts.map +1 -1
- package/dist/tools/audit/tool-config.js +70 -36
- package/dist/tools/audit/tool-config.js.map +1 -1
- package/dist/tools/criteria-types.d.ts +27 -0
- package/dist/tools/criteria-types.d.ts.map +1 -0
- package/dist/tools/criteria-types.js +25 -0
- package/dist/tools/criteria-types.js.map +1 -0
- package/dist/tools/debug/implementer-criteria.d.ts +47 -4
- package/dist/tools/debug/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/debug/implementer-criteria.js +104 -13
- package/dist/tools/debug/implementer-criteria.js.map +1 -1
- package/dist/tools/debug/tool-config.d.ts.map +1 -1
- package/dist/tools/debug/tool-config.js +31 -4
- package/dist/tools/debug/tool-config.js.map +1 -1
- package/dist/tools/delegate/implementer-criteria.d.ts +62 -0
- package/dist/tools/delegate/implementer-criteria.d.ts.map +1 -0
- package/dist/tools/delegate/implementer-criteria.js +114 -0
- package/dist/tools/delegate/implementer-criteria.js.map +1 -0
- package/dist/tools/execute-plan/implementer-criteria.d.ts +52 -0
- package/dist/tools/execute-plan/implementer-criteria.d.ts.map +1 -0
- package/dist/tools/execute-plan/implementer-criteria.js +104 -0
- package/dist/tools/execute-plan/implementer-criteria.js.map +1 -0
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +17 -3
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/investigate/implementer-criteria.d.ts +51 -5
- package/dist/tools/investigate/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/investigate/implementer-criteria.js +109 -13
- package/dist/tools/investigate/implementer-criteria.js.map +1 -1
- package/dist/tools/investigate/tool-config.d.ts.map +1 -1
- package/dist/tools/investigate/tool-config.js +20 -8
- package/dist/tools/investigate/tool-config.js.map +1 -1
- package/dist/tools/parallel-criteria-prompt.d.ts +106 -0
- package/dist/tools/parallel-criteria-prompt.d.ts.map +1 -0
- package/dist/tools/parallel-criteria-prompt.js +86 -0
- package/dist/tools/parallel-criteria-prompt.js.map +1 -0
- package/dist/tools/review/implementer-criteria.d.ts +50 -1
- package/dist/tools/review/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/review/implementer-criteria.js +113 -9
- package/dist/tools/review/implementer-criteria.js.map +1 -1
- package/dist/tools/review/tool-config.d.ts.map +1 -1
- package/dist/tools/review/tool-config.js +50 -7
- package/dist/tools/review/tool-config.js.map +1 -1
- package/dist/tools/verify/implementer-criteria.d.ts +49 -0
- package/dist/tools/verify/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/verify/implementer-criteria.js +104 -8
- package/dist/tools/verify/implementer-criteria.js.map +1 -1
- package/dist/tools/verify/tool-config.d.ts.map +1 -1
- package/dist/tools/verify/tool-config.js +22 -2
- package/dist/tools/verify/tool-config.js.map +1 -1
- package/dist/types/run-result.d.ts +18 -0
- package/dist/types/run-result.d.ts.map +1 -1
- package/dist/types/task-spec.d.ts +11 -0
- package/dist/types/task-spec.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,33 +1,129 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Investigate-specific implementer criteria.
|
|
3
3
|
*
|
|
4
|
+
* INVESTIGATE'S PURPOSE — read this before adding categories.
|
|
5
|
+
* mma-investigate answers a question about the codebase. The caller is
|
|
6
|
+
* about to ACT on your answer — write code, edit a file, choose between
|
|
7
|
+
* approaches. The success criterion is:
|
|
8
|
+
*
|
|
9
|
+
* "If the caller acts on this answer literally — opens the cited
|
|
10
|
+
* files, follows the cited chain, takes the synthesis at face value
|
|
11
|
+
* — will they end up with correct code?"
|
|
12
|
+
*
|
|
13
|
+
* That criterion is what makes a finding load-bearing. A wrong file
|
|
14
|
+
* path, a stale quote, a hand-waved synthesis, an overstated confidence
|
|
15
|
+
* — all become bugs the caller writes. The investigate-equivalent of
|
|
16
|
+
* "fix is unimplementable" is "the answer points at a file that does
|
|
17
|
+
* not contain what you said it contained."
|
|
18
|
+
*
|
|
4
19
|
* Investigate answers a question about the codebase. Findings can be
|
|
5
20
|
* code-level citations, project-level synthesis, or NEGATIVE results
|
|
6
|
-
* ("searched X, not found").
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* "where does Y live?".
|
|
21
|
+
* ("searched X, not found"). Negative findings are legitimate answers
|
|
22
|
+
* to "is X still used?" or "where does Y live?" and must not be
|
|
23
|
+
* suppressed.
|
|
10
24
|
*
|
|
11
25
|
* Note: investigate does NOT use SEVERITY_LADDER — its findings are
|
|
12
|
-
* citations and synthesis, not severity-rated issues.
|
|
26
|
+
* citations and synthesis, not severity-rated issues. Confidence is the
|
|
27
|
+
* calibration dial, not severity.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The orientation block. Goes at the TOP of every investigate prompt.
|
|
31
|
+
*
|
|
32
|
+
* Without an explicit purpose statement, workers default to "give a
|
|
33
|
+
* plausible-sounding answer" — which produces hallucinated citations
|
|
34
|
+
* and overstated confidence. With this orientation, every claim is
|
|
35
|
+
* ground-truthed against the file system.
|
|
13
36
|
*/
|
|
37
|
+
export const INVESTIGATE_PURPOSE_ORIENTATION = [
|
|
38
|
+
'Why this investigation exists:',
|
|
39
|
+
'mma-investigate is the answer-and-act loop. The caller will use your answer to make code edits — open the cited files, take the synthesis at face value, choose an approach based on your confidence rating. A wrong file path becomes a bug; a stale quote becomes a wrong edit; an overstated confidence becomes a misallocated effort.',
|
|
40
|
+
'',
|
|
41
|
+
'For your output to clear that bar, every load-bearing claim must answer:',
|
|
42
|
+
'- Where exactly is this — file:line for present things, or "searched <pattern> in <path>, not found" for absent things?',
|
|
43
|
+
'- Did I read the file just now, or am I reasoning from training data? (only the former counts as evidence)',
|
|
44
|
+
'- For synthesis claims (e.g. "X is used by Y via Z"), is each link in the chain backed by a file:line?',
|
|
45
|
+
'- Is my confidence calibrated to evidence strength, or to how certain I sound?',
|
|
46
|
+
'',
|
|
47
|
+
'A claim without a citation is a guess. A citation that does not match the file currently on disk is a hallucination. A "high confidence" verdict on a synthesis with one weak link is overstatement.',
|
|
48
|
+
'',
|
|
49
|
+
'The completion test: would a caller who reads only your investigation report and the named files end up with the same answer if they re-investigated themselves — or would they find the cited file does not say what you said it said?',
|
|
50
|
+
].join('\n');
|
|
14
51
|
export const EVIDENCE_RULE_INVESTIGATE = [
|
|
15
52
|
'Evidence grounding (REQUIRED for every citation):',
|
|
16
|
-
'- For present things: `file:line` (or `file:line-line` for spans) plus a quote or summary of what you found.',
|
|
53
|
+
'- For present things: `file:line` (or `file:line-line` for spans) plus a quote or summary of what you found. The cited line MUST contain the cited content as of your read — do NOT cite from training-data memory.',
|
|
17
54
|
'- For absent things: explicit `searched <pattern> in <path>, no matches` — negative findings are legitimate answers and should be emitted, not suppressed.',
|
|
18
|
-
'- For synthesis findings (e.g. "X uses Y indirectly via Z"): cite each link in the chain by `file:line`.',
|
|
55
|
+
'- For synthesis findings (e.g. "X uses Y indirectly via Z"): cite each link in the chain by `file:line`. A synthesis claim with even one un-cited link is a hand-wave.',
|
|
56
|
+
'- For project-level claims that no single file demonstrates (e.g. "the codebase has no shared error type"): write the negative ("searched the repo for `class.*Error` declarations: only X, Y, Z found, none shared") rather than asserting the absence without evidence.',
|
|
57
|
+
'- If you have not read a file, do NOT cite from it. Reasoning-from-training-data is the most common hallucination source — refuse it explicitly.',
|
|
19
58
|
].join('\n');
|
|
20
59
|
export const SCOPE_RULE_INVESTIGATE = [
|
|
21
60
|
'Scope:',
|
|
22
61
|
'- Wherever the question leads. The question may not name files; you choose where to look.',
|
|
23
|
-
'-
|
|
62
|
+
'- If the question is broad (e.g. "how does X work overall?"), break it into sub-questions and answer each with citations rather than producing one un-grounded narrative.',
|
|
63
|
+
'- Out of scope: drift into issues unrelated to the question; opportunistic code review of the code you are investigating (raise that separately, not as an investigation finding); fixes / suggestions / improvements (this is a read-only Q&A — propose nothing).',
|
|
64
|
+
].join('\n');
|
|
65
|
+
/**
|
|
66
|
+
* The failure-mode taxonomy for investigations.
|
|
67
|
+
*
|
|
68
|
+
* Without this block, workers tend to give plausible-sounding answers
|
|
69
|
+
* with shaky citations. The 8 categories below are the specific ways
|
|
70
|
+
* an investigation answer becomes a bug when the caller acts on it.
|
|
71
|
+
*/
|
|
72
|
+
export const INVESTIGATE_FAILURE_MODES = [
|
|
73
|
+
'Five parallel perspectives for ANSWERING the user\'s question. From your assigned perspective, propose one or more candidate answers (or sub-answers) to the question. Each finding is a candidate answer; severity = your confidence in this answer. Pay extra care to AVOID common citation-quality failures (no hallucinated file:line; no quoting from memory — always re-read).',
|
|
74
|
+
'',
|
|
75
|
+
'1. DIRECT-SYMBOL-TRACE PERSPECTIVE — start from the symbols/files named in the question (or directly implied by it). Read the named file(s) top-to-bottom, follow imports/calls/types step-by-step. Your candidate answer is the chain of file:line references that, when followed in order, mechanically resolves the question.',
|
|
76
|
+
'2. CALLER-ANALYSIS PERSPECTIVE — grep for callers/consumers of the symbols in the question. Who depends on this code? What do they pass / expect / assert? Your candidate answer comes from the contract the callers assume — the question often resolves to "this code does X because callers depend on X".',
|
|
77
|
+
'3. TEST-DRIVEN PERSPECTIVE — find sibling tests for the symbols/files in question (test files often co-located or under tests/). Read what the tests assert about the behavior. Your candidate answer is "the tests show the intended behavior is X" — backed by test name + assertion citation.',
|
|
78
|
+
'4. CROSS-FILE DEPENDENCY-MAP PERSPECTIVE — what other modules participate in the data path / orchestration around the question? Map the boundary: which files import the named symbols, which configure them, which receive their output. Your candidate answer comes from the system-level picture — "the answer involves X handing off to Y, configured by Z".',
|
|
79
|
+
'5. DOCUMENTATION/COMMENT-LENS PERSPECTIVE — read docstrings, README, design docs, in-code comments adjacent to the symbols. Sometimes the answer is stated in prose by the original author. Your candidate answer is the prose explanation, cited; cross-check it against current code (docs may be stale).',
|
|
80
|
+
'',
|
|
81
|
+
'Confidence calibration for each candidate answer:',
|
|
82
|
+
'- critical: THE answer — multiple grounded file:line citations from THIS perspective, no inferred steps in the chain. The user can act on this without re-verification.',
|
|
83
|
+
'- high: strong answer — fully grounded with file:line, evidence chain has at most one inferred step. The user should sanity-check the inferred step.',
|
|
84
|
+
'- medium: likely / partial answer — cited inference from this perspective; some gaps in the chain. Mark "verify by reading <file>" so the user knows where to confirm.',
|
|
85
|
+
'- low: candidate / weak answer — minimal evidence from this perspective, presented as an alternative for the user to weigh against other perspectives\' answers. Better than silence — silence loses information the merge annotator could rank.',
|
|
86
|
+
'',
|
|
87
|
+
'Quality discipline (apply WITHIN your perspective, do not let it stop you from emitting):',
|
|
88
|
+
'- Always re-read files this session before quoting — never quote from memory.',
|
|
89
|
+
'- Verify every file:line citation actually exists on disk at that range.',
|
|
90
|
+
'- If your perspective produces multiple distinct candidate answers (e.g. caller-analysis surfaces two callers with conflicting expectations), emit BOTH as separate findings.',
|
|
91
|
+
'- Do not pad — but absent total impossibility, every perspective should produce at least one candidate (even low confidence). The merge annotator will dedup and rank.',
|
|
92
|
+
].join('\n');
|
|
93
|
+
/**
|
|
94
|
+
* Confidence-discipline reminder.
|
|
95
|
+
*
|
|
96
|
+
* The shared SEVERITY_LADDER does not apply to investigate (findings
|
|
97
|
+
* are citations, not severity-rated). Instead, confidence is the
|
|
98
|
+
* calibration dial. The common failure mode is over-confidence —
|
|
99
|
+
* stating "high confidence" because the worker sounds certain,
|
|
100
|
+
* not because the evidence is strong. This block tells the worker
|
|
101
|
+
* confidence reflects evidence strength only.
|
|
102
|
+
*/
|
|
103
|
+
export const CONFIDENCE_REMINDER_INVESTIGATE = [
|
|
104
|
+
'Confidence-discipline reminder:',
|
|
105
|
+
'- Confidence reflects EVIDENCE STRENGTH (how completely the citation chain supports the answer), not ASSERTION STRENGTH (how certain you sound).',
|
|
106
|
+
'- For each load-bearing claim, ask: "if the caller followed this citation and re-read the file themselves, would they reach the same conclusion?" If yes for every claim → `high`. If yes for most but inference fills the gaps → `medium`. If significant gaps remain → `low`.',
|
|
107
|
+
'- Do NOT use confidence to communicate certainty about the question being answered. Use it to communicate certainty that your answer is CORRECT given your evidence.',
|
|
108
|
+
'- A short investigation that found a clean answer can legitimately be `high`. A long investigation that found a partial answer is `medium` or `low`, no matter how thorough it felt.',
|
|
109
|
+
'',
|
|
110
|
+
'Citation-chain walk (REQUIRED on every load-bearing claim):',
|
|
111
|
+
'- Before writing the Summary, list every claim that drives the answer. For each, ask: "do I have a file:line for this, and did I read the file in this session?"',
|
|
112
|
+
'- If the answer to either is no, the claim is inference. Either downgrade Confidence, or add the citation by reading the file now.',
|
|
113
|
+
'- Worked example. Question: "how does the audit prompt assemble the failure-mode taxonomy?" Naive answer: "The audit tool config imports DOC_AUDIT_FAILURE_MODES from implementer-criteria.ts and joins it into the prompt — confidence: high." Better answer: cite the import line (e.g. `tool-config.ts:14 — import { DOC_AUDIT_FAILURE_MODES, ... }`) AND the consumer line where it is joined into the prompt (e.g. `tool-config.ts:152 — DOC_AUDIT_FAILURE_MODES,` inside the FINDING_FORMAT_INSTRUCTIONS array). Two citations, both verified by reading the file → high confidence is now backed. The naive version asserts the same conclusion but with no actual file:line; if the file has been refactored, the answer is silently wrong.',
|
|
114
|
+
'- Most workers miss findings of this shape on first pass because the answer "feels right". The citation-chain walk forces the file-system check.',
|
|
24
115
|
].join('\n');
|
|
25
116
|
export const ANNOTATOR_AWARENESS_INVESTIGATE = [
|
|
26
117
|
'After your output, an annotator validates each finding against this investigate rubric:',
|
|
27
|
-
'- Does each
|
|
28
|
-
'- Are present-thing citations to real `file:line` from files
|
|
29
|
-
'- Are negative findings explicit ("searched X, not found") rather than silent omissions?',
|
|
30
|
-
'-
|
|
31
|
-
'
|
|
118
|
+
'- Does each citation answer some part of the question (not an adjacent question)?',
|
|
119
|
+
'- Are present-thing citations to real `file:line` from files actually read this session?',
|
|
120
|
+
'- Are negative findings explicit ("searched X in Y, not found") rather than silent omissions?',
|
|
121
|
+
'- For synthesis claims, is each link in the chain cited?',
|
|
122
|
+
'- Does the confidence reflect evidence strength (not assertion strength)?',
|
|
123
|
+
'- Is the answer to the asked question, not a shifted version of it?',
|
|
124
|
+
'Self-check before emitting. Findings that fail any check are downgraded or dropped — but negative findings ("searched, not found") and inference-with-citations ("I infer X from Y:42, Z:18") are FULLY VALID. Do NOT downgrade negative findings for lacking a code quote, and do NOT downgrade inference-with-citations as "speculation" if the cited links are real.',
|
|
32
125
|
].join('\n');
|
|
126
|
+
import { parseCriteria } from '../criteria-types.js';
|
|
127
|
+
/** Structured per-criterion array for parallel-criteria fan-out. */
|
|
128
|
+
export const INVESTIGATE_CRITERIA = parseCriteria(INVESTIGATE_FAILURE_MODES);
|
|
33
129
|
//# sourceMappingURL=implementer-criteria.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implementer-criteria.js","sourceRoot":"","sources":["../../../src/tools/investigate/implementer-criteria.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"implementer-criteria.js","sourceRoot":"","sources":["../../../src/tools/investigate/implementer-criteria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,gCAAgC;IAChC,2UAA2U;IAC3U,EAAE;IACF,0EAA0E;IAC1E,yHAAyH;IACzH,4GAA4G;IAC5G,wGAAwG;IACxG,gFAAgF;IAChF,EAAE;IACF,sMAAsM;IACtM,EAAE;IACF,yOAAyO;CAC1O,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,mDAAmD;IACnD,qNAAqN;IACrN,4JAA4J;IAC5J,wKAAwK;IACxK,2QAA2Q;IAC3Q,kJAAkJ;CACnJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,QAAQ;IACR,2FAA2F;IAC3F,2KAA2K;IAC3K,oQAAoQ;CACrQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,sXAAsX;IACtX,EAAE;IACF,kUAAkU;IAClU,8SAA8S;IAC9S,kSAAkS;IAClS,kWAAkW;IAClW,6SAA6S;IAC7S,EAAE;IACF,mDAAmD;IACnD,yKAAyK;IACzK,sJAAsJ;IACtJ,wKAAwK;IACxK,kPAAkP;IAClP,EAAE;IACF,2FAA2F;IAC3F,+EAA+E;IAC/E,0EAA0E;IAC1E,+KAA+K;IAC/K,wKAAwK;CACzK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,iCAAiC;IACjC,kJAAkJ;IAClJ,iRAAiR;IACjR,sKAAsK;IACtK,sLAAsL;IACtL,EAAE;IACF,6DAA6D;IAC7D,kKAAkK;IAClK,oIAAoI;IACpI,qtBAAqtB;IACrtB,kJAAkJ;CACnJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,yFAAyF;IACzF,mFAAmF;IACnF,0FAA0F;IAC1F,+FAA+F;IAC/F,0DAA0D;IAC1D,2EAA2E;IAC3E,qEAAqE;IACrE,yWAAyW;CAC1W,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,OAAO,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAE1E,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAA8B,aAAa,CAAC,yBAAyB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/investigate/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-config.d.ts","sourceRoot":"","sources":["../../../src/tools/investigate/tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2DAA2D,CAAC;AAazG,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAYvE;AAKD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAyB,SAAQ,KAAK;IACrD,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;OAUG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAkED,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,uBAAuB,CAgEtG,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { investigateReportSchema } from '../../reporting/report-parser-slots/inv
|
|
|
4
4
|
import { investigateHeadlineTemplate } from '../../reporting/headline-templates/investigate.js';
|
|
5
5
|
import { deriveInvestigateWorkerStatus } from '../../reporting/derive-investigate-status.js';
|
|
6
6
|
import { DEFAULT_TASK_TIMEOUT_MS } from '../../config/schema.js';
|
|
7
|
-
import { EVIDENCE_RULE_INVESTIGATE, SCOPE_RULE_INVESTIGATE, ANNOTATOR_AWARENESS_INVESTIGATE, } from './implementer-criteria.js';
|
|
7
|
+
import { INVESTIGATE_PURPOSE_ORIENTATION, EVIDENCE_RULE_INVESTIGATE, SCOPE_RULE_INVESTIGATE, ANNOTATOR_AWARENESS_INVESTIGATE, INVESTIGATE_FAILURE_MODES, CONFIDENCE_REMINDER_INVESTIGATE, } from './implementer-criteria.js';
|
|
8
8
|
export function registerInvestigate(registry) {
|
|
9
9
|
registry.register({
|
|
10
10
|
routeName: 'investigate',
|
|
@@ -20,6 +20,12 @@ export function registerInvestigate(registry) {
|
|
|
20
20
|
}
|
|
21
21
|
function compilePrompt(input) {
|
|
22
22
|
const promptParts = [];
|
|
23
|
+
// Orientation goes FIRST — the worker needs to know why this
|
|
24
|
+
// investigation exists (caller will act on this answer; wrong file
|
|
25
|
+
// path becomes a bug) before reading the format spec / taxonomy.
|
|
26
|
+
// Without it, workers default to plausible-sounding answers with
|
|
27
|
+
// shaky citations.
|
|
28
|
+
promptParts.push(INVESTIGATE_PURPOSE_ORIENTATION);
|
|
23
29
|
promptParts.push([
|
|
24
30
|
'Produce an investigation report in this EXACT structured format. The deterministic',
|
|
25
31
|
'parser extracts citations, confidence, and unresolved items by section — do NOT emit',
|
|
@@ -29,14 +35,15 @@ function compilePrompt(input) {
|
|
|
29
35
|
'One paragraph stating the answer to the question, in plain prose.',
|
|
30
36
|
'',
|
|
31
37
|
'## Citations',
|
|
32
|
-
'One bullet per evidence item,
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
'
|
|
38
|
+
'One bullet per evidence item. Each bullet must start with `-` and contain `<file>:<LINE> — <claim>` (em-dash, OR `--` is also accepted). The parser tolerates an optional pair of backticks wrapping the path:line portion (e.g. `` `src/foo.ts:42` — claim ``) but the canonical form is without backticks.',
|
|
39
|
+
'Examples (use either form):',
|
|
40
|
+
' - src/foo.ts:42 — claim about line 42',
|
|
41
|
+
' - src/foo.ts:42-58 — claim about a span',
|
|
42
|
+
'Use a LINE-LINE range when an evidence span covers multiple lines.',
|
|
43
|
+
'If the question is fully project-level (no code evidence applies), write `(none)` on its own line — but only when Confidence is `low`.',
|
|
37
44
|
'',
|
|
38
45
|
'## Confidence',
|
|
39
|
-
'One of
|
|
46
|
+
'One of high, medium, or low, optionally followed by ` — <one-line rationale>`. Do NOT wrap the level in backticks; emit it as plain text.',
|
|
40
47
|
'',
|
|
41
48
|
'## Unresolved',
|
|
42
49
|
'Optional bullets describing follow-up questions; write `(none)` if there are none.',
|
|
@@ -59,7 +66,7 @@ function compilePrompt(input) {
|
|
|
59
66
|
// but evidence-grounding + scope-discipline + annotator-awareness
|
|
60
67
|
// apply just as much. Workers that cite hallucinated lines or
|
|
61
68
|
// speculate about unread files now have the rubric inline.
|
|
62
|
-
promptParts.push(EVIDENCE_RULE_INVESTIGATE, SCOPE_RULE_INVESTIGATE, ANNOTATOR_AWARENESS_INVESTIGATE);
|
|
69
|
+
promptParts.push(INVESTIGATE_FAILURE_MODES, CONFIDENCE_REMINDER_INVESTIGATE, EVIDENCE_RULE_INVESTIGATE, SCOPE_RULE_INVESTIGATE, ANNOTATOR_AWARENESS_INVESTIGATE);
|
|
63
70
|
return promptParts.join('\n\n');
|
|
64
71
|
}
|
|
65
72
|
export const toolConfig = {
|
|
@@ -78,6 +85,11 @@ export const toolConfig = {
|
|
|
78
85
|
},
|
|
79
86
|
buildTaskSpec: (brief, ctx) => ({
|
|
80
87
|
prompt: brief.compiledPrompt,
|
|
88
|
+
// Pure user question for the parallel-criteria dispatcher's cached
|
|
89
|
+
// prefix — avoids embedding the legacy ## Summary/## Citations format
|
|
90
|
+
// spec from compiledPrompt, which would compete with the per-sub-worker
|
|
91
|
+
// ## Finding N: format the dispatcher uses.
|
|
92
|
+
parallelTarget: `Question: ${brief.question}`,
|
|
81
93
|
agentType: 'complex',
|
|
82
94
|
reviewPolicy: 'quality_only',
|
|
83
95
|
cwd: ctx.projectContext?.cwd ?? ctx.cwd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/investigate/tool-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAG7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2DAA2D,CAAC;AAEpG,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,mBAAmB,CAAC,QAA6B;IAC/D,QAAQ,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,WAAW;QACnB,YAAY,EAAE,WAAW;QACzB,gBAAgB,EAAE,SAAS;QAC3B,oBAAoB,EAAE,KAAK;QAC3B,iBAAiB,EAAE,eAAe;KACnC,CAAC,CAAC;AACL,CAAC;AAoCD,SAAS,aAAa,CAAC,KAA+B;IACpD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,WAAW,CAAC,IAAI,CACd;QACE,oFAAoF;QACpF,sFAAsF;QACtF,sFAAsF;QACtF,EAAE;QACF,YAAY;QACZ,mEAAmE;QACnE,EAAE;QACF,cAAc;QACd,
|
|
1
|
+
{"version":3,"file":"tool-config.js","sourceRoot":"","sources":["../../../src/tools/investigate/tool-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { CriterionEntry } from './criteria-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-route semantics for findings. Same wire shape (`## Finding N:`) and
|
|
4
|
+
* same severity tiers (critical / high / medium / low) across all five
|
|
5
|
+
* read-only routes — only the *meaning* of each tier and the per-sub-worker
|
|
6
|
+
* goal differ.
|
|
7
|
+
*
|
|
8
|
+
* Audit / review / debug: each finding = an issue. severity = impact.
|
|
9
|
+
* Verify: each finding = a verification verdict. severity = how decisive
|
|
10
|
+
* the FAIL signal is (or how strong the PASS evidence is).
|
|
11
|
+
* Investigate: each finding = a candidate answer (or sub-answer) to the
|
|
12
|
+
* user's question. severity = confidence in the answer.
|
|
13
|
+
*/
|
|
14
|
+
export interface RouteSemantics {
|
|
15
|
+
/** One-line goal sentence injected at the top of the per-sub-worker
|
|
16
|
+
* assignment block. e.g. "find issues of THIS specific kind" (audit). */
|
|
17
|
+
goalLine: string;
|
|
18
|
+
/** What "no findings" means for this route, when the sub-worker has
|
|
19
|
+
* nothing to emit. Investigate's empty case is rare (we can almost
|
|
20
|
+
* always produce SOME candidate answer, even low-confidence). */
|
|
21
|
+
emptyOutcomeLine: string;
|
|
22
|
+
/** Per-tier severity meaning for THIS route. Replaces the generic
|
|
23
|
+
* SEVERITY_LADDER inside the cached prefix so the worker calibrates
|
|
24
|
+
* to the right semantic. Order: critical, high, medium, low. */
|
|
25
|
+
severityMeanings: {
|
|
26
|
+
critical: string;
|
|
27
|
+
high: string;
|
|
28
|
+
medium: string;
|
|
29
|
+
low: string;
|
|
30
|
+
};
|
|
31
|
+
/** One-paragraph clarifier of what a "finding" represents on this
|
|
32
|
+
* route. Written into the cached prefix above the format spec so
|
|
33
|
+
* the worker doesn't default to "find a problem" when the route
|
|
34
|
+
* semantic is "propose an answer" (investigate) or "report a
|
|
35
|
+
* verification verdict" (verify). */
|
|
36
|
+
findingMeaningParagraph: string;
|
|
37
|
+
/** Whether each sub-worker MUST emit at least one finding.
|
|
38
|
+
*
|
|
39
|
+
* - `false` (problem-finding routes — audit/review): "no findings
|
|
40
|
+
* for this criterion" is a valid honest result; the artifact may
|
|
41
|
+
* have no problems in the category.
|
|
42
|
+
* - `true` (answer-finding routes — debug/verify/investigate): the
|
|
43
|
+
* user asked a question; every parallel angle owes at least one
|
|
44
|
+
* contribution (even low-severity / low-confidence). The merge
|
|
45
|
+
* annotator dedups + ranks; soft signals are valuable, not noise.
|
|
46
|
+
*/
|
|
47
|
+
mustEmitAtLeastOne: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Shared cached-prefix builder for parallel-criteria fan-out across the
|
|
51
|
+
* five read-only routes. The prefix carries everything that's identical
|
|
52
|
+
* across all N sub-workers + the cache-warmer call:
|
|
53
|
+
* - route-specific orientation, evidence rule, scope rule, annotator awareness
|
|
54
|
+
* - SEVERITY_LADDER (shared across routes)
|
|
55
|
+
* - finding-format spec (shared shape: `## Finding N:` blocks)
|
|
56
|
+
* - the full criterion taxonomy listed by id+title+description so each
|
|
57
|
+
* sub-worker knows what's NOT theirs
|
|
58
|
+
* - target content (inlined document and/or file contents pre-read by the
|
|
59
|
+
* dispatcher)
|
|
60
|
+
*
|
|
61
|
+
* The cache_control marker is attached at the adapter layer; this helper
|
|
62
|
+
* only assembles the text. The per-sub-worker user message (the variable
|
|
63
|
+
* suffix) is built by `buildReadOnlyCriterionSuffix` below.
|
|
64
|
+
*
|
|
65
|
+
* THOROUGHNESS_REMINDER_* / CONFIDENCE_REMINDER_* are intentionally OMITTED.
|
|
66
|
+
* They were calibrated for a single worker covering all categories; with
|
|
67
|
+
* one criterion per worker, that pressure backfires (workers invent weak
|
|
68
|
+
* findings to hit the implied quota when their criterion legitimately has
|
|
69
|
+
* zero matches in the artifact).
|
|
70
|
+
*/
|
|
71
|
+
export interface CachedPrefixBlocks {
|
|
72
|
+
/** Route-specific orientation, e.g. AUDIT_PURPOSE_ORIENTATION. */
|
|
73
|
+
orientation: string;
|
|
74
|
+
/** Route-specific EVIDENCE_RULE_*. */
|
|
75
|
+
evidenceRule: string;
|
|
76
|
+
/** Route-specific SCOPE_RULE_*. */
|
|
77
|
+
scopeRule: string;
|
|
78
|
+
/** Route-specific ANNOTATOR_AWARENESS_*. */
|
|
79
|
+
annotatorAwareness: string;
|
|
80
|
+
/** Per-route finding format text. */
|
|
81
|
+
findingFormat: string;
|
|
82
|
+
/** The full criterion taxonomy in structured form. */
|
|
83
|
+
criteria: readonly CriterionEntry[];
|
|
84
|
+
/** Route-specific semantics for what a finding represents and what
|
|
85
|
+
* each severity tier means. */
|
|
86
|
+
semantics: RouteSemantics;
|
|
87
|
+
}
|
|
88
|
+
export interface CachedPrefixTarget {
|
|
89
|
+
/** Inlined document content, when present (audit). */
|
|
90
|
+
document?: string;
|
|
91
|
+
/** Map of file path → file contents pre-read by the dispatcher. */
|
|
92
|
+
preReadFiles?: Record<string, string>;
|
|
93
|
+
/** File paths declared by the request, even when their contents weren't
|
|
94
|
+
* pre-read (sub-worker may grep on demand). */
|
|
95
|
+
filePaths?: readonly string[];
|
|
96
|
+
}
|
|
97
|
+
export declare function buildReadOnlyCachedPrefix(blocks: CachedPrefixBlocks, target: CachedPrefixTarget): string;
|
|
98
|
+
/** Per-sub-worker user message: assigns ONE criterion. The semantics
|
|
99
|
+
* arg controls how the assignment is framed (find issues / answer
|
|
100
|
+
* question / verify criterion / find root cause / find quality issues
|
|
101
|
+
* in the prose).
|
|
102
|
+
*
|
|
103
|
+
* Same shape across all routes; only `goalLine` and `emptyOutcomeLine`
|
|
104
|
+
* differ per route. */
|
|
105
|
+
export declare function buildReadOnlyCriterionSuffix(semantics: RouteSemantics, criterion: CriterionEntry): string;
|
|
106
|
+
//# sourceMappingURL=parallel-criteria-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-criteria-prompt.d.ts","sourceRoot":"","sources":["../../src/tools/parallel-criteria-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B;8EAC0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB;;sEAEkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;IACzB;;qEAEiE;IACjE,gBAAgB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF;;;;0CAIsC;IACtC,uBAAuB,EAAE,MAAM,CAAC;IAChC;;;;;;;;;OASG;IACH,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC;oCACgC;IAChC,SAAS,EAAE,cAAc,CAAC;CAC3B;AAaD,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;oDACgD;IAChD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAwCR;AAED;;;;;;wBAMwB;AACxB,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,cAAc,GACxB,MAAM,CA4BR"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function renderSeverityLadder(meanings) {
|
|
2
|
+
return [
|
|
3
|
+
'Severity (your judgment, calibrated to the meanings below):',
|
|
4
|
+
`- critical: ${meanings.critical}`,
|
|
5
|
+
`- high: ${meanings.high}`,
|
|
6
|
+
`- medium: ${meanings.medium}`,
|
|
7
|
+
`- low: ${meanings.low}`,
|
|
8
|
+
'Use the FULL ladder. Calibrate to actual signal strength, not how alarming or assertive the wording sounds.',
|
|
9
|
+
].join('\n');
|
|
10
|
+
}
|
|
11
|
+
export function buildReadOnlyCachedPrefix(blocks, target) {
|
|
12
|
+
const parts = [
|
|
13
|
+
blocks.orientation,
|
|
14
|
+
'',
|
|
15
|
+
'What a "finding" means on this route:',
|
|
16
|
+
blocks.semantics.findingMeaningParagraph,
|
|
17
|
+
'',
|
|
18
|
+
blocks.findingFormat,
|
|
19
|
+
'',
|
|
20
|
+
renderSeverityLadder(blocks.semantics.severityMeanings),
|
|
21
|
+
'',
|
|
22
|
+
blocks.evidenceRule,
|
|
23
|
+
'',
|
|
24
|
+
blocks.scopeRule,
|
|
25
|
+
'',
|
|
26
|
+
blocks.annotatorAwareness,
|
|
27
|
+
'',
|
|
28
|
+
'Reference taxonomy (other parallel sub-workers cover the categories not assigned to you):',
|
|
29
|
+
...blocks.criteria.map(c => `- Criterion ${c.id} — ${c.title}: ${c.description}`),
|
|
30
|
+
];
|
|
31
|
+
if (target.document && target.document.trim().length > 0) {
|
|
32
|
+
parts.push('', 'Target document (inlined):', '', target.document);
|
|
33
|
+
}
|
|
34
|
+
const filePaths = target.filePaths ?? [];
|
|
35
|
+
const preRead = target.preReadFiles ?? {};
|
|
36
|
+
if (filePaths.length > 0) {
|
|
37
|
+
parts.push('', 'Target files (pre-read where contents are below; otherwise the sub-worker may read on demand):');
|
|
38
|
+
for (const fp of filePaths) {
|
|
39
|
+
const content = preRead[fp];
|
|
40
|
+
if (content !== undefined) {
|
|
41
|
+
parts.push('', `--- ${fp} ---`, content);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
parts.push('', `--- ${fp} ---`, '(not pre-read; read with read_file if you need its contents)');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return parts.join('\n');
|
|
49
|
+
}
|
|
50
|
+
/** Per-sub-worker user message: assigns ONE criterion. The semantics
|
|
51
|
+
* arg controls how the assignment is framed (find issues / answer
|
|
52
|
+
* question / verify criterion / find root cause / find quality issues
|
|
53
|
+
* in the prose).
|
|
54
|
+
*
|
|
55
|
+
* Same shape across all routes; only `goalLine` and `emptyOutcomeLine`
|
|
56
|
+
* differ per route. */
|
|
57
|
+
export function buildReadOnlyCriterionSuffix(semantics, criterion) {
|
|
58
|
+
const minimumBlock = semantics.mustEmitAtLeastOne
|
|
59
|
+
? [
|
|
60
|
+
'HARD REQUIREMENT (this is non-negotiable):',
|
|
61
|
+
'Your response MUST contain at least one `## Finding N:` block. Empty / narrative-only / commentary-only responses are WORKFLOW ERRORS and will be discarded.',
|
|
62
|
+
'',
|
|
63
|
+
'Three valid finding shapes — use whichever fits, in this order of preference:',
|
|
64
|
+
'',
|
|
65
|
+
'1. SUBSTANTIVE FINDING — your angle produced a real on-question signal. Emit at any severity (critical → low) per the calibration above. Multiple substantive findings from one angle are fine.',
|
|
66
|
+
'',
|
|
67
|
+
'2. PARTIAL FINDING — your angle produced a weak / inferred signal. Emit at severity=low with the partial information, marked "verify by reading <file>" or "cross-check against <another angle>".',
|
|
68
|
+
'',
|
|
69
|
+
'3. NOT-APPLICABLE FINDING — your angle is genuinely orthogonal to the question (e.g. CONCURRENCY angle on a pure-sync function; TEST-DRIVEN angle when no tests exist for the area). Emit ONE finding with severity=low, title prefixed with "[N/A]", and Issue="This perspective does not apply because <concrete reason>." The merge annotator drops these from the final report; they exist so the user can see ALL angles were attempted.',
|
|
70
|
+
'',
|
|
71
|
+
'DO NOT pad with speculation to satisfy the count. If you don\'t have a substantive or partial signal, the [N/A] finding is the right choice — the merge annotator treats N/A as completeness coverage, not as a real finding.',
|
|
72
|
+
].join('\n')
|
|
73
|
+
: semantics.emptyOutcomeLine;
|
|
74
|
+
return [
|
|
75
|
+
`Your assignment: criterion ${criterion.id} — "${criterion.title}".`,
|
|
76
|
+
'',
|
|
77
|
+
criterion.description,
|
|
78
|
+
'',
|
|
79
|
+
semantics.goalLine,
|
|
80
|
+
'',
|
|
81
|
+
minimumBlock,
|
|
82
|
+
'',
|
|
83
|
+
'Do NOT drift outside this angle; other parallel sub-workers cover the other angles.',
|
|
84
|
+
].join('\n');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=parallel-criteria-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-criteria-prompt.js","sourceRoot":"","sources":["../../src/tools/parallel-criteria-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Review-specific implementer criteria.
|
|
3
3
|
*
|
|
4
|
+
* REVIEW'S PURPOSE — read this before adding categories.
|
|
5
|
+
* mma-review is the pre-merge gate. The maintainer accepting your verdict
|
|
6
|
+
* will NOT re-investigate before pressing merge — your output is treated
|
|
7
|
+
* as authoritative. The success criterion is:
|
|
8
|
+
*
|
|
9
|
+
* "After fixes, will the merge be safe, correct, and maintainable —
|
|
10
|
+
* such that a regression is unlikely to ship?"
|
|
11
|
+
*
|
|
12
|
+
* That criterion makes a finding load-bearing. A nit that doesn't change
|
|
13
|
+
* whether the merge is safe is low-priority no matter how clean the
|
|
14
|
+
* suggested rewrite reads. A cross-file ripple that breaks a caller
|
|
15
|
+
* not in the diff is the audit-equivalent of an unimplementable fix —
|
|
16
|
+
* load-bearing even though the named file looks fine in isolation.
|
|
17
|
+
*
|
|
4
18
|
* Review examines source code in named files against a focus area
|
|
5
19
|
* (security/correctness/performance/style). Findings should be
|
|
6
|
-
* line-quotable — that's the natural shape of code defects
|
|
20
|
+
* line-quotable — that's the natural shape of code defects — but
|
|
21
|
+
* cross-file findings backed by call-site references are also valid.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The orientation block. Goes at the TOP of every review prompt.
|
|
25
|
+
*
|
|
26
|
+
* This is the load-bearing addition. Without an explicit purpose
|
|
27
|
+
* statement, workers default to "find issues in this file" — which
|
|
28
|
+
* produces line-by-line proofreading and misses the cross-file rippe,
|
|
29
|
+
* test-gap, and implicit-contract findings that actually block merges.
|
|
7
30
|
*/
|
|
31
|
+
export declare const REVIEW_PURPOSE_ORIENTATION: string;
|
|
8
32
|
export declare const EVIDENCE_RULE_REVIEW: string;
|
|
9
33
|
export declare const SCOPE_RULE_REVIEW: string;
|
|
34
|
+
/**
|
|
35
|
+
* The failure-mode taxonomy for code reviews.
|
|
36
|
+
*
|
|
37
|
+
* Without this block, workers default to line-by-line proofreading of
|
|
38
|
+
* the named file and miss cross-file ripples, test gaps, and
|
|
39
|
+
* implicit-contract regressions — the findings that actually block
|
|
40
|
+
* merges. The 10 categories below are what a careful maintainer would
|
|
41
|
+
* scan for before pressing merge.
|
|
42
|
+
*/
|
|
43
|
+
export declare const CODE_REVIEW_FAILURE_MODES: string;
|
|
44
|
+
/**
|
|
45
|
+
* Counter-balance to the SEVERITY_LADDER's anti-inflation hint.
|
|
46
|
+
*
|
|
47
|
+
* The shared severity ladder ends with "Workers commonly inflate —
|
|
48
|
+
* resist the urge." That bias is correct in the limit (no, the missing
|
|
49
|
+
* comma is not critical) but produces UNDER-finding when combined with
|
|
50
|
+
* a thin per-tool rubric. For code review specifically, the typical
|
|
51
|
+
* failure is missing the cross-file ripple or test gap because the
|
|
52
|
+
* worker only looked at the diff in the named file. This block tells
|
|
53
|
+
* the worker that under-finding is the more common review failure.
|
|
54
|
+
*/
|
|
55
|
+
export declare const THOROUGHNESS_REMINDER_REVIEW: string;
|
|
10
56
|
export declare const ANNOTATOR_AWARENESS_REVIEW: string;
|
|
57
|
+
import { type CriterionEntry } from '../criteria-types.js';
|
|
58
|
+
/** Structured per-criterion array for parallel-criteria fan-out. */
|
|
59
|
+
export declare const REVIEW_CRITERIA: readonly CriterionEntry[];
|
|
11
60
|
//# sourceMappingURL=implementer-criteria.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implementer-criteria.d.ts","sourceRoot":"","sources":["../../../src/tools/review/implementer-criteria.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"implementer-criteria.d.ts","sourceRoot":"","sources":["../../../src/tools/review/implementer-criteria.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,QAmB3B,CAAC;AAEb,eAAO,MAAM,oBAAoB,QAQrB,CAAC;AAEb,eAAO,MAAM,iBAAiB,QAOlB,CAAC;AAEb;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAmB1B,CAAC;AAEb;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,QAW7B,CAAC;AAEb,eAAO,MAAM,0BAA0B,QAO3B,CAAC;AAEb,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1E,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAA6C,CAAC"}
|