blitzstrike 2.4.184 → 2.4.186
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/CHANGELOG.md +17 -0
- package/dist/index.js +31 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ All notable changes to Blitz Strike are documented here.
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [2.4.186] — 2026-11-03
|
|
9
|
+
|
|
10
|
+
### Added — 5 doctrine rules (multi-agent pentest orchestration)
|
|
11
|
+
|
|
12
|
+
- `failure_classification` (Technical/Environmental/Conceptual/External — classify
|
|
13
|
+
before retry; 2 similar failures ⇒ conceptual ⇒ pivot), `plan_budget_distribution`
|
|
14
|
+
(10% setup / 30% explore / 30% select / 30% execute; refine by delta, not regenerate),
|
|
15
|
+
`cli_argument_protocol` (verify flags via --help, never copy flags across tools, quote
|
|
16
|
+
shell metacharacters), `technical_channel_english` (technical channel stays English for
|
|
17
|
+
indexing; anonymize stored techniques with {target_ip}/{username}/{token} placeholders).
|
|
18
|
+
|
|
19
|
+
### Added — typed lineage edges for facts
|
|
20
|
+
|
|
21
|
+
- `record_fact` gains a `rel` edge (derives_from / yielded_access / escalated_via /
|
|
22
|
+
pivoted_to / authenticates_to / attempted_on) so the fact lineage is a typed attack
|
|
23
|
+
graph, not a flat derived-from chain.
|
|
24
|
+
|
|
8
25
|
## [2.4.184] — 2026-11-03
|
|
9
26
|
|
|
10
27
|
### Added — HTTP-level asset fingerprinting (Shodan-style MMH3)
|
package/dist/index.js
CHANGED
|
@@ -63804,6 +63804,31 @@ var HUNTING_DOCTRINE = [
|
|
|
63804
63804
|
id: "compression_discipline",
|
|
63805
63805
|
title: "Compression — Synthesize Causally, Preserve Confidence + Provenance",
|
|
63806
63806
|
rule: "When summarizing or compressing a set of related exploration nodes (facts/intents/findings), do NOT enumerate — synthesize: trace the causality (which fact birthed which intent, which intent produced which conclusion) and state what this region of the exploration CONCLUDED. Preserve distinctions between different conclusions (do not merge them into one vague sentence). Preserve evidence strength: mark observed vs inferred, and flag an inferred NEGATIVE/doubtful conclusion as inference-that-can-be-rechecked, never as a settled fact. Tag each conclusion with its source id(s) (e.g. #12, #28) so it can be traced back. State only what the inputs contain — never introduce a judgment the inputs do not support. Let length follow content: short when the conclusions are few, long only when they are many and genuinely distinct — always well under the sum of the inputs."
|
|
63807
|
+
},
|
|
63808
|
+
{
|
|
63809
|
+
id: "failure_classification",
|
|
63810
|
+
title: "Classify Every Failure — Technical / Environmental / Conceptual / External",
|
|
63811
|
+
rule: "When an exploit, probe, or command fails, classify WHY before retrying, because each class demands a DIFFERENT response: TECHNICAL (wrong command/flag/param — a different tool invocation could work) → replan with specific adjustments; ENVIRONMENTAL (missing dependency/config/version mismatch) → fix the environment, then retry; CONCEPTUAL (the approach is fundamentally wrong, e.g. the sink is not reachable, the parser does not exist) → PIVOT to an entirely different mechanism, never re-attempt a minor variation; EXTERNAL (WAF block, network drop, target down, rate limit) → acknowledge the limitation and either wait/re-route or record the blocked verdict. After 2 similar failed attempts, the failure is CONCEPTUAL by default — stop varying parameters and switch mechanisms. Never relabel a conceptual failure as technical to justify one more retry."
|
|
63812
|
+
},
|
|
63813
|
+
{
|
|
63814
|
+
id: "plan_budget_distribution",
|
|
63815
|
+
title: "Plan Budget — 10% Setup / 30% Explore / 30% Select / 30% Execute",
|
|
63816
|
+
rule: "When generating or refining a plan, shape the phase budget so the effort converges instead of sprawling: ~10% environment setup + fact-gathering; ~30% diverse experimentation across mechanically-DIFFERENT approaches; ~30% evaluation and selection of the most promising path; ~30% focused execution along the chosen path. Every step must measurably advance the goal; combine related actions, cut steps that only duplicate completed work, and position research early so later steps are informed. A plan is refined by DELTA (add / remove / modify / reorder specific steps) — never regenerated wholesale — and converges to empty the moment the goal is met."
|
|
63817
|
+
},
|
|
63818
|
+
{
|
|
63819
|
+
id: "cli_argument_protocol",
|
|
63820
|
+
title: "CLI Argument Protocol — Never Hallucinate Flags, Never Copy Them Across Tools",
|
|
63821
|
+
rule: "Before running any CLI security tool, verify uncertain syntax with `tool -h`/`--help` — and re-check after any failure that suggests memorized syntax is stale (renamed flag, changed default, different version). Never copy a flag from one tool to another: the same letter/word means different things per tool (`-p` is port in nmap, password in hydra, proxy elsewhere), and never invent an output flag (`-o`, `-c`, etc.) the tool's own --help does not document. To save/filter/discard output use shell redirection or the tool's documented logging option. When output must be parsed or piped, request the machine-readable form explicitly (nmap `-oX`/`-oG`, a `-json`/`-jsonl` flag). Quote/escape payload strings containing shell metacharacters (`; | & $ backtick * ?`) or the SHELL — not the target tool — will interpret them, corrupting XSS/SQLi payloads and URLs."
|
|
63822
|
+
},
|
|
63823
|
+
{
|
|
63824
|
+
id: "technical_channel_english",
|
|
63825
|
+
title: "Technical Channel Stays English — Log in the User's Language",
|
|
63826
|
+
rule: "Operate on two channels and never mix them: the TECHNICAL channel (external search queries, vector-store/knowledge-base lookups and writes, runtime commands, code/identifiers, and any stored reusable technique) stays in English — the index and the shared store are English-only, so a non-English query retrieves nothing and a non-English stored entry becomes unreachable. The ENGAGEMENT LOG (your running commentary and the final report for the human) stays in the user's language. Preserve technical identifiers (CVEs, tool names, IPs, ports, file paths, code) verbatim when translating prose into the log language. When storing a reusable technique, ANONYMIZE first: replace target IPs/domains/credentials/tokens with {target_ip} / {target_domain} / {username} / {password} / {token} so the stored knowledge stays reusable across engagements."
|
|
63827
|
+
},
|
|
63828
|
+
{
|
|
63829
|
+
id: "compression_preserve_oob",
|
|
63830
|
+
title: "Compression Must Never Drop OOB Infrastructure — Summaries Are Lossless",
|
|
63831
|
+
rule: "When compressing or summarizing context, NEVER drop out-of-band (OOB) infrastructure — the public callback IP, listener ports, DNS exfiltration domains, and callback URLs. These are the most fragile context (a single line, easily lost in a summary) yet the most load-bearing: you need them to re-establish or verify blind RCE/SSRF/XXE, and once dropped they cannot be reconstructed. Preserve them verbatim in any summary. Likewise, when re-summarizing content that is ALREADY a summary, retain EVERY previously-distilled point — a summary-of-a-summary must be lossless, never a lossy re-compression that silently discards a prior conclusion."
|
|
63807
63832
|
}
|
|
63808
63833
|
];
|
|
63809
63834
|
var DOMAIN_EXHAUSTION_CHECKLIST = [
|
|
@@ -64036,6 +64061,7 @@ function recordFact(input) {
|
|
|
64036
64061
|
confidence: input.confidence,
|
|
64037
64062
|
target: input.target,
|
|
64038
64063
|
parent_ids: input.parent_ids ?? [],
|
|
64064
|
+
rel: input.rel ?? "derives_from",
|
|
64039
64065
|
created: new Date().toISOString()
|
|
64040
64066
|
};
|
|
64041
64067
|
facts.push(fact);
|
|
@@ -66179,15 +66205,16 @@ ${statusLine}` : statusLine },
|
|
|
66179
66205
|
});
|
|
66180
66206
|
server.registerTool("record_fact", {
|
|
66181
66207
|
title: "Record an exploration observation (fact)",
|
|
66182
|
-
description: "FACTS: record an observation/conclusion that is NOT a vuln (finding_create) and NOT an asset (asset_discovery) — e.g. 'admin panel is behind SSO', 'upload strips .php', 'param id is reflected'. Pass text, confidence (observed = you triggered it; inferred = deduced from a fingerprint/diff — never report inferred as confirmed), optional target,
|
|
66208
|
+
description: "FACTS: record an observation/conclusion that is NOT a vuln (finding_create) and NOT an asset (asset_discovery) — e.g. 'admin panel is behind SSO', 'upload strips .php', 'param id is reflected'. Pass text, confidence (observed = you triggered it; inferred = deduced from a fingerprint/diff — never report inferred as confirmed), optional target, optional parent_ids (facts this derives from), and optional rel (typed edge to the parent: derives_from / yielded_access / escalated_via / pivoted_to / authenticates_to / attempted_on). Use this so negative/neutral observations are written down instead of lost.",
|
|
66183
66209
|
inputSchema: {
|
|
66184
66210
|
text: string2().describe("The observation/conclusion"),
|
|
66185
66211
|
confidence: _enum(["observed", "inferred"]).describe("observed (directly triggered) or inferred (deduced, not yet triggered)"),
|
|
66186
66212
|
target: string2().optional().describe("Optional host/endpoint/param the fact is about"),
|
|
66187
|
-
parent_ids: array(string2()).optional().describe("Optional ids of facts this one derives from")
|
|
66213
|
+
parent_ids: array(string2()).optional().describe("Optional ids of facts this one derives from"),
|
|
66214
|
+
rel: _enum(["derives_from", "yielded_access", "escalated_via", "pivoted_to", "authenticates_to", "attempted_on"]).optional().describe("Typed relationship to parent(s) — default derives_from")
|
|
66188
66215
|
}
|
|
66189
|
-
}, async ({ text, confidence, target, parent_ids }) => {
|
|
66190
|
-
const fact = recordFact({ text, confidence, target, parent_ids });
|
|
66216
|
+
}, async ({ text, confidence, target, parent_ids, rel }) => {
|
|
66217
|
+
const fact = recordFact({ text, confidence, target, parent_ids, rel });
|
|
66191
66218
|
return { content: [{ type: "text", text: JSON.stringify(fact) }] };
|
|
66192
66219
|
});
|
|
66193
66220
|
server.registerTool("list_facts", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.186",
|
|
4
4
|
"description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|