claim_title payloads wrote unresolvable human-readable titles into
frontmatter related fields. Switched to claim_path with slug extraction
so reciprocal edges in merge.py can resolve targets. Renamed
neighbor_titles→neighbor_slugs throughout for consistency.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract.py was discarding LLM-provided connections — related_claims went into
frontmatter as wiki-links but supports/challenges/depends_on from the
connections field were ignored entirely. This is the primary driver of 50%+
orphan ratio.
Now: connections[] → typed edge fields (supports/challenges/related) in YAML
frontmatter. related_claims fall back to related edges. Post-write
connect_new_claims() adds vector-search edges for claims the LLM missed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three bugs fixed:
1. triage_pr() returns 3 values but line 611 unpacked 2 → ValueError on every
non-deterministic PR (circuit breaker opened, 5 PRs stuck)
2. costs import was inside triage else-block → NameError on deterministic routes
3. pr_cost never written to prs.cost_usd → 0% cost tracking across 1,118 PRs
Cost tracking now covers all 4 exit paths: domain failed, domain rejected,
Leo failed, and normal completion. Uses additive UPDATE (cost_usd + ?) so
re-evals accumulate correctly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- watchdog.py: tier0 auto-recovery (3 retries, 1h cooldown, audit trail) — pending Ganymede review
- stale_pr.py: new module, closes extraction PRs open >30 min with zero claims
- deploy.sh: expanded with new deployment features
- validate.py, extract.py, cascade.py, db.py: minor fixes
- backfill-descriptions.py: utility script
- review_queue.py: minor fix
Note: watchdog + stale_pr not yet deployed to VPS (reverted after missing import crash)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add domain_agent and domain_model to pr-lifecycle API response (data was
queried but dropped before serialization — evaluator column showed blank)
- Show model name tag next to evaluator (Gemini Flash, GPT-4o, etc.)
- Re-attribute 1201 "pipeline (self-directed)" PRs to @m3taversal — these
were Cory-directed, not autonomous overnight research
- Re-attribute 252 NULL PRs to @m3taversal
- Fix extract.py defaults: new PRs without proposed_by default to @m3taversal
- Fix backfill script defaults: extract/ branches → @m3taversal, not
"pipeline (self-directed)"
- Only agent-named branches (rio/, theseus/, etc.) from research-session.sh
remain as "(self-directed)"
Pentagon-Agent: Ship <B8D06D3F-1589-4777-B2E7-B2460D51C81F>
Three fixes for the reweave merge failure cycle:
1. reweave.py: fetch + reset to origin/main before branch creation,
eliminating the stale-base problem that caused ~75% merge failure rate
2. merge.py: delete remote branch when closing reweave PRs (in reconcile,
merge failure, and conflict retry paths) — prevents discover_external_prs
from rediscovering stale branches and creating new PRs every 18 minutes
3. merge.py: skip cherry-pick retry for reweave branches — reweave modifies
existing files so cherry-pick always fails, go straight to close+delete
Pentagon-Agent: Ship <f3064ef4-c330-4809-ad37-39290b2eaa5b>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The regex fallback was writing list entries as ' - "title"' (2-space
indent + quotes) while existing frontmatter uses '- title' (0-space
indent, no quotes). This caused YAML parse failures during merge.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
date_errors was evaluated but never routed to any fixer, leaving PRs
stuck permanently. Now classified as FIXABLE with targeted prompt guidance.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Imports 67 files from VPS (/opt/teleo-eval/) into repo as the single source
of truth. Previously only 8 of 67 files existed in repo — the rest were
deployed directly to VPS via SCP, causing massive drift.
Includes:
- pipeline/lib/: 33 Python modules (daemon core, extraction, evaluation, merge, cascade, cross-domain, costs, attribution, etc.)
- pipeline/: main daemon (teleo-pipeline.py), reweave.py, batch-extract-50.sh
- diagnostics/: 19 files (4-page dashboard, alerting, daily digest, review queue, tier1 metrics)
- agent-state/: bootstrap, lib-state, cascade inbox processor, schema
- systemd/: service unit files for reference
- deploy.sh: rsync-based deploy with --dry-run, syntax checks, dirty-tree gate
- research-session.sh: updated with Step 8.5 digest + cascade inbox processing
No new code written — all files are exact copies from VPS as of 2026-04-06.
From this point forward: edit in repo, commit, then deploy.sh.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 1 — Audit logging infrastructure:
- review_records table (migration v12) capturing every eval verdict with outcome, rejection reason, disagreement type
- Cascade automation: auto-flag dependent beliefs/positions when merged claims change
- Merge frontmatter stamps: last_review metadata on merged claim files
Phase 2 — Cross-domain and state tracking:
- Cross-domain citation index: entity overlap detection across domains on every merge
- Agent-state schema v1: file-backed state for VPS agents (memory, tasks, inbox, metrics)
- Cascade completion tracking: process-cascade-inbox.py logs review outcomes
- research-session.sh: state hooks + cascade processing integration
All changes are live on VPS. This commit brings the code under version control for review.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>