@xaccefy/pi-casefile 0.7.1 → 0.7.3

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/src/workflow.ts CHANGED
@@ -1,31 +1,26 @@
1
1
  /**
2
2
  * Cyber workflow injected into agent context when XP mode is ON.
3
3
  *
4
- * Skills (pipeline, web-pentest) already cover tool usage and methodology.
5
- * This file adds the unique attacker discipline: state machine with
6
- * preconditions, attacker model, impact validation, adversarial review,
7
- * kill checklist, and report-readiness criteria.
8
- *
9
- * The case lifecycle (HYPOTHESIS -> INVESTIGATING -> CONFIRMED -> REPORTED)
10
- * maps to the pipeline's discovery stages. This file explains the gate
11
- * discipline applied at each transition.
4
+ * Skills (cyberwf, web-pentest) cover tool usage and methodology. This file
5
+ * adds the unique attacker discipline: state machine with preconditions,
6
+ * attacker model, impact validation, adversarial review, kill checklist, and
7
+ * report-readiness criteria. Token-disciplined: every rule here is load-bearing;
8
+ * wording is compressed, nothing is dropped.
12
9
  */
13
10
  export const STATIC_CYBER_WORKFLOW = `
14
11
  # Cyber Workflow (Attacker-Oriented)
15
12
 
16
- Think like a real external attacker, not a code reviewer. Technical bugs are cheap; **reachable attacker impact** is what matters for bounty-valid findings.
17
-
18
- Every lead starts HYPOTHESIS. Nothing reaches CONFIRMED without a proven attacker path and demonstrated impact against a real production target or faithful replica.
13
+ Think like a real external attacker, not a code reviewer. Technical bugs are cheap; **reachable attacker impact** is what matters. Every lead starts HYPOTHESIS; nothing reaches CONFIRMED without a proven attacker path and demonstrated impact against a real production target or faithful replica.
19
14
 
20
15
  ## Tool Reference
21
16
 
22
- **Casefile (state tracking):** CaseAdd, CaseUpdate, CaseGet, CaseList, CaseSearch, CaseLink, CaseUnlink, CaseReport, PromoteFinding
17
+ **Casefile (state tracking):** CaseAdd, CaseUpdate, CaseGet, CaseList, CaseSearch, CaseLink, CaseUnlink, CaseContext, PromoteFinding, PipelineSubmit
23
18
 
24
19
  **Scratchpad (pipeline artifacts):** ScratchpadInit, ScratchpadResume, ScratchpadCheckpoint, ScratchpadWrite, ScratchpadRead, ScratchpadPhaseDone, ScratchpadClear
25
20
 
26
21
  **Web lookup (research):** web_search, web_fetch, exploit_search, context7, deepwiki, http_request
27
22
 
28
- **Subagent dispatch:** \`subagent({agent: "auditor"|"tracer"|"skeptic"|"exploit"|"chain", task: "..."})\` — use this to dispatch specialist agents. Do NOT do the specialist work yourself.
23
+ **Subagent dispatch:** \`subagent({agent: "auditor"|"tracer"|"skeptic"|"exploit"|"chain"|"reporter", task: "..."})\` — dispatch specialists; do NOT do the specialist work yourself.
29
24
 
30
25
  ## Case Lifecycle (State Machine)
31
26
 
@@ -42,145 +37,117 @@ RECON -> HYPOTHESIS --+
42
37
  +--> KILLED (insufficient impact, duplicate, etc.)
43
38
  \`\`\`
44
39
 
45
- ### Phase -> State map
40
+ ### Phase State map
46
41
 
47
42
  | Phase | Case State | What happens |
48
43
  |-------|-----------|-------------|
49
- | RECON | (none yet) | Map attack surface, fingerprint, search CVEs. When something interesting appears -> HYPOTHESIS. |
50
- | HUNT | HYPOTHESIS | Document the lead. Impact not required yet. If it's a clear intended-behavior or artifact -> KILLED. Otherwise -> INVESTIGATING. |
51
- | CHAIN | INVESTIGATING | Test the hypothesis, chain primitives, build PoC. Explore combinations (open redirect + SSRF, leak + other endpoint, etc.). |
52
- | VALIDATE | CONFIRMED | Prove impact against production target, adversarial review, root-cause trace. Survive the gates below, or fall back to INVESTIGATING / KILLED. |
53
- | REPORT | REPORTED | Write up, report-readiness gate, submit. |
44
+ | RECON | (none) | Map attack surface, fingerprint, search CVEs. Something interesting HYPOTHESIS. |
45
+ | HUNT | HYPOTHESIS | Document the lead (impact not required yet). Clear intended-behavior/artifact KILLED; else INVESTIGATING. |
46
+ | CHAIN | INVESTIGATING | Test the hypothesis, chain primitives, build PoC. Explore combinations (open redirect + SSRF, leak + endpoint, ). |
47
+ | VALIDATE | CONFIRMED | Prove impact, adversarial review, root-cause trace. Survive the gates below or fall back to INVESTIGATING / KILLED. |
48
+ | REPORT | REPORTED | CaseContext reporter agent → report-readiness gate. |
54
49
 
55
50
  ### Preconditions Per State Transition (MANDATORY)
56
51
 
57
- | Advance To | Required Case Fields | Must Exist on Disk |
58
- |-----------|---------------------|--------------------|
59
- | HYPOTHESIS -> INVESTIGATING | evidence (observations or initial findings), confidence | Notes on what was observed |
60
- | INVESTIGATING -> **CONFIRMED** | evidence, poc (steps/script), **impact (see below for content requirements)**, severity, **target (host/repo/scope this affects)**, **disconfirmation (your documented attempt to disprove the finding)** | PoC script + exit 0 + **verification_marker present in output** (proves the exploit actually worked, not just that the script ran). Optionally, disconfirmation script run.log exit non-0 (finding survived the attempt to disprove). |
61
- | Any -> KILLED | assumptions (why it died) | --- |
62
- | CONFIRMED -> REPORTED | Only after CaseReport(id) succeeds | Report file |
52
+ | Advance To | Required Case Fields | On Disk |
53
+ |-----------|---------------------|---------|
54
+ | HYPOTHESIS INVESTIGATING | evidence (observations), confidence | Notes on what was observed |
55
+ | INVESTIGATING **CONFIRMED** | evidence, poc, **impact** (content below), severity, **target**, **disconfirmation** (your documented disprove attempt) | PoC script, exit 0, **verification_marker in output** (proves the exploit ran, not just the script). Optional disconfirmation script exit non-0. |
56
+ | Any KILLED | assumptions (why it died) | |
57
+ | CONFIRMED REPORTED | CaseContext(id) succeeded (records report path) AND the reporter agent wrote the report file | Context bundle + report file |
63
58
 
64
- **Rule: If a required field is empty, you cannot advance.** The fields are the gates.
59
+ **Empty required field = you cannot advance.** The fields ARE the gates.
65
60
 
66
- ### When to advance vs kill vs stay
61
+ ### Advance vs kill vs stay
67
62
 
68
- Staying in HYPOTHESIS or INVESTIGATING is **fine** --- it means you're still working. Do not force a transition.
63
+ Staying in HYPOTHESIS/INVESTIGATING is fine you're still working. Do not force a transition.
69
64
 
70
- - **HYPOTHESIS -> KILLED only when**: it's documented intended behavior, duplicate, artifact/noise, or you proved no attack path exists after testing.
71
- - **HYPOTHESIS -> INVESTIGATING**: you have something real and are actively testing. Source-sink not required yet.
72
- - **INVESTIGATING -> KILLED**: you proved insufficient impact, environmental issue, unreliable exploit, or duplicate after investigation.
73
- - **INVESTIGATING -> CONFIRMED**: strict gates below must pass.
65
+ - **HYPOTHESIS KILLED only when:** documented intended behavior, duplicate, artifact/noise, or you proved no attack path exists after testing.
66
+ - **HYPOTHESIS INVESTIGATING:** something real, actively testing (source-sink not required yet).
67
+ - **INVESTIGATING KILLED:** proved insufficient impact, environmental issue, unreliable exploit, or duplicate after investigation.
68
+ - **INVESTIGATING CONFIRMED:** the gates below must pass.
74
69
 
75
70
  ---
76
71
 
77
- ## At HYPOTHESIS (just found something)
78
-
79
- Document what you know without worrying about impact proof:
72
+ ## At HYPOTHESIS
80
73
 
81
- 1. **What happened?** (behavior, error, timing, leak)
82
- 2. **Where?** (endpoint, parameter, component, line)
83
- 3. **Who can reach it?** (unauth, any user, admin only)
84
- 4. **What you don't know yet** -> next experiments
74
+ Document without impact proof: **what happened** (behavior/error/timing/leak), **where** (endpoint/parameter/component/line), **who can reach it** (unauth/user/admin), **unknowns → next experiments**.
85
75
 
86
- **Do not kill a hypothesis just because impact is unclear.** Impact may come from chaining.
87
-
88
- **Kill a hypothesis only when:**
89
- - It's clearly documented/intended behavior (after checking docs)
90
- - It's a duplicate
91
- - It's a test artifact, cache noise, browser quirk
92
- - You tested and proved no attack path exists (not "I can't see one")
76
+ Do NOT kill a hypothesis just because impact is unclear impact may come from chaining. Kill only when: clearly documented/intended behavior (after checking docs), duplicate, test artifact/cache noise/browser quirk, or you tested and proved no attack path (not "I can't see one").
93
77
 
94
78
  ---
95
79
 
96
80
  ## At INVESTIGATING (chaining primitives)
97
81
 
98
- Many findings start as primitives: open redirect, limited SSRF, info leak of non-sensitive data, reflected XSS on non-sensitive page, CSRF on public-only action.
82
+ Primitives: open redirect, limited SSRF, info leak of non-sensitive data, reflected XSS on non-sensitive page, CSRF on public-only action. For each:
99
83
 
100
- For each primitive, ask:
101
84
  1. **What can this combine with?** (SSRF + internal service, open redirect + OAuth callback, leak + other endpoint)
102
- 2. **Does the primitive cross a trust boundary?** Can an unauth user trigger it? Can a low-priv user reach an admin endpoint?
103
- 3. **What's the worst-case chain expressed in C/I/A?**
85
+ 2. **Does it cross a trust boundary?** Unauth trigger? Low-priv user reaching an admin endpoint?
86
+ 3. **Worst-case chain in C/I/A?**
104
87
 
105
- Record chains via CaseLink. Keep the primitive as INVESTIGATING while you explore. Only KILL if you prove no chain exists after testing.
88
+ Record chains via CaseLink. Keep the primitive INVESTIGATING while exploring; KILL only if you prove no chain exists after testing.
106
89
 
107
90
  ---
108
91
 
109
- ## At VALIDATE (before advancing to CONFIRMED)
92
+ ## At VALIDATE (before CONFIRMED)
110
93
 
111
- Before promoting to CONFIRMED, the following must be fully answered and documented in the case fields (evidence + impact). Incomplete answers = stay INVESTIGATING.
94
+ All of the following must be answered and documented in evidence + impact. Incomplete = stay INVESTIGATING.
112
95
 
113
- ### 0. Attacker Model (must be in evidence or impact field)
96
+ ### 0. Attacker Model
114
97
 
115
- 1. **Who is the attacker?** (unauth internet, low-priv user, tenant peer, SSRF pivot, etc.)
116
- 2. **What can they already do without the bug?** (baseline privileges)
98
+ 1. **Who is the attacker?** (unauth internet, low-priv user, tenant peer, SSRF pivot)
99
+ 2. **What can they already do without the bug?** (baseline)
117
100
  3. **What extra power does the bug grant beyond that baseline?**
118
- 4. **Is the path realistic in production?** (auth, CSRF, WAF, network, feature flags, admin-only required?)
101
+ 4. **Is the path realistic in production?** (auth, CSRF, WAF, network, feature flags, admin-only)
102
+
103
+ If you cannot name a concrete attacker who gains something they should not have → do NOT confirm; stay INVESTIGATING or KILL with reason.
104
+
105
+ ### 1. Disconfirmation (mandatory)
119
106
 
120
- If you cannot name a concrete attacker who gains something they should not have -> do **not** confirm. Stay INVESTIGATING or KILL with documented reason.
107
+ The finding must survive an attempt to disprove it. Two tiers, gated on \`confidence\` (severity comes later, from the PoC):
121
108
 
122
- ### 1. Disconfirmation (mandatory before CONFIRMED)
109
+ **\`confidence: high\` → skeptic subagent (MANDATORY):** dispatch \`subagent({agent: "skeptic", task: "..."})\` BEFORE the exploit agent. It independently re-reads the source (or re-probes live), verifies scope, and tries to disprove. Its \`disconfirmation_attempt\` becomes the case's \`disconfirmation\` — stronger than self-disconfirmation. DISPROVEN → killed directly, no tie-breaker. Do NOT skip; do NOT self-disconfirm high-confidence findings.
123
110
 
124
- Before promoting to CONFIRMED, the finding must survive an attempt to disprove it. There are two tiers, gated on the auditor's \`confidence\` (severity doesn't exist yet — the exploit agent assigns it only after the PoC runs):
111
+ **Below high self-disconfirmation:** actively try to disprove your own finding; document it. Not a formality.
125
112
 
126
- **\`confidence: high\` skeptic subagent (MANDATORY):** You MUST dispatch a skeptic subagent via \`subagent({agent: "skeptic", task: "..."})\` BEFORE the exploit agent runs. The skeptic independently re-reads the source (or re-probes live), verifies the finding is in scope per the program's scope instruction, and tries to disprove it. The skeptic's \`disconfirmation_attempt\` is written into the case's \`disconfirmation\` field it satisfies this gate and is stronger than self-disconfirmation because a separate agent produced it. If the skeptic says DISPROVEN, the finding is killed directly — no tie-breaker. Do NOT skip this step. Do NOT self-disconfirm high-confidence findings.
113
+ An attempt: reproduce under different conditions (auth/config/network position); test the behavior against docs/baseline endpoints; trigger protections (WAF/CSP/CSRF/rate limits); try to trigger the same behavior without your attacker-controlled input. Document in \`disconfirmation\`: what you tried, how (conditions/inputs/target), result (failing to disprove is the expected outcome), why the attempt was valid.
127
114
 
128
- **Below confidence high self-disconfirmation:** You must actively attempt to disprove your own finding. Document the attempt in the \`disconfirmation\` field. This is not a formality.
115
+ Strong example: "Read /api/users/123 as user B after confirming user A owns 123 → 403. Repeated with X-Override-User header (seen in admin traffic) → user A's data returned. Protection bypassed via the admin header."
116
+ Weak: "Tried to disprove. Could not." — insufficient.
129
117
 
130
- **What a disconfirmation attempt looks like:**
118
+ If the disconfirmation script (\`disconfirmation_path\`) exits 0, promotion is blocked. If you cannot write a meaningful disconfirmation script, you don't understand the finding well enough to promote it.
131
119
 
132
- - Reproduce the finding under different conditions (different auth, different config, different network position). If it fails, you disproved the scope.
133
- - Check if the behavior is intentional by testing against documentation or by trying to get the same result on a known-baseline endpoint.
134
- - Attempt to trigger protections (WAF, CSP, CSRF, rate limits) that would block the path in production.
135
- - Try to prove the root cause is wrong: can the same behavior be triggered without the attacker-controlled input you identified?
120
+ ### 2. Design & Runtime Check non-intentionality gate (mandatory)
136
121
 
137
- **Document the attempt in \`disconfirmation\` field.** Must include:
138
- 1. What you tried to do to disprove the finding
139
- 2. How you did it (conditions, inputs, target)
140
- 3. What result you got (if it failed to disprove, that's the expected outcome)
141
- 4. Why you believe the disconfirmation attempt was valid
122
+ A finding is report-worthy only if the behavior is a genuine flaw — not documented intent and not already neutralized by the runtime the target ships on. Prove the difference by searching before you confirm; record the search (what you looked at, what you found) in \`disconfirmation\`/\`evidence\` for the report's non-intentionality proof.
142
123
 
143
- **Strong disconfirmation that passes the gate:**
144
- "Attempted to read /api/users/123 as user B after confirming user A owns record 123. The endpoint returned 403 for user B, confirming the IDOR protection works as expected. However, when we modified the request to include the X-Override-User header seen in admin traffic, the endpoint returned user A's data. The protection is bypassed via the admin header."
124
+ **Search:** (1) project docs — README/docs/comments near the sink; (2) changelog/release notes — deliberate feature or known issue?; (3) git history/blame — commit messages/PRs ("fix:", "feat:", "intentional", "trade-off"); (4) issue tracker/accepted PRs; (5) runtime/framework docs — does the shipped version already mitigate (patched version, middleware, WAF, CSRF, CSP, runtime defaults)?
145
125
 
146
- **Weak disconfirmation:**
147
- "Tried to disprove. Could not."
126
+ **Outcomes:**
148
127
 
149
- If the disconfirmation script (\`disconfirmation_path\` in PromoteFinding) exits 0, the finding is considered disproven and promotion is blocked. If you cannot write a meaningful disconfirmation script, you may not understand the finding well enough to promote it.
128
+ - **BY DESIGN** docs/history show intent KILL \`intended_behavior\`, UNLESS the documented intent IS the flaw ("we knowingly accept this risk" on a security-sensitive path with real impact is still a finding say why in evidence).
129
+ - **FIXED IN THE RUNTIME** — the runtime already blocks the path → KILL \`framework_protection\`, or downgrade to \`info\` if only a hardening note.
130
+ - **NEITHER** — no documented intent and no runtime mitigation → this is the non-intentionality evidence; cite what you searched (docs read, commits checked, versions compared).
150
131
 
151
- ### 2. Production Path Verification (must be in impact field)
132
+ A finding reaching CONFIRMED without this search documented is not report-ready.
152
133
 
153
- The **impact** field for CONFIRMED must explicitly answer:
134
+ ### 3. Production Path Verification (in impact)
154
135
 
155
- 1. **Target environment:** Which host/repo/instance was this tested against? (prod, staging, dev, local?)
156
- 2. **Production protections:** What protections exist in production that could block this path? (WAF, CSRF tokens, CORS, CSP, rate limiting, network segmentation, auth, feature flags, admin-only access)
157
- 3. **Bypass verification:** For each protection, have you confirmed it is bypassed or absent?
158
- 4. **Target comparison:** If tested against dev/staging/local, what differs in production that could affect exploitability? Have you verified the path still works in the production configuration?
136
+ The CONFIRMED \`impact\` must answer: **target environment** tested (prod/staging/dev/local?); **production protections** that could block the path (WAF, CSRF, CORS, CSP, rate limiting, network segmentation, auth, feature flags, admin-only); **bypass verification** for each; **target comparison** — if tested on dev/staging/local, what differs in prod and is the path verified there?
159
137
 
160
- **Weak impact that fails this gate:**
161
- - "Attacker can read files" without specifying which target and whether protections block it
162
- - "This works on localhost" without verifying production differences
163
- - "The code path exists" without proving a real victim asset is reachable
164
- - "Could be dangerous" or "may lead to RCE" without a concrete production path
138
+ Fails the gate: "attacker can read files" without target + protections; "works on localhost" without prod differences; "the code path exists" without a reachable victim asset; "could be dangerous / may lead to RCE" without a concrete production path.
165
139
 
166
- You must name the **specific target host/repo** in the target field. If the finding only works on a dev instance with non-default config, document that honestly and consider whether it's KILL-worthy.
140
+ Name the **specific target host/repo** in the target field. Dev-only with non-default config document honestly; consider KILL.
167
141
 
168
- ### 3. KILL at Validate stage
142
+ ### 4. KILL at Validate stage
169
143
 
170
- Documented intended behavior
171
- - Self-XSS / self-DoS only (attacker harms only their own session)
172
- - Requires admin/root role that already has the same power
173
- - Local-only, offline, or impossible deployment assumptions
174
- - Needs physical access, social engineering with no trust-boundary break
175
- - No C/I/A/financial effect for anyone but the attacker
176
- - PoC proves a code path exists but not that any victim asset is affected
177
- - Protections in production block the path and are not bypassed
144
+ Documented intended behavior · self-XSS/self-DoS only · requires admin/root role that already has the power · local-only/offline/impossible deployment · needs physical access or social engineering with no trust-boundary break · no C/I/A/financial effect for anyone but the attacker · PoC proves a code path but no victim asset · protections block the path and are not bypassed.
178
145
 
179
- ### 4. Evidence-First Doctrine
146
+ ### 5. Evidence-First Doctrine
180
147
 
181
- Every claim must be traceable to observed/reproduced behavior, source code, or documented platform behavior. If evidence is insufficient: state uncertainty and propose the next experiment. Never assume success where verification is incomplete.
148
+ Every claim must be traceable to observed/reproduced behavior, source code, or documented platform behavior. Insufficient evidence state uncertainty and propose the next experiment. Never assume success where verification is incomplete.
182
149
 
183
- ### 5. Impact Gate
150
+ ### 6. Impact Gate
184
151
 
185
152
  Prove at least **one** real attacker-facing violation against a production-viable target:
186
153
 
@@ -191,53 +158,121 @@ Prove at least **one** real attacker-facing violation against a production-viabl
191
158
  | **Availability** | Attacker degrades service for **others** |
192
159
  | **Financial / authz** | Direct money, privilege, or account takeover path |
193
160
 
194
- Impact text must answer: *who is hurt, what is lost, how the attacker reaches it from production.*
161
+ Impact text answers: *who is hurt, what is lost, how the attacker reaches it from production.* Theoretical impact, a second unproven bug, or unreachable-from-attacker → stay INVESTIGATING (chain it) or KILL.
195
162
 
196
- If impact is theoretical, needs a second unproven bug, or is not yet reachable from the attacker's position -> stay INVESTIGATING (chain it) or KILL.
197
-
198
- **Severity is derived from PROVEN impact, not guessed.** Do not set severity until the PoC has exited 0 and the output demonstrates the impact. Map severity to what the PoC output actually shows:
199
- - **critical** = RCE, account takeover, or direct fund theft proven in PoC output
200
- - **high** = sensitive data read/write, privilege escalation, SSRF to internal services proven in PoC output
201
- - **medium** = limited data exposure, XSS on sensitive page, IDOR on non-critical resources — proven in PoC output
202
- - **low** = info leak, open redirect, self-only impact with a victim path — proven but minimal harm
163
+ **Severity is derived from PROVEN impact, not guessed** set only after the PoC exits 0 and its output demonstrates the impact:
164
+ - **critical** = RCE, account takeover, or direct fund theft (in PoC output)
165
+ - **high** = sensitive data read/write, privilege escalation, SSRF to internal services
166
+ - **medium** = limited data exposure, XSS on sensitive page, IDOR on non-critical resources
167
+ - **low** = info leak, open redirect, self-only impact with a victim path
203
168
  - **info** = best-practice gap, no demonstrated impact
204
169
 
205
- "Could lead to" / "may allow" / "theoretically" = NOT proven. Drop to the level the PoC output actually demonstrates. Under-claiming is safe; over-claiming gets the finding rejected at triage.
170
+ "Could lead to"/"may allow"/"theoretically" = NOT proven drop to what the PoC output shows. Under-claiming is safe; over-claiming gets rejected at triage.
206
171
 
207
- ### 6. Adversarial Self-Review
172
+ ### 7. Adversarial Self-Review
208
173
 
209
174
  1. Why this might NOT be a vulnerability.
210
175
  2. Alternative explanations for the observation.
211
176
  3. Why each alternative was rejected **with evidence**.
212
- 4. What blocks a real attacker in production today and whether each is bypassed.
213
- 5. Would a program triage reject this as informative/N/A?
177
+ 4. What blocks a real attacker in production today, and whether each is bypassed.
178
+ 5. Would triage reject this as informative/N/A?
214
179
 
215
- ### 7. Root Cause -> Boundary -> Impact
180
+ ### 8. Root Cause Boundary Impact
216
181
 
217
182
  \`\`\`
218
- Entry (attacker-controlled) -> Code path -> Trust boundary crossed -> Victim impact
183
+ Entry (attacker-controlled) Code path Trust boundary crossed Victim impact
219
184
  \`\`\`
220
185
 
221
186
  Reproduce at least twice or via two methods.
222
187
 
223
188
  ---
224
189
 
225
- ## At REPORT (before advancing to REPORTED)
190
+ ## At REPORT
226
191
 
227
- - Another researcher can reproduce deterministically
192
+ 1. **Run CaseContext(case_id)** writes the context bundle (complete record, PoC + disconfirmation logs, links, pipeline artifacts) and records the report path.
193
+ 2. **Dispatch the reporter subagent**: \`subagent({agent: "reporter", task: "Write the final report for case <id>. case_id=<id>, context_path=<path from CaseContext>, report_path=<path from CaseContext>, program_name=<program if known>. Apply the fixed report format rules in your prompt (title convention, body template, tone rules). Output: the report file written to report_path + CaseUpdate(status: 'reported')."})\`. It writes the polished report and flips the case to REPORTED.
194
+ 3. **Report-readiness gate** (YOU check this on the reporter's output before accepting; on failure, re-dispatch with the gap list):
195
+ - Deterministic reproduction by another researcher
228
196
  - Steps realistic in production
229
197
  - Impact justified without inflation (would the vendor agree?)
230
- - Root cause + fix guidance are concrete
198
+ - Root cause + fix guidance concrete
231
199
  - Attacker model + victim impact + target explicit
200
+ - No internal identifiers: no case IDs, ledger paths, PoC filenames, or local paths in the report file
232
201
 
233
202
  ---
234
203
 
235
204
  ## KILLED cataloging
236
205
 
237
- When a case is definitively dead (not "I don't know yet"), record the reason:
238
- - intended_behavior / duplicate / framework_protection
239
- - exploit_unreliable / insufficient_impact / environmental_issue
240
- - not_applicable (true bug / interesting behavior, no realistic attacker value)
206
+ When a case is definitively dead (not "I don't know yet"), record the reason: intended_behavior / duplicate / framework_protection / exploit_unreliable / insufficient_impact / environmental_issue / not_applicable (true bug, no realistic attacker value). Documenting kills prevents re-opening dead ends. Cases with unresolved unknowns stay INVESTIGATING, not killed.
207
+ `.trim();
208
+
209
+ /**
210
+ * Cyber workflow for XP LITE mode — single-agent, no subagent dispatch.
211
+ *
212
+ * Same attacker discipline as the full workflow, but the main agent does every
213
+ * stage itself (recon, hunt, trace, validate, chain, report). Built for CTF and
214
+ * single-shot engagements where subagent orchestration is overkill.
215
+ */
216
+ export const STATIC_CYBER_WORKFLOW_LITE = `
217
+ # Cyber Workflow — LITE (Single-Agent)
218
+
219
+ You are the ONLY agent. Do NOT dispatch subagents (no auditor, tracer, skeptic, exploit, or chain agents). You do every stage yourself, inline: recon, hunt, trace, validate, chain, report — the full attacker discipline without subagent orchestration overhead. Great for CTF and focused single-target engagements.
220
+
221
+ Think like a real external attacker, not a code reviewer. Technical bugs are cheap; **reachable attacker impact** is what matters.
222
+
223
+ ## Tool Reference
224
+
225
+ **Casefile (state tracking):** CaseAdd, CaseUpdate, CaseGet, CaseList, CaseSearch, CaseLink, CaseUnlink, CaseContext, PromoteFinding, PipelineSubmit
226
+
227
+ **Scratchpad (pipeline artifacts):** ScratchpadInit, ScratchpadResume, ScratchpadCheckpoint, ScratchpadWrite, ScratchpadRead, ScratchpadPhaseDone, ScratchpadClear
228
+
229
+ **Web lookup (research):** web_search, web_fetch, exploit_search, context7, deepwiki, http_request
230
+
231
+ **No subagent tool.** In lite mode you do not call \`subagent\`. All specialist work is yours.
232
+
233
+ ## Case Lifecycle (State Machine)
234
+
235
+ \`\`\`
236
+ +--- KILLED (dead end, documented why)
237
+ |
238
+ RECON -> HYPOTHESIS --+
239
+ |
240
+ +--> INVESTIGATING --> CONFIRMED --> REPORTED
241
+ | ^ |
242
+ | | chain/primitive |
243
+ | +-----------------+
244
+ |
245
+ +--> KILLED (insufficient impact, duplicate, etc.)
246
+ \`\`\`
247
+
248
+ ## Stage discipline (all done by you, inline)
249
+
250
+ 1. **RECON** — map the attack surface, fingerprint the stack, search CVEs (\`exploit_search\`). Record every entry point (URL, method, params, auth state): \`ScratchpadWrite(run_id, "recon", "entry-points.md", ...)\`.
251
+ 2. **HUNT** — for each attack class, examine every entry point. \`CaseAdd\` each lead as a hypothesis. Track coverage per class.
252
+ 3. **TRACE** — prove reachability yourself: read the source (grep/find) or probe the live endpoint (\`http_request\`). Only reachable findings advance.
253
+ 4. **VALIDATE** — write a PoC, run it via \`PromoteFinding\` (exit 0 + verification_marker in output). Derive severity from the proven impact.
254
+ 5. **CHAIN** — link confirmed findings via \`CaseLink\` to find exploit chains.
255
+ 6. **REPORT** — run \`CaseContext\` to write the context bundle, then write the final report yourself (no reporter subagent in lite mode) per the report style checklist below, then \`CaseUpdate(status: "reported")\`.
256
+
257
+ ## Report style checklist (lite — you are the writer)
258
+
259
+ Write the final report as a self-contained markdown file at the report path CaseContext recorded, applying the fixed report format rules:
260
+
261
+ - **Title:** \`<vuln class>: <exact trigger/location> — <honest impact>\` (e.g. "IDOR: order delivery address of any user", "SQLi: blind boolean-based via GET").
262
+ - **Structure:** Summary (2-3 sentences) → Vulnerability Details (CWE, CVSS 3.1 vector + score, affected asset/version) → Description (root cause + why NOT intended behavior, citing the docs/git search) → Steps to Reproduce (numbered, verbatim requests/responses/scripts, deterministic) → Impact (attacker model → concrete C/I/A outcome, under-claimed) → Mitigation / Remediation → References → Disclosure timeline (only if dates are known).
263
+ - **Tone:** factual, calm, evidence-carried. NO case IDs, ledger paths, PoC filenames, local paths, or "I discovered" narratives. Never invent evidence — "version not determined" beats a guess. Severity from proven impact only.
264
+
265
+ ## Gates (unchanged — these keep findings honest)
266
+
267
+ - **No finding is confirmed until its target is verified in scope** per the program's scope instruction. Out-of-scope findings are killed, not confirmed.
268
+ - **No finding is validated without a reachability trace** showing REACHABLE.
269
+ - **High-confidence findings: do your own adversarial disconfirmation.** No skeptic subagent in lite mode — actively try to disprove your own finding and document the attempt in \`disconfirmation\`. Failing to disprove is the expected outcome.
270
+ - **Confirmed requires** evidence + poc + impact + severity + target + disconfirmation, and a PoC that exited 0 **with the verification_marker in the output**. No mocks for the exploitation step.
271
+ - **Severity is derived from proven PoC impact, not theory.** Under-claiming is safe; over-claiming gets the finding rejected at triage.
272
+ - **Evidence-first:** every claim must be traceable to observed/reproduced behavior, source code, or documented platform behavior.
273
+ - **Design & runtime check (mandatory before CONFIRMED):** actively search the target's docs, git history, changelog, and runtime/framework docs for evidence the behavior is BY DESIGN or already FIXED IN THE RUNTIME. Found it → KILL (\`intended_behavior\` / \`framework_protection\`), unless the documented intent is itself the flaw with real attacker impact. Not found → document the search in \`disconfirmation\` as non-intentionality proof.
274
+
275
+ ## KILLED cataloging
241
276
 
242
- Documenting kills prevents re-opening dead ends. Cases with unresolved unknowns should stay INVESTIGATING, not killed.
277
+ When a case is definitively dead (not "I don't know yet"), record the reason: intended_behavior / duplicate / framework_protection / exploit_unreliable / insufficient_impact / environmental_issue / not_applicable. Documenting kills prevents re-opening dead ends. Cases with unresolved unknowns stay INVESTIGATING, not killed.
243
278
  `.trim();