stock-search v1.0.0 (new) + stock-search-research v1.0.0 (new) + ltx-video-pipeline, better-search, better-search-research, deep-web-research, ai-brain-kb, ai-vid-stock updates (2026-07-22)

This commit is contained in:
Hermes Agent
2026-07-22 11:33:04 -05:00
parent c831010050
commit 7e81fdac31
8 changed files with 1265 additions and 46 deletions
+83 -33
View File
@@ -1,7 +1,7 @@
---
name: deep-web-research
description: Exhaustive deep web research — six-move flow, external findings ledger, mechanical saturation check, disconfirmation, condensation from disk. Domain-aware tool selection with adaptive re-strategizing. Opt-in skill for the research profile.
version: 2.1.0
version: 2.6.0
author: Hermes Agent
---
@@ -15,7 +15,7 @@ exhaustive research methodology.
These persist across all turns — they are in the skill, not in fading context:
- **Confined to /tmp.** All file writes go to `/tmp/`. Never write outside /tmp.
- **Confined to /tmp.** All file writes go to `/tmp/`. Never write outside /tmp. **Exception:** The final condensed report (Move 5) and the abort report (Under-Specified Question Handling) go to `/home/n8n/workspace/research/results/` (absolute path, create the directory first with `mkdir -p`). Also, any file path the operator names explicitly in the prompt (e.g., Stage 3 fix pass editing a plan file in place). The ledger and gate files stay in /tmp.
- **No self-provisioning.** Never install software. No pip, npm, apt, docker, or
any package manager. Use only what's already configured.
- **No repeat searches.** If you catch yourself searching the same thing twice,
@@ -66,7 +66,7 @@ static reference, not generated per-question.
At 600 turns, early findings scroll out of context. The ledger is the fix.
**Path:** `/tmp/research-<session-id>.md`
**Path:** `/tmp/research-<YYYY-MM-DD>-<slug>.md` (see Move 0 — the stem is picked once, not derived from session_id)
**Schema per finding:**
```
@@ -114,9 +114,21 @@ This skill runs headless — there is no operator to ask clarifying questions. I
**What to do instead of guessing:**
1. Do NOT start Move 0. Do NOT begin the ledger.
2. Write to stderr / final report:
2. Write the abort report to the results path so the dispatcher can find it:
```
mkdir -p /home/n8n/workspace/research/results
```
Then write to `/home/n8n/workspace/research/results/<YYYY-MM-DD>-<slug>-ABORTED.md`:
```
---
question: "<original question>"
date: <YYYY-MM-DD>
status: ABORTED
---
## Aborted: Under-Specified Question
The question "<original question>" has multiple plausible interpretations.
@@ -140,6 +152,8 @@ This skill runs headless — there is no operator to ask clarifying questions. I
### Move 0: Analyze & Strategize
**Pick the ledger stem once:** `/tmp/research-<YYYY-MM-DD>-<slug>`. Use `<stem>.md` for the ledger and `<stem>-gate.md` for the gate. Substitute this stem into every grep below. (The session_id is not available to the agent under `-Q` — use the date+slug stem instead.)
1. Consult the `search-key` decision matrix — it's your tool reference, not a
lookup you match against.
@@ -156,7 +170,9 @@ This skill runs headless — there is no operator to ask clarifying questions. I
- Pivots: if I find <X>, add <tool Y>
```
4. OSINT gate — only if the plan names maigret / holehe / theHarvester /
4. Write the phase gate template (see Guardrails → Phase Gate) to `<stem>-gate.md` with all boxes unchecked. This is the starting state — update it as you progress.
5. OSINT gate — only if the plan names maigret / holehe / theHarvester /
Spiderfoot AND the target is a private individual with no public role: log
`## Ethics Note: <intent>` and confirm the scan is proportionate.
@@ -247,11 +263,37 @@ Disconfirmation actively hunts for disagreement.
### Move 5: Condensation
Read the full ledger from disk. Read the phase gate file. If any box is
unchecked, do NOT condense — go back and complete that item.
unchecked, do NOT condense — go back and complete that item. (The `OR:` items
in the gate are alternatives, not requirements — a normal run will have some
unchecked; that's expected.) **Exception: the turn-ceiling ramp overrides the
gate. At ≥450 turns (once the ramp has fired), condense regardless of unchecked
boxes and list the unmet gate items under `## Uncertainty`.**
Synthesize using this template:
Synthesize using this template, then **WRITE the report to disk**:
1. `mkdir -p /home/n8n/workspace/research/results`
2. Write to `/home/n8n/workspace/research/results/<YYYY-MM-DD>-<slug>.md` (absolute path, derive slug from the question)
This is the single deliverable — the dispatcher expects it at this path. Do NOT just output to stdout and exit.
3. **Save to ai_brain_kb.** After writing the report, add it to the Qdrant knowledge base:
```
mcp__better_qdrant__add_documents(
collection="ai_brain_kb",
embeddingService="ollama",
filePath="/home/n8n/workspace/research/results/<YYYY-MM-DD>-<slug>.md"
)
```
This is mandatory — every deep research report goes into the brain. The `ai-brain-kb` skill and `better_qdrant` MCP server are configured on this profile. If the MCP call fails (network, Qdrant down), log the error to the report's Uncertainty section and continue — the report file on disk is the source of truth.
```
---
question: "<original question>"
date: <YYYY-MM-DD>
sources: <count>
confidence: <high|medium|low>
---
# <Answer in 1-3 sentences>
## Key Findings
@@ -273,7 +315,7 @@ Synthesize using this template:
## Tools That Would Have Helped
- <tool>: <what it would have enabled>
None: all sources were accessible with available tools.
(If nothing was missing, write exactly: "None: all sources were accessible with available tools.")
```
## Guardrails
@@ -282,22 +324,24 @@ None: all sources were accessible with available tools.
Every 3-4 searches, run this command — do not self-assess:
```
grep -c "^### Finding #.*\[SQ<N>\]" /tmp/research-<sid>.md
grep -c "^### Finding #.*\[SQ<N>\]" /tmp/research-<YYYY-MM-DD>-<slug>.md
```
Compare to the previous count. If zero new findings in the last 3 searches,
that sub-question is saturated. Move to the next. This is a measurable fact,
not a vibe. The `[SQ<N>]` tag makes this immune to header ordering — it counts
by tag, not by position.
that sub-question is saturated. Move to the next. **Exception: if the count is
0 (no findings at all), keep going to 5 searches, then document it with the
information-void template.** This is a measurable fact, not a vibe. The `[SQ<N>]`
tag makes this immune to header ordering — it counts by tag, not by position.
### Phase Gate File
The phase gate is a file at `/tmp/research-<sid>-gate.md`. Write it and read it
The phase gate is a file at `/tmp/research-<YYYY-MM-DD>-<slug>-gate.md`. Write it and read it
back — it is not a mental checklist. Before moving to Move 5, read the gate file.
If any box is unchecked, do NOT condense. Go back and complete that item.
(The `OR:` items are alternatives, not requirements — a normal run will have some
unchecked; that's expected.)
```
# Phase Gate
- [ ] All sub-questions have findings in the ledger
- [ ] All sub-questions have findings in the ledger or are documented as VOID
- [ ] Disconfirmation pass completed for key claims
- [ ] Source diversity: ≥5 unique domains across all findings
- [ ] Source diversity: no single domain >30% of findings
@@ -311,8 +355,9 @@ Update this file as you progress.
Mechanical domain diversity check:
```
grep -oP 'Source: \K[^ ]+' /tmp/research-<sid>.md | grep -oP 'https?://[^/]+' | sort -u | wc -l
grep -oP 'Source: \K[^ ]+' /tmp/research-<YYYY-MM-DD>-<slug>.md | grep -oP 'https?://[^/]+' | sort | uniq -c | sort -rn
```
This shows both the unique domain count and the per-domain share — use it to verify the ≥5 domains and ≤30% per-domain requirements.
### Turn Ceiling
@@ -324,9 +369,26 @@ If the ceiling is hit, deliver partial findings with a note on what's missing.
### SearXNG Failure Handling
If SearXNG returns errors or empty results for 3 consecutive searches (different
queries), wait 10 seconds and retry once. If still failing, note the instance
issue in the ledger and fall back to `web_search` (built-in) or
`duckduckgo-search` (Python library) for the remainder of that sub-question.
queries):
1. **First recovery: VPN reconnect.** Reconnect VPN to get a fresh IP, then
retry the most recent search once. The VPN reconnect procedure is:
```bash
nordvpn disconnect && nordvpn connect us <different_city>
```
Use a different city from the current connection to avoid the same server.
Verify with `nordvpn status`. This is authorized without asking — the
nordvpn skill grants reconnect permission. Do NOT change any other VPN
settings.
2. **Second recovery:** Wait 10 seconds and retry once with a different
framing.
3. **Third recovery:** Fall back to `web_search` (built-in), or
`duckduckgo-search` (Python library) if already installed.
4. **If all fail:** Document the void per the information-void template and
move on.
The VPN reconnect is a recovery step, not a search — it doesn't count against
the turn budget or saturation tracking.
## Tool Policy
@@ -336,17 +398,5 @@ APIs with billing, no metered endpoints. You determine what fits — you are not
given a list of allowed or disallowed tools.
**No self-provisioning.** Never install, pull, or spin up new tools at runtime.
### Tools That Would Have Helped
At the end of the response (after Sources), add a section if any limitations
were hit:
```
Tools that would have improved this research:
- <tool name>: <what it would have enabled>
None: all sources were accessible with available tools.
```
This is informational only. Do your best with what's available and note what
could have been better. Do not stop or block on tool gaps.
(The "Tools That Would Have Helped" section in the Move 5 report template covers
tool gaps — it's informational only; do not stop or block on them.)