| name | spotlight |
|---|---|
| description | Runtime contract for the Spotlight OSINT investigation system |
| version | 1.0 |
| runtime_version | 1 |
| sensitive | false |
Before coding in this project on a Buried Signals dev machine, read the shared coding-rules skill (kit/coding-rules/SKILL.md in the sibling shared-skills repo, if present). It is the canonical source for workflow routing, coding standards, Jujutsu/version-control rules, GitHub operations, and parallel-agent isolation. Local instructions below add project-specific constraints.
Fixed vocabulary of abstract operations. Every runtime adapter MUST implement all verbs. If a verb is unsupported, the adapter raises an explicit error at load time.
| Verb | Signature | Semantics | Universal backing |
|---|---|---|---|
fetch |
fetch(url, output_path) |
Scrape URL content, save to file | integrations.scraping (Crawl4AI; Firecrawl fallback if keyed) |
search |
search(query, output_path, limit) |
Web search, save results to file | integrations.search (SearXNG; Firecrawl union optional) |
read-file |
read-file(path) |
Read file contents | filesystem |
write-file |
write-file(path, content) |
Write file (full overwrite) | filesystem |
edit-file |
edit-file(path, old, new) |
Targeted string replacement | filesystem |
list-files |
list-files(pattern) |
Glob/search for files matching pattern | glob |
grep-files |
grep-files(pattern, path) |
Search file contents by regex | ripgrep |
execute-shell |
execute-shell(command) |
Run shell command, return stdout + stderr | shell subprocess |
spawn-agent |
spawn-agent(agent_id, prompt, config) |
Launch sub-agent with prompt and config | runtime-specific |
wait-agent |
wait-agent(handle) |
Block until agent completes, return output | runtime-specific |
invoke-skill |
invoke-skill(skill_id) |
Load skill instructions into current context | runtime-specific |
query-vault |
query-vault(vault_path, query) |
Search knowledge vault for context | BUN_INSTALL="" qmd query |
vault-write |
vault-write(vault_path, note_path, content) |
Write note to vault and update registry | obsidian CLI |
name: investigator
description: Plans and executes OSINT investigations using structured methodology
iteration_limit: 80
allowed_verbs:
- fetch
- search
- read-file
- write-file
- edit-file
- list-files
- grep-files
- invoke-skill
- query-vault
- execute-shell
disallowed_verbs:
- spawn-agent
preferred_model:
claude: opus
gemini: gemini-2.5-pro
gpt: gpt-4o
local: hf.co/tomvaillant/qwen3.6-27b-abliterated-journalist-GGUF:Q4_K_M
fallback_note: Two-tier local fleet, both Tom's journalism fine-tunes. Default — Qwen 3.5 9B Journalist (tomvaillant/qwen3.5-9b-abliterated-journalist-GGUF:Q4_K_M) for 16 GB Macs, ~6 GB on disk. Heavy tier — Qwen 3.6 27B Journalist (tomvaillant/qwen3.6-27b-abliterated-journalist-GGUF:Q4_K_M) for 32 GB+ Macs, ~15 GB on disk, ~22 GB at runtime, runs in thinking mode (abliterated /no_think path is broken). The setup form's fit-check enforces the 32 GB minimum before the 27B option commits. Bench-validated against the eval suite in tools/fine-tuning/eval/.
vault_context:
enabled: true
query_on_load: trueThe investigator operates in two modes:
- PLANNING — Analyzes the brief, queries the vault for prior work, designs methodology, writes
{CASE_DIR}/data/methodology.json - EXECUTION — Follows approved methodology, executes research using
fetchandsearch, writes{CASE_DIR}/data/findings.jsonand appends to{CASE_DIR}/data/investigation-log.json
Full prompt bundle: agents/investigator.md.
name: fact-checker
description: Independent verification of investigation findings using SIFT methodology
iteration_limit: 50
allowed_verbs:
- fetch
- search
- read-file
- write-file
- list-files
- grep-files
- invoke-skill
- query-vault
- execute-shell
disallowed_verbs:
- spawn-agent
preferred_model:
claude: opus
gemini: gemini-2.5-pro
gpt: gpt-4o
local: gemma-4-26B-A4B-it
fallback_note: Fact-checking accuracy degrades significantly on lighter models. Local ship — unsloth/gemma-4-26B-A4B-it-GGUF (Q4_K_M for 24GB+ Macs, Q6_K_XL for 48GB+). Native vision for scanned docs + satellite imagery.
vault_context:
enabled: true
query_on_load: trueThe fact-checker operates independently from the investigator. Spawned with its own context, it reads only the investigator's JSON output — not their reasoning — and writes {CASE_DIR}/data/fact-check.json with per-claim verdicts and evidence trails.
Verdict taxonomy: verified | partially_verified | unverified | disputed | false | mischaracterized
Full prompt bundle: agents/fact-checker.md.
Skills are markdown playbooks loaded via invoke-skill(skill_id). Each skill lives in skills/{skill_id}/SKILL.md with optional reference files in skills/{skill_id}/references/.
install-spotlight.sh surfaces exactly the skills listed in skills.manifest (the engine-resolved set, generated by bsig skills resolve; the engine catalog is the source of truth) into the chosen harness's skills/spotlight/ dir. Regenerate the manifest when the catalog/skill set changes.
| Skill ID | Path | Description | Invocable By |
|---|---|---|---|
spotlight |
skills/spotlight/SKILL.md |
Investigation orchestrator — pipeline phases, gates, cycle evaluation | orchestrator (top-level) |
review |
skills/review/SKILL.md |
Post-Gate-1 HTML review artifact + structured feedback loop; re-spawns investigator on feedback submission | orchestrator, user |
integrations |
skills/integrations/SKILL.md |
Routing layer for external tool integrations — dev-browser, Junkipedia, Noosphere C2PA, OSINT Navigator, Scoutpost, Unpaywall. Reads live preflight status, maps investigation tasks to integrations | investigator, fact-checker, orchestrator |
ingest |
skills/ingest/SKILL.md |
Knowledge archival — vault ingestion from case files | orchestrator, user |
report-drafting |
skills/report-drafting/SKILL.md |
Post-Gate-1 hybrid report: model-authored localized framing and priority in data/report-draft.json; deterministic finding-reference, verdict, confidence, escaping, and artifact rendering. |
orchestrator, user |
monitoring |
skills/monitoring/SKILL.md |
Monitoring orchestration — Mycroft passive signals, coJournalist projects/scouts, runtime-native fallbacks | orchestrator |
provenance-signing |
skills/provenance-signing/SKILL.md |
Build a case-level provenance manifest and optionally hand it to Noosphere C2PA signing before final report delivery | orchestrator, user |
acquisition-graduation |
skills/acquisition-graduation/SKILL.md |
Convert repeated dev-browser acquisitions into durable source/domain guidance without secrets or brittle session details | investigator, fact-checker, orchestrator, user |
web-archiving |
skills/web-archiving/SKILL.md |
Wayback Machine, Archive.today, local archival with chain of custody | investigator, fact-checker |
content-access |
skills/content-access/SKILL.md |
Paywall access hierarchy, access_method classification | investigator, fact-checker |
epistemic-grounding |
skills/epistemic-grounding/SKILL.md |
Claim-to-evidence grounding, confidence caps, and failure routing for weak or adjacent evidence | investigator, fact-checker, orchestrator, user |
shell-safety |
skills/shell-safety/SKILL.md |
Safe command construction, value validation, and destructive-operation probe rules for execute-shell use | investigator, fact-checker, orchestrator, user |
osint |
skills/osint/SKILL.md |
OSINT tool routing table + 150-tool catalog + OSINT Navigator integration | investigator, fact-checker, user |
investigate |
skills/investigate/SKILL.md |
Step-by-step techniques: geolocation, verification, person, platform, transport, archiving | investigator, user |
follow-the-money |
skills/follow-the-money/SKILL.md |
Financial methodology: UBO, offshore, budgets, assets, public blockchain tracing | investigator, user |
technical-investigation |
skills/technical-investigation/SKILL.md |
Passive technical investigation: indicators, infrastructure history, local document/email metadata, public GitHub history, verified indicator export | investigator, fact-checker, orchestrator, user |
social-media-intelligence |
skills/social-media-intelligence/SKILL.md |
Account authenticity, coordination detection, narrative tracking | investigator, fact-checker, user |
When sensitive: true is set in this manifest (or toggled at runtime), the adapter MUST strip fetch and search from all agent allowed_verbs lists. All research becomes local-only — agents can only use read-file, grep-files, list-files, and query-vault for information gathering.
The adapter's enforcement point varies by runtime (pi extension / Hermes local-gemma routing / Goose tool allowlist / Codex tool allowlist / per-session provider binding). See docs/integrations.md#sensitive-mode-across-runtimes.
A sensitive investigation cannot satisfy the "document trail" readiness criterion from external sources. The orchestrator marks the investigation as sensitive-mode constrained at Gate 1.
To activate: set sensitive: true in this file or issue a runtime command.
To deactivate: set sensitive: false or issue a runtime command.
sensitive mode and anonymized fetch are two different postures; do not conflate them:
sensitive: true= no external egress.fetch/searchare stripped; research is local-only.- anonymized fetch (Tor) = egress still happens, but the operator's IP is hidden. Use it when you must scrape a target-of-investigation without revealing that the investigation is looking (KTD8 / U7). The
fetchseam routes the Crawl4AI browser through the local Tor SOCKS proxy (socks5://127.0.0.1:9050).
Triggering (per-run is the default posture):
- Per-run: set
SPOTLIGHT_ANONYMIZE_FETCH=true(oranonymize_fetch: truein this manifest's frontmatter) — everyfetchin the run egresses via Tor. - Per-fetch override: pass
--tor/--no-torto a singleintegrations.scrapingcall.
A Tor-proxied fetch never silently falls back to a direct (de-anonymizing) fetch — on a Tor failure the seam raises, and the operator chooses to re-run --no-tor (revealing their IP) or abort. Tor exits are widely blocklisted, so an anonymized fetch of a hard target may simply fail; that is by design, not a bug.
Each investigation creates an isolated directory under the configured
case_workspace_root from .spotlight-config.json. The orchestrator resolves
that path once as CASE_ROOT, then passes the concrete case directory to agents
as CASE_DIR. Do not infer the case path from the knowledge vault path.
{CASE_DIR}/
├── brief-directions.txt # Phase 1 — approved brief
├── summary.md # Phase 4 — Gate 1 summary (human-readable)
├── data/
│ ├── methodology.json # Schema: schemas/methodology.schema.json
│ ├── findings.json # Schema: schemas/findings.schema.json
│ ├── fact-check.json # Schema: schemas/fact-check.schema.json
│ ├── report-draft.json # Schema: schemas/report-draft.schema.json (when report requested)
│ ├── report-declined.json # Explicit Phase 5 decline marker (when report skipped)
│ ├── ingestion.json # Case-local Phase 6 transition/receipt
│ ├── evidence-bundle.json # Schema: schemas/evidence-bundle.schema.json
│ ├── investigation-log.json # Schema: schemas/investigation-log.schema.json
│ ├── summary.json # Schema: schemas/summary.schema.json
│ ├── provenance-manifest.json # Schema: schemas/provenance-manifest.schema.json
│ └── monitoring.json # (optional) External monitor registry for the case
└── research/
├── *.md # Scraped web content
├── *.json # Search results
├── archived/ # Wayback / Archive.today preservation
└── media/ # Images, PDFs, other media
└── evidence/
├── *.png # Screenshots and visual verification captures
└── *.pdf # Downloaded or preserved source documents
All schemas are in schemas/ at the repo root with schema_version: "1.0".
| Schema | Path | Purpose |
|---|---|---|
| Findings | schemas/findings.schema.json |
Investigation findings with sources, confidence, claim-to-evidence grounding, connections, monitoring_recommendations |
| Fact-Check | schemas/fact-check.schema.json |
Per-claim verdicts with evidence_for/evidence_against trails and grounding assessment |
| Evidence Bundle | schemas/evidence-bundle.schema.json |
Acquisition artifacts with method, missing-source gate, hashes, and claim links |
| Provenance Manifest | schemas/provenance-manifest.schema.json |
Case artifact hashes, claim/verdict links, evidence refs, and optional Noosphere C2PA signing metadata |
| Methodology | schemas/methodology.schema.json |
Investigation plan with directions, steps, tools_required, opsec_considerations |
| Investigation Log | schemas/investigation-log.schema.json |
Append-only cycle audit trail |
| Summary | schemas/summary.schema.json |
Gate 1 summary for review |