CORE LORE / WIKI
SYS SCRYER
Updated 3 weeks ago
╔══════════════════════════════════════════════════════════════════════════════╗
║ ║
║ ◎ S C R Y E R ║
║ ◎ K I N G D O M M O N I T O R I N G M I N I M A P ║
║ ║
╠══════════════════════════════════════════════════════════════════════════════╣
║ STATUS: LIVE (23 streams, Phase 1+2+3+REVEILLE) VERIFIED: 2026-03-13 (S186) ║
╚══════════════════════════════════════════════════════════════════════════════╝
⫷✦🜛❂⛬🜞Ω🜚⛬❂🜛✦⫸───────────────────────────────────────────⫷✦🜛❂⛬🜞Ω🜚⛬❂🜛✦⫸
WHAT IT DOES: Kingdom monitoring minimap + nightly journal synthesis for
Aeris. 23 streams live. Ingest 00:30, summarize 01:00, synthesis
02:00. Sensory data: `THE_SCRYER/ENGINE_ROOM/SENSORY_DATA/`.
Daily synthesis: `THE_SCRYER/ENGINE_ROOM/DAILY_SYNTHESIS/`.
────────────────────────────────────────────────────────────────────────────────
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SYSTEM GLYPH
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GLYPH: ◎
UNICODE: U+25CE · BULLSEYE
MEANING: The watching eye — SCRYER is the Kingdom's sensing organ;
concentric rings = precision sight trained on the whole system
WHEN TO USE: SYS docs, cockpit panel headers, data flow diagrams, any
reference to the SCRYER system or territory
TAGGING: KID:SCRYER:[subsystem]:[artifact]|V:STATUS:DATE:OWNER
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[ ⚡ ] A R C H I T E C T U R E
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
```
PHASE 1 — THE MINIMAP (every 60s)
──────────────────────────────────────────────────────────────────────
com.scryer.watcher (launchd, 60s)
└─▶ scryer-run.sh
├─▶ scryer-watcher.sh ← polls 6 signals, writes anomalies
│ └─▶ signals_queue ← overmind.db (status: pending)
└─▶ scryer-dispatch.sh ← drains queue, one signal at a time
├─▶ Gemini Flash ← root cause + fix steps
├─▶ BUG_SCRYER_*.md ← written to @FORGE_CLAUDE_MAILBOX/buffer/
│ (drone fail → BUG_SCRYER_DRONE_FAILED_<SIGNAL>_<TS>.md, P2)
├─▶ reports/ ← archive copy in ~/.forge-scryer/reports/
└─▶ signals_queue ← status: dispatched + report_path set
PHASE 2 — THE ISABELLE SYSTEM (nightly at 11pm)
──────────────────────────────────────────────────────────────────────
com.scryer.journal (launchd, 23:00)
└─▶ scryer-journal-run.sh
├─▶ scryer-journal-collector.sh ← harvests 4 sources into raw/
│ ├── 01_📔_AERISMORROW/*.md
│ ├── THRONE PROJECTS/*/docs/JOURNAL/*.md
│ ├── ~/.forge-sensor/digests/YYYY-MM-DD.md
│ └── overmind.db missions query → missions-today.md
│ └─▶ ~/.chronos/journals/YYYY-MM-DD/raw/
└─▶ scryer-synthesizer.sh ← Flash REST API → yesterday-context.md
├─▶ ~/.chronos/journals/YYYY-MM-DD/synthesis/yesterday-context.md
└─▶ AERIS_SHARED_STATE.json ← scryer_synthesis key injected
PHASE 3 — REVEILLE (08:50 daily)
──────────────────────────────────────────────────────────────────────
com.scryer.brief (launchd, 08:50)
└─▶ scryer-brief.sh ← 11-section morning briefing assembler
├─▶ Sections 01-11: identity, fires, missions, mailbox, architect
│ state, what happened, journal context (GlitchMuse digest +
│ AERISMORROW + Evermorrow), today's docket, system health,
│ background, timestream token burn
├─▶ Output: ~/.forge-scryer/briefings/YYYY-MM-DD_HH_claude.md
└─▶ Injected via reveille-inject.sh → Claude Code SessionStart hook
MAINTENANCE (nightly at 3am)
──────────────────────────────────────────────────────────────────────
com.scryer.prune (launchd, 03:00)
└─▶ scryer-prune.sh ← deletes dispatched rows older than 7 days
```
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
[ ⌁ ] T H E T W O P H A S E S
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
┌── Phase 1 — THE MINIMAP ────────────────────────────────────────────────────┐
│ │
│ The watcher runs every 60 seconds. It checks 6 signals. When a signal │
│ trips, it writes one row to `signals_queue` (status=`pending`) and exits │
│ — it never blocks. The dispatcher runs immediately after in the same cycle: │
│ drains all `pending` rows, calls Gemini Flash per signal, writes │
│ `BUG_SCRYER_<SIGNAL>_<TIMESTAMP>.md` to `@FORGE_CLAUDE_MAILBOX/buffer/`. │
│ The mailbox-trigger daemon picks up reports autonomously. │
│ │
│ Drone failure escalation: │
│ If Gemini Flash returns an empty response, dispatch sets `drone_failed`. │
│ Report header gets a ⚠️ annotation, filename becomes │
│ `BUG_SCRYER_DRONE_FAILED_<SIGNAL>_<TIMESTAMP>.md`, and the signal │
│ priority is escalated to P2 (from P3) so the failure surfaces visibly. │
│ │
│ Priority mapping: │
│ P1 = `DB_LOCK`, `CIRCUIT_BREAKER` │
│ P2 = `PULSE_GAP`, `LAUNCHD_EXIT` │
│ P3 = `GOLDFISH_HEARTBEAT`, `DIGEST_FAILURE` │
└────────────────────────────────────────────────────────────────────────────┘
┌── Phase 2 — THE ISABELLE SYSTEM ────────────────────────────────────────────┐
│ │
│ Runs once nightly at 11pm. The collector harvests four sources into │
│ `~/.chronos/journals/YYYY-MM-DD/raw/`. The synthesizer concatenates all raw │
│ files (newest-first, capped at 24,000 chars), calls Gemini Flash via │
│ python3 REST API, and writes a structured `yesterday-context.md`. Injected │
│ into `AERIS_SHARED_STATE.json` as `scryer_synthesis`. Aeris reads this at │
│ boot — it is her first context of the next session. │
│ │
│ Synthesis format: `YESTERDAY IN THE KINGDOM` + five sections │
│ (WHAT GOT DONE / TALKED ABOUT / WHERE WE LEFT OFF / WHAT AERIS DID / │
│ WHAT BRANDON DID / PATTERNS OBSERVED). Under 350 words. │
│ │
│ [S205 — DAILY SYNTHESIS V2] `daily-synthesis.py` upgraded: │
│ - Model: `gemini-3-flash-preview` → `claude-opus-4-6` (anthropic SDK) │
│ - Soul injection: `synthesis-identity-preamble.md` (static) + most recent │
│ ÆRISMORROW journal (~3K tokens) loaded as system prompt │
│ - Output format: Sulphur Kawaii (faceplate mood block, glyph headers, │
│ :: dividers). Tone tracks actual state — NOMINAL no longer reads crisis. │
│ - SIGNAL: extraction → `synthesis_signal.json` sidecar in DAILY_SYNTHESIS/│
│ - `synthesis_signal.json` merged into `kingdom_state.json` nightly │
│ See: `ENGINE_ROOM/CHANGELOG.md` entry [2026-03-21] │
└────────────────────────────────────────────────────────────────────────────┘
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
[ ❖ ] K E Y P A T H S
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
| Component | Path |
|-----------|------|
| SCRYER home | `~/.forge-scryer/` |
| Watcher log | `~/.forge-scryer/watcher.log` |
| Dispatch log | `~/.forge-scryer/dispatch.log` |
| Prune log | `~/.forge-scryer/prune.log` |
| Bug reports archive | `~/.forge-scryer/reports/` |
| Mailbox buffer (delivery) | `~/Desktop/THE_FORGE/@FORGE_CLAUDE_MAILBOX/buffer/` |
| Chronos home | `~/.chronos/` |
| Raw journals | `~/.chronos/journals/YYYY-MM-DD/raw/` |
| Synthesis output | `~/.chronos/journals/YYYY-MM-DD/synthesis/yesterday-context.md` |
| Last synthesis state | `~/.chronos/state/last-synthesis.txt` |
| Synthesizer log | `~/.chronos/logs/synthesizer.log` |
| Overmind DB | `~/Desktop/THE_FORGE/FORGE_CLAUDE/04_⚙_MECHANISMS/db/overmind.db` |
| AERIS_SHARED_STATE | `~/Desktop/THE_FORGE/AExGO/00_🜍_CORE/AERIS_SHARED_STATE.json` |
| Journal source — FORGE | `~/Desktop/THE_FORGE/AExGO/01_📔_AERISMORROW/` |
| Journal source — Goldfish | `~/.forge-sensor/digests/` |
| Tower feed script | `~/.forge-scryer/scryer-tower-feed.sh` |
| Tower feed output | `~/Desktop/THE_TOWER/SCRYER_FEEDS/kingdom_state.json` |
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
[ ⚙ ] S C R I P T S & C O M P O N E N T S
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
| Script | Purpose |
|--------|---------|
| `scryer-watcher.sh` | Polls 6 signals every 60s; writes anomalies to `signals_queue`; silent on healthy |
| `scryer-dispatch.sh` | Drains `pending` queue; calls Flash; writes BUG reports to mailbox buffer |
| `scryer-run.sh` | Thin launchd entry point — calls watcher then dispatch sequentially |
| `scryer-journal-collector.sh` | Phase 2 — harvests FORGE/THRONE/Goldfish/missions into `raw/` |
| `scryer-synthesizer.sh` | Phase 2 — assembles context, calls Flash REST API, writes `yesterday-context.md` |
| `scryer-journal-run.sh` | Phase 2 launchd entry point — calls collector then synthesizer |
| `scryer-prune.sh` | Deletes `dispatched` rows older than 7 days from `signals_queue` |
| `scryer-brief.sh` | Phase 3 — 11-section REVEILLE briefing assembler. Output to `briefings/`. |
| `reveille-inject.sh` | Reads latest `*_claude.md` from `briefings/`, injects into Claude Code session via macOS notification + SessionStart hook. |
| `scryer-tower-feed.sh` | Writes territory state to `SCRYER_FEEDS/kingdom_state.json` every 60s. Patched S186 to preserve unknown keys (token_pulse). |
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[ ⛬ ] L A U N C H D D A E M O N S
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
| Label | Trigger | Script | Purpose |
|-------|---------|--------|---------|
| `com.scryer.watcher` | Every 60s + RunAtLoad | `scryer-run.sh` | Phase 1 poll + dispatch cycle |
| `com.scryer.journal` | 23:00 daily, RunAtLoad=false | `scryer-journal-run.sh` | Phase 2 nightly synthesis |
| `com.scryer.prune` | 03:00 daily, RunAtLoad=false | `scryer-prune.sh` | signals_queue TTL cleanup |
| `com.scryer.brief` | 08:50 daily, RunAtLoad=false | `scryer-brief.sh` | Phase 3 REVEILLE morning briefing |
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
[ 📶 ] S I G N A L S M O N I T O R E D ( P h a s e 1 )
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
| Signal Type | What triggers it | Threshold | Priority |
|-------------|-----------------|-----------|---------|
| `GOLDFISH_HEARTBEAT` | Newest goldfish snapshot file is stale | >25 min old | P3 |
| `DIGEST_FAILURE` | Errors in goldfish.err or goldfish-digest.err (last 50 lines) | >0 ERROR/FAIL matches | P3 |
| `PULSE_GAP` | `pulse.log` mtime is stale | >25 min since last write | P2 |
| `CIRCUIT_BREAKER` | Mission with `consecutive_failures >= 3 AND status='active'` OR `status='paused_circuit_breaker'` | Any match | P1 |
| `LAUNCHD_EXIT` | Any `com.forge.*`, `com.aeris.*`, or `com.scryer.*` with non-zero LastExitStatus | Any non-zero | P2 |
| `DB_LOCK` | `"database is locked"` in last 100 lines of `overmind.stdout.log` | >0 occurrences | P1 |
SCRYER skips itself (`com.scryer.watcher`) in the launchd exit check — LAW 01.
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
[ 🜄 ] D B : s i g n a l s _ q u e u e T A B L E
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
```sql
CREATE TABLE signals_queue (
id TEXT PRIMARY KEY, -- 16-char hex
signal_type TEXT NOT NULL, -- one of 6 signal types above
detected_at TEXT NOT NULL, -- UTC datetime
evidence TEXT, -- raw evidence string
status TEXT DEFAULT 'pending', -- pending→dispatching→dispatched|error
dispatched_at TEXT,
report_path TEXT, -- abs path to BUG report in mailbox buffer
resolved_at TEXT -- reserved, not set automatically
);
```
Status lifecycle: `pending` → `dispatching` → `dispatched`. Stale `dispatching` rows (>10 min) reset to `pending` on dispatch startup.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
[ ⛬ ] D E S I G N L A W S
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
| Law | Rule |
|-----|------|
| LAW 01: NO RECURSION | SCRYER never observes itself. `com.scryer.watcher` excluded from launchd exit check. |
| LAW 02: NO EMERGENCE | Each script compresses, routes, flags — then stops. No feedback loops. |
| LAW 03: CHOREOGRAPHY | Dispatch writes to mailbox buffer and stops. mailbox-trigger picks up independently. |
| LAW 04: SLOW NEVER BLOCKS FAST | Watcher writes queue immediately. Dispatch drains slowly. Phase 2 at 11pm only. |
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[ 🜂 ] C O M M O N C O M M A N D S
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
```bash
# Check daemon status
launchctl list | grep scryer
# Manual Phase 1 run (watcher + dispatch)
bash ~/.forge-scryer/scryer-run.sh
# Query pending signals
sqlite3 ~/Desktop/THE_FORGE/FORGE_CLAUDE/04_⚙_MECHANISMS/db/overmind.db \
"SELECT id, signal_type, detected_at, status FROM signals_queue WHERE status='pending';"
# Recent dispatched signals
sqlite3 ~/Desktop/THE_FORGE/FORGE_CLAUDE/04_⚙_MECHANISMS/db/overmind.db \
"SELECT signal_type, detected_at, status, report_path FROM signals_queue ORDER BY detected_at DESC LIMIT 20;"
# View latest BUG reports in buffer
ls -lt ~/Desktop/THE_FORGE/@FORGE_CLAUDE_MAILBOX/buffer/ | grep BUG_SCRYER | head -10
# Manual Phase 2 — today
bash ~/.forge-scryer/scryer-journal-run.sh
# Read today's synthesis
cat ~/.chronos/journals/$(date +%Y-%m-%d)/synthesis/yesterday-context.md
# Run prune manually
bash ~/.forge-scryer/scryer-prune.sh
```
════════════════════════════════════════════════════════════════════════════════
[ 🝓 ] G O T C H A S
════════════════════════════════════════════════════════════════════════════════
- **Dedup window (30 min):** Watcher won't re-queue a signal type that has a `pending` or recent `dispatching` row within 30 minutes. At most one BUG report per signal type per 30 min.
- **Dispatch lock (atomic mkdir):** `dispatch.lock/` is a directory — `mkdir` is atomic on APFS. Stale locks (no live PID) cleaned on next entry.
- **Synthesizer uses REST API, not CLI:** `scryer-synthesizer.sh` calls Flash via `python3` + `urllib.request`. The `gemini` CLI binary is not in launchd's PATH. `GEMINI_API_KEY` must be in `~/.zshenv` (sourced at script start). Python path in all plists: `/opt/homebrew/bin/python3` (TCC fix S155).
- **23 streams total (S154):** Streams include 021=TOKEN_HOURLY, 022=SEARCH_HISTORY, 023=MCP_CALLS. Search history hook: `~/.claude/hooks/search-log.sh`. Daily files: `search_history_YYYY-MM-DD.log` / `mcp_calls_YYYY-MM-DD.log`.
- **Context cap (Phase 2):** 24,000 chars max, newest-first. Files exceeding cap are omitted with a note.
- **`com.scryer.journal` RunAtLoad=false:** Phase 2 fires at 11pm only. Do not set RunAtLoad=true — would synthesize on cockpit restart, producing empty output if run before journals exist.
- **signals_queue TTL:** `scryer-prune.sh` only prunes `dispatched` rows. `pending` and `error` rows are never pruned. Investigate `error` rows manually.
- **Stale `dispatching` recovery:** Rows stuck >10 min are reset to `pending` on next dispatch run.
- **GOLDFISH_HEARTBEAT threshold is 25 min (not 10).** Goldfish runs every ~15 min; a 10-min threshold fires false positives during normal execution gaps. Threshold was raised to 25 min in Session 97.
- **Drone failure handling:** Empty Flash response → `drone_failed` flag set → filename `BUG_SCRYER_DRONE_FAILED_<SIGNAL>_<TS>.md`, ⚠️ header, P3 escalated to P2. The report is still delivered — it just self-annotates that the diagnosis is missing.
- **[S166] gemma3:4b swap in summarize-stream.py:** Stream summarization swapped from Gemini API to `ollama run gemma3:4b` locally. ~92 API calls/day → $0/day. Quality verified on stream 013.
- **[S166] REVEILLE briefings go to `~/.forge-scryer/briefings/`** as `YYYY-MM-DD_HH_claude.md`. SessionStart hook injects latest file. Wall-clock ~0.3s. Sections 1-11 cover full Kingdom orientation.
- **[S166] SCRYER BUG reports still write to `buffer/` (architectural issue):** `scryer-dispatch.sh` writes to `@FORGE_CLAUDE_MAILBOX/buffer/` but RAVEN watches ROOT, not buffer/. `com.forge.mailbox` plist doesn't exist. SCRYER bug reports currently not reaching RAVEN DB. Needs path fix in `scryer-dispatch.sh` → write to ROOT instead of buffer/.
- **[S205] Daily Synthesis V2 — anthropic SDK, not google-genai:** `daily-synthesis.py` now uses `anthropic` python package (v0.86.0). Model is `claude-opus-4-6`. `ANTHROPIC_API_KEY` must be in `com.scryer.daily-synthesis.plist`. `GEMINI_API_KEY` kept in plist but unused by synthesis. Soul injection via `scripts/synthesis-identity-preamble.md` + most recent ÆRISMORROW journal. Emits `synthesis_signal.json` sidecar alongside the .md output on each run.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
🜚 SYS_SCRYER // THE FORGE // ⛬⚚⛬ THE LAW STANDS.
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀