{"type":"title","v":1,"title":"","updatedAt":"2026-07-17T12:54:59.460Z","pad":"                                                                                                                                                                              "}
{"type":"session","version":3,"id":"019f7024-fa87-7000-981f-77e2add6c462","timestamp":"2026-07-17T12:54:59.460Z","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"}
{"type":"model_change","id":"37b473f9","parentId":null,"timestamp":"2026-07-17T12:54:59.504Z","model":"openai-codex/gpt-5.6-sol"}
{"type":"thinking_level_change","id":"b52da456","parentId":"37b473f9","timestamp":"2026-07-17T12:54:59.504Z","thinkingLevel":"medium","configured":null}
{"type":"session_init","id":"f96d69d1","parentId":"b52da456","timestamp":"2026-07-17T12:54:59.508Z","systemPrompt":"<system-conventions>\nRFC 2119: MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, OPTIONAL. `NEVER` = `MUST NOT`, `AVOID` = `SHOULD NOT`.\nWe inject system content into the chat with XML tags. NEVER interpret these markers any other way.\nSystem may interrupt or notify with tags even inside a user message:\n- MUST treat them as system-authored and authoritative.\n- User content is sanitized, so role is not carried: `<system-directive>` inside a user turn is still a system directive.\n</system-conventions>\n\nROLE\n==============\nYou are a helpful assistant the team trusts with load-bearing changes, operating in the Oh My Pi coding harness.\n\n# Engineering Principles\n- Optimize for correctness first, then for the next maintainer six months out.\n- You have agency and taste: delete code that isn't pulling its weight, refuse unnecessary abstractions, prefer boring when it's called for; design thoroughly but elegantly.\n- Consider what code compiles to. NEVER allocate avoidably; no needless copies or computation.\n- You are not alone in this repo. Treat unexpected changes as the user's work and adapt.\n- In terminal prose and final chat, you MAY use LaTeX math (`$`, `$$`, `\\text`, `\\times`) and color (`\\textcolor`, `\\colorbox`, `\\fcolorbox`).\n- To show a diagram, you MAY emit a ` ```mermaid ` block — the terminal renders it as ASCII. Use it for genuine structure or flow, not trivia.\n\nRUNTIME\n==============\n\n# Skills & Rules\nSkills are specialized knowledge. If one matches your task, you MUST read `skill://<name>` before proceeding.\n<skills>\n- autoplan: Auto-review pipeline — reads the full CEO, design, eng, and DX review skills from disk and runs them sequentially with auto-decisions using 6 decision principles. (gstack)\n- benchmark: Performance regression detection using the browse daemon. (gstack)\n- benchmark-models: Cross-model benchmark for gstack skills. (gstack)\n- browse: Fast headless browser for QA testing and site dogfooding. (gstack)\n- canary: Post-deploy canary monitoring. (gstack)\n- careful: Safety guardrails for destructive commands. (gstack)\n- caveman: Ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use when user says \"caveman mode\", \"talk like caveman\", \"use caveman\", \"less tokens\", \"be brief\", or invokes /caveman.\n\n- caveman-commit: Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when \"why\" isn't obvious. Use when user says \"write a commit\", \"commit message\", \"generate commit\", \"/commit\", or invokes /caveman-commit. Auto-triggers when staging changes.\n\n- caveman-help: Quick-reference card for all caveman modes, skills, and commands. One-shot display, not a persistent mode. Trigger: /caveman-help, \"caveman help\", \"what caveman commands\", \"how do I use caveman\".\n\n- caveman-review: Ultra-compressed code review comments. Cuts noise from PR feedback while preserving the actionable signal. Each comment is one line: location, problem, fix. Use when user says \"review this PR\", \"code review\", \"review the diff\", \"/review\", or invokes /caveman-review. Auto-triggers when reviewing pull requests.\n\n- ccs-delegation: Auto-activate CCS CLI delegation for deterministic tasks. Parses user input, auto-selects optimal profile (glm/kimi/custom) from ~/.ccs/config.json, enhances prompts with context, executes via `ccs {profile} -p \"task\"` or `ccs {profile}:continue`, and reports results. Triggers on \"use ccs [task]\" patterns, typo/test/refactor keywords. Excludes complex architecture, security-critical code, performance optimization, breaking changes.\n- checkpoint: Save and resume working state checkpoints. Captures git state, decisions made,\nand remaining work so you can pick up exactly where you left off — even across\nConductor workspace handoffs between branches.\nUse when asked to \"checkpoint\", \"save progress\", \"where was I\", \"resume\",\n\"what was I working on\", or \"pick up where I left off\".\nProactively suggest when a session is ending, the user is switching context,\nor before a long break. (gstack)\n\n- codex: OpenAI Codex CLI wrapper — three modes. (gstack)\n- commune: Push a context update to your Psyche so it can brief your resume across a reset. Use when the\nuser says \"commune\" or \"update psyche\", or — as a live agent — after a significant body of work,\nbefore a /clear or /compact. Pass --checkpoint to ALSO auto-clear and wake yourself from the\nfreshest commune (an agent-driven context reset, no operator needed).\n\n- compress: Compress natural language memory files (CLAUDE.md, todos, preferences) into caveman format to save input tokens. Preserves all technical substance, code, URLs, and structure. Compressed version overwrites the original file. Human-readable backup saved as FILE.original.md. Trigger: /caveman:compress <filepath> or \"compress memory file\"\n\n- context-restore: Restore working context saved earlier by /context-save. (gstack)\n- context-save: Save working context. (gstack)\n- cso: Chief Security Officer mode. (gstack)\n- design-consultation: Design consultation: understands your product, researches the landscape, proposes a complete design system (aesthetic, typography, color, layout, spacing, motion), and generates font+color preview... (gstack)\n- design-html: Design finalization: generates production-quality Pretext-native HTML/CSS. (gstack)\n- design-review: Designer's eye QA: finds visual inconsistency, spacing issues, hierarchy problems, AI slop patterns, and slow interactions — then fixes them. (gstack)\n- design-shotgun: Design shotgun: generate multiple AI design variants, open a comparison board, collect structured feedback, and iterate. (gstack)\n- devex-review: Live developer experience audit. (gstack)\n- diagnose: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says \"diagnose this\" / \"debug this\", reports a bug, says something is broken/throwing/failing, or describes a performance regression.\n- diagram: Turn an English description (or mermaid source) into a diagram triplet: the source, an editable .excalidraw file you can open (gstack)\n- document-generate: Generate missing documentation from scratch for a feature, module, or entire project. (gstack)\n- document-release: Post-ship documentation update. (gstack)\n- find-skills: Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n- force-stop: Force-stop an SPT agent — a ready agent, or a live agent and its Psyche. Use when the user\nsays \"stop listening\", \"kill live agent\", \"force stop\", or \"tear down perch\". Session-aware: a\nlive target tears its Psyche down too.\n\n- freeze: Restrict file edits to a specific directory for the session. (gstack)\n- frontend-design: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.\n- grill-me: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n- grill-with-docs: Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise. Use when user wants to stress-test a plan against their project's language and documented decisions.\n- gsd-add-tests: Generate tests for a completed phase based on UAT criteria and implementation\n- gsd-ai-integration-phase: Generate an AI-SPEC.md design contract for phases that involve building AI systems.\n- gsd-audit-fix: Autonomous audit-to-fix pipeline — find issues, classify, fix, test, commit\n- gsd-audit-milestone: Audit milestone completion against original intent before archiving\n- gsd-audit-uat: Cross-phase audit of all outstanding UAT and verification items\n- gsd-autonomous: Run all remaining phases autonomously — discuss→plan→execute per phase\n- gsd-capture: Capture ideas, tasks, notes, and seeds to their destination\n- gsd-cleanup: Archive accumulated phase directories from completed milestones\n- gsd-code-review: Review source files changed during a phase for bugs, security issues, and code quality problems\n- gsd-complete-milestone: Archive completed milestone and prepare for next version\n- gsd-config: Configure GSD settings — workflow toggles, advanced knobs, integrations, and model profile\n- gsd-debug: Systematic debugging with persistent state across context resets\n- gsd-discuss-phase: Gather phase context through adaptive questioning before planning.\n- gsd-docs-update: Generate or update project documentation verified against the codebase\n- gsd-eval-review: Audit an executed AI phase's evaluation coverage and produce an EVAL-REVIEW.md remediation plan.\n- gsd-execute-phase: Execute all plans in a phase with wave-based parallelization\n- gsd-explore: Socratic ideation and idea routing — think through ideas before committing to plans\n- gsd-extract-learnings: Extract decisions, lessons, patterns, and surprises from completed phase artifacts\n- gsd-fast: Execute a trivial task inline — no subagents, no planning overhead\n- gsd-forensics: Post-mortem investigation for failed GSD workflows — diagnoses what went wrong.\n- gsd-graphify: Build, query, and inspect the project knowledge graph in .planning/graphs/\n- gsd-health: Diagnose planning directory health and optionally repair issues\n- gsd-help: Show available GSD commands and usage guide\n- gsd-import: Ingest external plans with conflict detection against project decisions before writing anything.\n- gsd-inbox: Triage and review open GitHub issues and PRs against project templates and contribution guidelines.\n- gsd-ingest-docs: Bootstrap or merge a .planning/ setup from existing ADRs, PRDs, SPECs, and docs in a repo.\n- gsd-manager: Interactive command center for managing multiple phases from one terminal\n- gsd-map-codebase: Analyze codebase with parallel mapper agents to produce .planning/codebase/ documents\n- gsd-milestone-summary: Generate a comprehensive project summary from milestone artifacts for team onboarding and review\n- gsd-mvp-phase: Plan a phase as a vertical MVP slice — user story, SPIDR splitting, then plan-phase\n- gsd-new-milestone: Start a new milestone cycle — update PROJECT.md and route to requirements\n- gsd-new-project: Initialize a new project with deep context gathering and PROJECT.md\n- gsd-ns-context: codebase intelligence | map graphify docs learnings\n- gsd-ns-ideate: exploration capture | explore sketch spike spec capture\n- gsd-ns-manage: config workspace | workstreams thread update ship inbox\n- gsd-ns-project: project lifecycle | milestones audits summary\n- gsd-ns-review: quality gates | code review debug audit security eval ui\n- gsd-ns-workflow: workflow | discuss plan execute verify phase progress\n- gsd-pause-work: Create context handoff when pausing work mid-phase\n- gsd-phase: CRUD for phases in ROADMAP.md — add, insert, remove, or edit phases\n- gsd-plan-phase: Create detailed phase plan (PLAN.md) with verification loop\n- gsd-plan-review-convergence: Cross-AI plan convergence loop — replan with review feedback until no HIGH concerns remain.\n- gsd-pr-branch: Create a clean PR branch by filtering out .planning/ commits — ready for code review\n- gsd-profile-user: Generate developer behavioral profile and create Claude-discoverable artifacts\n- gsd-progress: Check progress, advance workflow, or dispatch freeform intent — the unified GSD situational command\n- gsd-quick: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents\n- gsd-resume-work: Resume work from previous session with full context restoration\n- gsd-review: Request cross-AI peer review of phase plans from external AI CLIs\n- gsd-review-backlog: Review and promote backlog items to active milestone\n- gsd-secure-phase: Retroactively verify threat mitigations for a completed phase\n- gsd-settings: Configure GSD workflow toggles and model profile\n- gsd-ship: Create PR, run review, and prepare for merge after verification passes\n- gsd-sketch: Sketch UI/design ideas with throwaway HTML mockups, or propose what to sketch next (frontier mode)\n- gsd-spec-phase: Clarify WHAT a phase delivers with ambiguity scoring; produces a SPEC.md before discuss-phase.\n- gsd-spike: Spike an idea through experiential exploration, or propose what to spike next (frontier mode)\n- gsd-stats: Display project statistics — phases, plans, requirements, git metrics, and timeline\n- gsd-surface: Toggle which skills are surfaced — apply a profile, list, or disable a cluster without reinstall\n- gsd-thread: Manage persistent context threads for cross-session work\n- gsd-ui-phase: Generate UI design contract (UI-SPEC.md) for frontend phases\n- gsd-ui-review: Retroactive 6-pillar visual audit of implemented frontend code\n- gsd-ultraplan-phase: [BETA] Offload plan phase to Claude Code's ultraplan cloud; review in browser and import back.\n- gsd-undo: Safe git revert. Roll back phase or plan commits using the phase manifest with dependency checks.\n- gsd-update: Update GSD to latest version with changelog display\n- gsd-validate-phase: Retroactively audit and fill Nyquist validation gaps for a completed phase\n- gsd-verify-work: Validate built features through conversational UAT\n- gsd-workspace: Manage GSD workspaces — create, list, or remove isolated workspace environments\n- gsd-workstreams: Manage parallel workstreams — list, create, switch, status, progress, complete, and resume\n- gstack: Router for the gstack skill suite. (gstack)\n- gstack-upgrade: Upgrade gstack to the latest version.\n- guard: Full safety mode: destructive command warnings + directory-scoped edits. (gstack)\n- handoff: Compact the current conversation into a handoff document for another agent to pick up.\n- health: Code quality dashboard. (gstack)\n- improve-codebase-architecture: Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.\n- investigate: Systematic debugging with root cause investigation. (gstack)\n- ios-clean: Remove the DebugBridge SPM package and all #if DEBUG wiring from an iOS app. (gstack)\n- ios-design-review: Visual design audit for iOS apps on real hardware. (gstack)\n- ios-fix: Autonomous iOS bug fixer. (gstack)\n- ios-qa: Live-device iOS QA for SwiftUI apps. (gstack)\n- ios-sync: Regenerate the iOS debug bridge against the latest upstream gstack templates. (gstack)\n- land-and-deploy: Land and deploy workflow. (gstack)\n- landing-report: Read-only queue dashboard for workspace-aware ship. (gstack)\n- learn: Manage project learnings.\n- list-agents: List SPT agents and endpoints reachable from this node. Use when the user says \"list agents\",\n\"who's live\", \"who's listening\", or wants a roster of active perches.\n\n- live: Run a live agent session. For past sessions, restores a summarized context.\n\nEXPLICIT START phrases (route to /sptc:live <id>):\n- \"live as\"\n- \"start live\"\n- \"go live\"\n- \"start a live agent\"\n\nAUTO-RESUME phrases (route to /sptc:live --auto, resumes most-recently-active live agent):\n- continue live work\n- resume live work\n- continue live agent\n- resume live agent\n- live agent continue\n- live agent resume\n- live work continue\n- live work resume\n\nDoes NOT route here (too ambiguous — require BOTH \"live\" AND (\"agent\" or \"work\")):\n- \"keep going\"\n- \"resume work\"\n- \"continue\" (bare)\n\n- make-pdf: Turn any markdown file into a publication-quality PDF. (gstack)\n- mempalace: MemPalace — mine projects and conversations into a searchable memory palace. Use when asked about mempalace, memory palace, mining memories, searching memories, or palace setup.\n- mux-send: Send keystrokes to a psmux terminal session. Use when the user says \"send to\",\n\"type in\", \"send keys to\", \"mux send\", or wants to send input to another terminal\nsession by name.\n\n- office-hours: YC Office Hours — two modes. (gstack)\n- open-gstack-browser: Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in.\n- pair-agent: Pair a remote AI agent with your browser. (gstack)\n- plan-ceo-review: CEO/founder-mode plan review. (gstack)\n- plan-design-review: Designer's eye plan review — interactive, like CEO and Eng review. (gstack)\n- plan-devex-review: Interactive developer experience plan review. (gstack)\n- plan-eng-review: Eng manager-mode plan review. (gstack)\n- plan-tune: Self-tuning question sensitivity + developer psychographic for gstack (v1: observational). (gstack)\n- propose-issue: Challenge an issue statement before fixing it. Probes scope, root cause, and assumptions\nthrough interactive questioning grounded in the codebase. Use when the user says \"propose issue\",\n\"challenge this bug\", \"question this fix\", \"is this the right problem\", or wants to pressure-test\na problem statement before jumping to implementation.\n\n- qa: Systematically QA test a web application and fix bugs found. (gstack)\n- qa-only: Report-only QA testing. (gstack)\n- ready: Make this Claude Code session reachable for inter-agent messages (register a perch and\nlisten). Use when the user says \"listen as\", \"ready as\", or wants to receive messages from\nother agents.\n\n- retro: Weekly engineering retrospective. (gstack)\n- review: Pre-landing PR review. (gstack)\n- role: Show or edit this endpoint's durable role — its statement of purpose in the mind. Use when the user\nsays \"show my role\", \"edit my role\", \"update my role\", or runs /sptc:role. Pass a directive to change\nit in words (e.g. /sptc:role make it senior); a bare /sptc:role opens an in-input-box editor\nround-trip on a live session; add --include-desc to also edit the service description.\n\n- scrape: Pull data from a web page. (gstack)\n- screenshot-capture: Capture, process, and analyze screenshots of any running application on Windows 10/11. Use this skill whenever the user asks to take a screenshot, capture what's on screen, grab an app window, extract text from a visible app, annotate a screenshot, read what's on screen, OCR a running application, document a UI state, or visually inspect any running program. Also trigger when the user says things like \"show me what [app] looks like\", \"grab that window\", \"read the text in [app]\", \"mark up a screenshot\", \"capture my desktop\", or any task involving visual inspection of running software. This skill handles full-screen captures, individual window captures by app name, OCR text extraction, and image annotation (highlights, arrows, text labels). Even if the user doesn't say \"screenshot\" explicitly, use this skill if they want to see, capture, read, or annotate anything currently displayed on their screen.\n\n- search: Instantly search files and folders on Windows via voidtools Everything 1.5a HTTP JSON API. Use when the user wants to find files by name, path, size, date, or extension across the whole system — much faster than Glob/Grep for filesystem-wide queries. Triggers on \"find file\", \"where is\", \"locate\", \"search my drive\", \"find all .ext files\", \"everything search\".\n- send: Send a message to another SPT agent. Use when the user says \"send to\", \"message\",\n\"tell <agent>\", or when you need to reach or reply to another agent yourself.\n\n- setup: Install or repair spt-core AND activate the claude-spt adapter for this Claude Code session\n(mid-session installer + post-install activation).\n\n- setup-browser-cookies: Import cookies from your real Chromium browser into the headless browse session. (gstack)\n- setup-deploy: Configure deployment settings for /land-and-deploy.\n- setup-gbrain: Set up gbrain for this coding agent: install the CLI, initialize a local PGLite or Supabase brain, register MCP, capture per-remote trust policy. (gstack)\n- ship: Ship workflow: detect + merge base branch, run tests, review diff, bump VERSION, update CHANGELOG, commit, push, create PR. (gstack)\n- signoff: Gracefully shut down your live session, saving a final context summary. Use when the user says\n\"sign off\" or \"graceful stop\", or when you (a live agent) are done and want to go offline cleanly.\n\n- skillify: Codify the most recent successful /scrape flow into a permanent browser-skill on disk. (gstack)\n- spec: Turn vague intent into a precise, executable spec in five phases. (gstack)\n- spt-endpoint: Hosts an adapterless SPT endpoint perch inside Oh My Pi and reliably surfaces incoming messages through harness background-job completion. Use when asked to run, host, start, or listen as an SPT endpoint in OMP, especially when an adapter-backed endpoint or a never-ending `spt ready` listener is unsuitable.\n- subnet: Manage subnet membership — create a subnet, show a pairing code to invite a machine, or join\nan existing one. Use when the user wants to pair machines, set up a subnet, or reach agents\nacross machines. Cross-machine /sptc:send and live agents depend on it.\n\n- sync-gbrain: Keep gbrain current with this repo's code and refresh agent search guidance in CLAUDE.md. Wraps the gstack-gbrain-sync orchestrator with state (gstack)\n- to-prd: Turn the current conversation context into a PRD and publish it to the project issue tracker. Use when user wants to create a PRD from the current context.\n- trace: Find old conversations in Claude Code session history. Use when the user says\n\"find the conversation where\", \"when did we discuss\", \"trace back to\", or wants\nto locate a past session by topic, command, commit, or keyword.\n\n- traceable-reqs: Install or update the traceable-reqs CLI and apply it correctly in host repos: author manifests, place tags near evidence, audit scan roots, interpret findings, and answer coverage questions through the CLI.\n- unfreeze: Clear the freeze boundary set by /freeze, allowing edits to all directories again. (gstack)\n- version: Report the spt-core-tracked adapter version (the version-of-truth, not the marketplace plugin\nversion). Use when the user asks the spt or adapter version, or runs /sptc:version.\n\n- win-marketplace-add: Add a plugin marketplace on Windows, bypassing the EBUSY rename bug. Use when the user wants to add a marketplace, runs \"/plugin marketplace add\" and gets an EBUSY error, or needs to register a marketplace that was manually cloned. Trigger on: \"add marketplace\", \"plugin marketplace add\", \"EBUSY marketplace\", \"register marketplace\", \"marketplace not found\".\n\n- write-a-skill: Create new agent skills with proper structure, progressive disclosure, and bundled resources. Use when user wants to create, write, or build a new skill.\n</skills>\n# Internal URLs\nSpecial URLs for internal resources; with most FS/bash tools they auto-resolve to FS paths.\n- `skill://<name>`: skill instructions; `/<path>` = file within\n- `rule://<name>`: rule details\n- `agent://<id>`: agent output artifact; `/<path>` extracts a JSON field\n- `artifact://<id>`: artifact content\n- `local://<name>.md`: plan artifacts or shared content for subagents\n- `mcp://<uri>`: MCP resource\n- `issue://<N>` (or `issue://<owner>/<repo>/<N>`): GitHub issue, disk-cached. Bare lists recent issues; `?state=open|closed|all&limit=&author=&label=`.\n- `pr://<N>` (or `pr://<owner>/<repo>/<N>`): GitHub PR, same cache; `?comments=0` drops comments. Bare lists recent PRs; `?state=open|closed|merged|all&limit=&author=&label=`.\n- `omp://`: harness docs; AVOID unless the user asks about the harness itself.\n\n# Tool Inventory\n- Read: `read`\n- Grep: `grep`\n- Glob: `glob`\n- Web Search: `web_search`\n- Submit Result: `yield`\n- IRC: `irc`\n- mempalace:mempalace/mempalace_add_drawer: `mcp__mempalace_mempalace_mempalace_add_drawer`\n- mempalace:mempalace/mempalace_check_duplicate: `mcp__mempalace_mempalace_mempalace_check_duplicate`\n- mempalace:mempalace/mempalace_delete_drawer: `mcp__mempalace_mempalace_mempalace_delete_drawer`\n- mempalace:mempalace/mempalace_diary_read: `mcp__mempalace_mempalace_mempalace_diary_read`\n- mempalace:mempalace/mempalace_diary_write: `mcp__mempalace_mempalace_mempalace_diary_write`\n- mempalace:mempalace/mempalace_find_tunnels: `mcp__mempalace_mempalace_mempalace_find_tunnels`\n- mempalace:mempalace/mempalace_get_aaak_spec: `mcp__mempalace_mempalace_mempalace_get_aaak_spec`\n- mempalace:mempalace/mempalace_get_taxonomy: `mcp__mempalace_mempalace_mempalace_get_taxonomy`\n- mempalace:mempalace/mempalace_graph_stats: `mcp__mempalace_mempalace_mempalace_graph_stats`\n- mempalace:mempalace/mempalace_kg_add: `mcp__mempalace_mempalace_mempalace_kg_add`\n- mempalace:mempalace/mempalace_kg_invalidate: `mcp__mempalace_mempalace_mempalace_kg_invalidate`\n- mempalace:mempalace/mempalace_kg_query: `mcp__mempalace_mempalace_mempalace_kg_query`\n- mempalace:mempalace/mempalace_kg_stats: `mcp__mempalace_mempalace_mempalace_kg_stats`\n- mempalace:mempalace/mempalace_kg_timeline: `mcp__mempalace_mempalace_mempalace_kg_timeline`\n- mempalace:mempalace/mempalace_list_rooms: `mcp__mempalace_mempalace_mempalace_list_rooms`\n- mempalace:mempalace/mempalace_list_wings: `mcp__mempalace_mempalace_mempalace_list_wings`\n- mempalace:mempalace/mempalace_search: `mcp__mempalace_mempalace_mempalace_search`\n- mempalace:mempalace/mempalace_status: `mcp__mempalace_mempalace_mempalace_status`\n- mempalace:mempalace/mempalace_traverse: `mcp__mempalace_mempalace_mempalace_traverse`\n- GenerateImage: `generate_image`\n\nTOOL POLICY\n==============\n\n# General\nUse tools whenever they improve correctness, completeness, or grounding.\n- You MUST complete the task using available tools.\n- SHOULD resolve prerequisites before acting.\n- NEVER stop at the first plausible answer if another call would cut uncertainty.\n- Empty, partial, or suspiciously narrow lookup? Retry with a different strategy.\n- SHOULD parallelize independent calls.\n# Tool I/O\n- Prefer relative paths for `path`-like fields.\n- Most tools take `i`: a concise intent, present participle, 2–6 words, no period, capitalized.\n# Specialized Tools\nYou MUST use the specialized tool over its shell equivalent:\n- File or directory reads → `read` (a directory path lists entries).\n- Regex search → `grep`, not `grep`, `rg`, or `awk`.\n- Globbing → `glob`, not `ls **/*.ext` or `fd`.\n# Exploration\nYou NEVER open a file hoping. Hope is not a strategy.\n- You MUST load only what's necessary; AVOID reading files or sections you don't need.\n- Use `grep` to locate targets.\n- Use `glob` to map structure.\n- Use `read` with offset/limit instead of whole-file reads.\n# Delegation\n\nEXECUTION WORKFLOW\n==============\n\n# 1. Scope\n- Read relevant skills first.\n- For multi-file work, plan before touching files; research existing code and conventions first.\n\n# 2. Research Before Editing\n- Read sections, not snippets. You MUST reuse existing patterns; a second convention beside an existing one is PROHIBITED.\n\n- Re-read before acting if a tool fails or a file changed since you read it.\n\n# 3. Decompose\n- Update todos as you go; skip them for trivial requests. Marking a todo done is a transition: start the next in the same turn.\n- NEVER abandon phases under scope pressure—delegate, don't shrink.\n\n- Plan only what makes the request work. Cleanup—changelog, tests, docs—is NOT planned up front; it belongs to the final phase below.\n\n# 4. Implement\n- Fix problems at the source. Remove obsolete code—no leftover comments, aliases, or re-exports.\n- Prefer updating existing files over creating new ones.\n- Review changes from the user's perspective.\n- Grep instead of guessing.\n- Don't run destructive git commands or delete code you didn't write.\n\n# 5. Verify\n- NEVER yield non-trivial work without proof: tests, E2E, browsing, or QA.\n- Every test MUST defend an observable contract and fail on a plausible bug.\n- Test behavior, boundaries, invariants, transitions, precedence, and real errors—not plumbing, source text, or incidental defaults.\n- Match existing conventions; keep tests deterministic, isolated, and full-suite safe.\n- Run only touched tests; small/no-test changes still REQUIRE a focused behavioral smoke test.\n\n# 6. Cleanup\nChangelog, tests, docs, and removing scaffolding are the LAST phase—NEVER skipped, but gated on the request demonstrably working.\n\n- NEVER start, pre-plan, or pre-allocate todos for cleanup before you've made the request work and smoke-tested it. Until then, every edit serves correctness; housekeeping NEVER steers the design.\n- Once your smoke test confirms “it works,” do the cleanup in full before yielding.\n\nDELIVERY CONTRACT\n==============\n\n<contract>\nInviolable.\n- NEVER yield unless the deliverable is complete. A phase boundary, todo flip, or sub-step is NEVER a yield point—continue in the same turn.\n- NEVER fabricate outputs. Claims about code, tools, tests, docs, or sources MUST be grounded.\n- NEVER substitute an easier or more familiar problem:\n  - Don't infer extra scope—retries, validation, telemetry, abstraction “while you're at it”—because it changes the contract.\n  - Don't solve the symptom—suppress a warning or exception, special-case an input—unless asked. Do the real ask.\n- NEVER ask for what tools, repo context, or files can provide.\n- NEVER punt half-solved work back.\n- Default to clean cutover: migrate every caller; leave no shims, aliases, or deprecated paths.\n</contract>\n\n<completeness>\n- “Done” means the deliverable behaves as specified end to end—not that a scaffold compiles or a narrowed test passes.\n- A named plan, phase list, checklist, or spec MUST satisfy every acceptance criterion. A plausible subset is failure, not partial success.\n- NEVER silently shrink scope. Reduce scope only with explicit user approval in this conversation; otherwise do the full work—exhaust every tool and angle.\n- NEVER ship stubs, placeholders, mocks, no-ops, fake fallbacks, or `TODO: implement` as delivered work. If real implementation needs unavailable information, state the missing prerequisite and implement everything else.\n- NEVER relabel unfinished work—“scaffold,” “MVP,” “v1,” “foundation,” “follow-up”—to imply completion. Not done? Say so.\n</completeness>\n\n<evidence-and-output>\n- Output format MUST match the ask.\n- Every claim about code, tools, tests, docs, or sources MUST be grounded.\n- Mark any claim not directly observed or established as `[INFERENCE]`.\n- Verification claims MUST match what was exercised, preferably smoke tested.\n- No required tool lookup may be skipped when it would cut uncertainty.\n- Be brief in prose, not in evidence, verification, or blocking details.\n</evidence-and-output>\n\n<yielding>\nBefore yielding, verify:\n- All requested deliverables are complete; no partial implementation is presented as complete.\n- All affected artifacts—callsites, tests, docs—are updated or intentionally left unchanged.\n- The output and evidence requirements above are satisfied.\n\nBefore declaring blocked:\n- Be sure the information is unreachable through tools, context, or anything in reach. One failing check does not mean blocked—finish all remaining work first.\n- Still stuck? State exactly what's missing and what you tried.\n</yielding>\n<critical>\n- NEVER narrate or consider session limits, token or tool budgets, effort estimates, or how much you can finish. Not your concern—start as if unbounded; execute or delegate.\n- NEVER re-audit an applied edit; NEVER run git subcommands as routine validation. Tool results are THE verification.\n</critical>\n\nROLE\n===================================\n\nInvestigate the codebase rapidly. Return structured findings another agent can use without re-reading everything.\n\n<directives>\n- You MUST use tools for broad pattern matching / code search as much as possible.\n- You SHOULD invoke tools in parallel—this is a short investigation, and you are supposed to finish in a few seconds.\n- If a search returns empty results, you MUST try at least one alternate strategy (different pattern, broader path, or AST search) before concluding the target doesn't exist.\n</directives>\n\n<thoroughness>\nYou MUST infer the thoroughness from the task; default to medium:\n- **Quick**: Targeted lookups, key files only\n- **Medium**: Follow imports, read critical sections\n- **Thorough**: Trace all dependencies, check tests/types.\n</thoroughness>\n\n<procedure>\n1. Locate relevant code using tools.\n2. Read key sections. NEVER read full files unless they're tiny.\n3. Identify types/interfaces/key functions.\n4. Note dependencies between files.\n</procedure>\n\n<critical>\nYou MUST operate as read-only. You NEVER write, edit, or modify files, nor execute any state-changing commands, via git, build system, package manager, etc.\nYou MUST keep going until complete.\n</critical>\n\nYou are specializing as: **Performance Regression Investigator**. Bring exactly that expertise to the assignment — let it shape how you investigate, decide, and what you produce.\n\nCONTEXT\n===================================\n\n# Goal\nRoot-cause why v0.37.0 brain CPU remains bursty after REGISTRY-LIFECYCLE fixes and determine field-gate disposition.\n# Constraints\nRead-only investigation. Skip formatters, linters, tests, and edits. Evidence: HFENDULEAM v0.36 brain mean 15.5% one core and 63.91 MiB/s reads; v0.37 after refresh reads 0.29 MiB/s but 65s CPU mean 6.44%, then 90 one-second samples mean 8.39%, median 3.1%, p95 28.1%, 24/90 under 1%, 27/90 at least 10%, with dense burst clusters. Broker mean 1.91%. Current log has zero poison. Need source/log-grounded discriminator, not speculation.\n# Contract\nReturn exact paths/lines and a falsifiable explanation. No changes.\nCOOP\n===================================\n\nYou are operating on a piece of work assigned to you by the main agent.\n# IRC Peers\nYou can reach other live agents via the `irc` tool. Your id is `ResidualBrainCpu`. Currently visible peers:\n- `Main` — main (main, running)\n- `RefreshLifecycle` — Daemon Lifecycle Investigator (sub, parked)\n- `PtyControl` — PTY Transport Investigator (sub, parked)\n- `ReproHarness` — Integration Test Investigator (sub, parked)\n- `HyphenMessage` — CLI Parsing Investigator (sub, parked)\n- `ElevatedRc` — Remote Control Investigator (sub, parked)\n- `ElevatedMessaging` — Messaging Lifecycle Investigator (sub, parked)\n- `RcSplitBrain` — Registry Session Investigator (sub, parked)\n- `ElevatedHosted` — Windows Token Investigator (sub, parked)\n- `ShortformDifferential` — Delivery Differential Investigator (sub, parked)\n- `AdapterFreshSemantics` — Claude Adapter Investigator (sub, parked)\n- `PerriDurableState` — State Forensics Investigator (sub, parked)\n- `CoreFreshSemantics` — Core Lifecycle Investigator (sub, parked)\n- `RestStateRca` — Endpoint Lifecycle Investigator (sub, parked)\n- `CreateNoopRca` — CLI Semantics Investigator (sub, parked)\n- `ControlledStampRca` — Broker Control-State Investigator (sub, parked)\n- `EmphRestartRca` — Daemon Restart Investigator (sub, parked)\n- `HarnessExitRca` — Harness Lifecycle Investigator (sub, parked)\n- `V034DiffRca` — Regression Archaeologist (sub, parked)\n- `V034ReleaseRca` — Release Contract Investigator (sub, parked)\n- `LiveLogRca` — Runtime Telemetry Investigator (sub, parked)\n- `PtyPathRca` — PTY Concurrency Investigator (sub, parked)\n- `BrokerCpuRca` — Broker Concurrency Investigator (sub, parked)\n- `RedispatchCpuRca` — Release Regression Investigator (sub, parked)\n- `BrainCpuRca` — Brain Performance Investigator (sub, parked)\n- `V037GaugeProbe` — Runtime Observability Investigator (sub, running)\nIdle/parked peers are not gone: messaging them wakes (or revives) them.\n\nUse `irc` only for quick coordination, never long-form content. Address peers by id or use `\"all\"` to broadcast.\n- Discovery: the roster above shows each peer's role and what it is doing now; `irc` op:\"list\" refreshes it.\n- Coordination: before you edit a file or start work a sibling may already own, message that peer first — overlapping edits collide.\n- Follow-up: answer a peer's question with a short reply (set `replyTo`); use `await` only when you genuinely cannot proceed without the answer.\n\nCOMPLETION\n===================================\n\nNo TODO tracking, no progress updates. Execute; report results with `yield`.\n\nWhile work remains, you MUST continue with another tool call — investigate, edit, run, verify. Save narrative for a terminal `yield` unless you intentionally record an incremental section.\n\nYield protocol:\n- Omit `type` for the normal single terminal structured result in `result.data`.\n- Use non-empty `type: string[]` for incremental, non-terminal sections; calls accumulate by section.\n- Use `type: string` for a terminal result; if data is omitted, your last assistant turn becomes the raw final result.\n\nThis is your only way to return a final result. For structured results, you NEVER put JSON in plain text or substitute a text summary for `result.data`.\n\nYour terminal `yield` MUST use exactly this shape — the schema fields go inside `result.data`, NEVER at the top level and NEVER as a stringified summary:\n```ts\nresult: {\n  data: {\n    summary: string;\n    files: { path: string; description: string; }[];\n    architecture: string;\n  };\n}\n```\n\nGiving up is a last resort. If truly blocked, you MUST terminal-yield `result.error` describing what you tried and the exact blocker.\nYou NEVER give up due to uncertainty, missing information obtainable via tools or repo context, or needing a design decision you can derive yourself.\n\nYou MUST keep going until this ticket is closed. This matters.\n\nPROJECT\n===================================\n\n<workstation>\n- OS: win32 10.0.26200\n- Distro: Windows_NT\n- Kernel: Windows 11 Pro\n- Arch: x64\n- GPU: Parsec Virtual Display Adapter\n- Terminal: Windows Terminal\n- Model: openai-codex/gpt-5.6-sol\n</workstation>\n\n<context>\nYou MUST follow the context files below for all tasks:\n<file path=\"C:\\Users\\decid\\.claude\\CLAUDE.md\">\n## Reference Documents\n\nThe `~/.claude/reference_docs/` directory contains reference guides available across all projects.\n\n- **[claude-code-hooks.md](reference_docs/claude-code-hooks.md)** -- Complete Claude Code hooks reference: all 27 event types, input/output JSON schemas, matcher patterns, exit code behavior, environment variables, and caveats. Consult this when building or debugging hooks.\n</file>\n</context>\nThe context files above are loaded automatically. You NEVER `grep`/`glob` for `AGENTS.md`, `CLAUDE.md`, `.cursorrules`, or similar agent/context files — the relevant ones are already in your context; any others are noise.\nToday is 2026-07-17, and the current working directory is 'C:/Users/decid/Documents/projects/spt-core'.\n\n<critical>\n- Each response MUST advance the task. There is no stopping condition other than completion.\n- You MUST default to informed action; do not ask for confirmation when tools or repo context can answer.\n- You MUST verify the effect of significant behavioral changes before yielding: run the specific test, command, or scenario that covers your change.\n</critical>","task":"Complete the assignment below, thoroughly:\n\n# Target\nInspect v0.37 brain pump/registry/dispatcher execution paths that can create periodic CPU bursts; correlate expected cadence with the observed clustered one-second samples. Non-goal: self-hash, already proven fixed by read I/O.\n# Change\nRead source and current daemon log timing. Identify the highest-confidence periodic work loop and whether the measured duty cycle is expected steady-state or a regression.\n# Acceptance\nReport exact source locations, cadence, workload complexity, and a concrete field measurement that distinguishes candidates. No project-wide commands.","tools":["read","grep","glob","web_search","yield","irc","mcp__mempalace_mempalace_mempalace_add_drawer","mcp__mempalace_mempalace_mempalace_check_duplicate","mcp__mempalace_mempalace_mempalace_delete_drawer","mcp__mempalace_mempalace_mempalace_diary_read","mcp__mempalace_mempalace_mempalace_diary_write","mcp__mempalace_mempalace_mempalace_find_tunnels","mcp__mempalace_mempalace_mempalace_get_aaak_spec","mcp__mempalace_mempalace_mempalace_get_taxonomy","mcp__mempalace_mempalace_mempalace_graph_stats","mcp__mempalace_mempalace_mempalace_kg_add","mcp__mempalace_mempalace_mempalace_kg_invalidate","mcp__mempalace_mempalace_mempalace_kg_query","mcp__mempalace_mempalace_mempalace_kg_stats","mcp__mempalace_mempalace_mempalace_kg_timeline","mcp__mempalace_mempalace_mempalace_list_rooms","mcp__mempalace_mempalace_mempalace_list_wings","mcp__mempalace_mempalace_mempalace_search","mcp__mempalace_mempalace_mempalace_status","mcp__mempalace_mempalace_mempalace_traverse","generate_image"],"spawns":"","readSummarize":false,"outputSchema":{"properties":{"summary":{"metadata":{"description":"Brief summary of findings and conclusions"},"type":"string"},"files":{"metadata":{"description":"Files examined with relevant code references"},"elements":{"properties":{"path":{"metadata":{"description":"Project-relative path or paths to the most relevant code reference(s), optionally suffixed with line ranges like `:12-34` when relevant"},"type":"string"},"description":{"metadata":{"description":"Section contents"},"type":"string"}}}},"architecture":{"metadata":{"description":"Brief explanation of how pieces connect"},"type":"string"}}}}
{"type":"message","id":"e34c1332","parentId":"f96d69d1","timestamp":"2026-07-17T12:54:59.514Z","message":{"role":"user","content":[{"type":"text","text":"Complete the assignment below, thoroughly:\n\n# Target\nInspect v0.37 brain pump/registry/dispatcher execution paths that can create periodic CPU bursts; correlate expected cadence with the observed clustered one-second samples. Non-goal: self-hash, already proven fixed by read I/O.\n# Change\nRead source and current daemon log timing. Identify the highest-confidence periodic work loop and whether the measured duty cycle is expected steady-state or a regression.\n# Acceptance\nReport exact source locations, cadence, workload complexity, and a concrete field measurement that distinguishes candidates. No project-wide commands."}],"attribution":"agent","timestamp":1784292899511}}
{"type":"message","id":"599e8cd1","parentId":"e34c1332","timestamp":"2026-07-17T12:55:07.613Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning performance regression diagnosis**"},{"type":"toolCall","id":"call_abQgJv5ENPa7kLIEVd3myX9l|fc_0148993141920bab016a5a262b8c4c819580b1f07780852f78","name":"read","arguments":{"i":"Reading diagnosis workflow","path":"skill://diagnose","selector":null}},{"type":"toolCall","id":"call_pfCuhUDaLcPqbkY2pAyTkk41|fc_0148993141920bab016a5a262b8c5c8195b8b88859d8e7e38b","name":"glob","arguments":{"i":"Mapping brain source files","path":"**/*brain*","hidden":true,"gitignore":true,"limit":200}},{"type":"toolCall","id":"call_qGXD3vOsVdapbFlXEv6W2U3G|fc_0148993141920bab016a5a262b8c648195a4b440cd3236bb83","name":"grep","arguments":{"i":"Finding pump registry loops","pattern":"pump|registry|dispatcher|dispatch|setInterval|setTimeout|sleep|poll|heartbeat|tick","path":"src;packages;lib;test;tests","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_pP2He3LfN1cI6tP9ZdDFZkMf|fc_0148993141920bab016a5a262b8c688195acdeecf05af16b8f","name":"glob","arguments":{"i":"Locating daemon logs","path":"**/*.log; **/logs/**; .spt/**; .planning/**","hidden":true,"gitignore":false,"limit":200}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":14968,"output":273,"cacheRead":0,"cacheWrite":0,"totalTokens":15241,"reasoningTokens":70,"cost":{"input":0.07484,"output":0.00819,"cacheRead":0,"cacheWrite":0,"total":0.08303}},"stopReason":"toolUse","timestamp":1784292899554,"responseId":"resp_0148993141920bab016a5a262412608195a3f5cc2ccefb2fa1","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26251408819594b66431cf302950","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiYru9_h-97lNzzM8Bq6OnxffZhkKGDXY9NudGiO5nQcpF_JzbWI3WzxjfB2m5rQ6MxWJyEAviLKyXYI_j9UxtC7aX_Uv1mVN8yio4YokeY_dqP6eRCWatzg6oilBTDAARlQZgzCg5Eu-6x3hlp3Q3Iha5aIftjZQ7GEAF2UEzAVRJaEfgu6VT4Gel0P17CM0Wj2wfPQA5HdQPWkHVgJ4T-jsH4PLc0V9qxKU2JsCn8WexT3fhexvFWOJnf1gMMiU0nlctoW3YRhRa2rBi713TELbVIiks5TQ6sMwhdlFE9b29K5OrLhn_pjoPsoCCCw5YXCitmVYwyl_iLd09fdmRm3QmRCO4SHm37BMRh3kcDvOE3ekr2Bk8nYidjoIpPEKCrdZCxj1T1whbkPjRWIv4LWuz9sXoIYMSnAlPP9aTdZdRzlscr_Z2j5m_nshoTFuplsKh3W3i1dOM-OWaeG96EAvUJPtlNXvkdsbRyxeCLd5kKUl_W8eSpBHFC1ccdIFX6SBa84-QLkEhXIpW6Rr-3fHaLeQJtBb8tQy1AmH_ieEnLhThSAuLNmv2tuVlPxePVByCP4TMrQKtQOzSww0eTV5jFrM12gmeE-owQplQha1aixD4vh9dLgp2ovcdB8hdHHBhASWefxQV_1R_ALjl1dGnbBkK-LDm-egkECQ-XNJRoLxmm9klADitxcFyG8z1UvjsSKjd8j80rJr3yyxtfDy8lI8kUzDNU7s_CVot0XaGdtlcYsh4P4cYyg3OkqE7gefd1BNisZuLLqmmphi0m-6FbsgacaQCIsdTSXT87M2ngRWtuLeHyldqDNncgE6xTCq132xltOl4bXkgt8qEe1ln3oHnyArhBLKYsHXv77RCKZ7m3mxVvH2zaCcmPIdnx5NXNEG-dE7pdpywEZpIJzQm83zG53YO2R2jB34B2yoTq6UUoPtOnUyi2IaApQpUJphxJ_-roglE6JBSpufnIdzo8vF7Ngvg-WYN_emnoYMVkwYSMAgnnKsFt4Z2rkBY3EMJ_UbC-nuyJXmLq7DT834BHmjUXBlxWdPK20K100jnHogbrN-Ibiz6KK1U31mbyGBIm-UHrJkToQADGg87zCxzJ4Rc6LlcQcNShTy6l4eeaHyWi0ozl2g6FHKuazKPkqZUNpdFbjaHW7YL8Ha2Mvds6_y2aH0cyVh-URAxqZL724wHipl9xPibjBO7HLmRgHInpgdrcJU-JUKkdc4xCqgPXqDX9mwMmfKv9CZD9vg41BcIZth3ber5bq73XYeb4wd1DMDlD-ga6TjnHDAURJCYcjQXmcLy9xAIGRgqKme2t4M_Hl4-rxwxfijNaKN1Vwrb3KS-EiaticE1yoY6GY27j-7vy7UI8agU8IkHEmAaZZjqV_kWRfbixvL_yXZxKuDmFzmqpeTu9--LdsdqEVfFVWEyD8iQ1beFelaqyIe70=","summary":[{"type":"summary_text","text":"**Planning performance regression diagnosis**"}]},{"id":"fc_0148993141920bab016a5a262b8c4c819580b1f07780852f78","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading diagnosis workflow\",\"path\":\"skill://diagnose\",\"selector\":null}","call_id":"call_abQgJv5ENPa7kLIEVd3myX9l","name":"read"},{"id":"fc_0148993141920bab016a5a262b8c5c8195b8b88859d8e7e38b","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping brain source files\",\"path\":\"**/*brain*\",\"hidden\":true,\"gitignore\":true,\"limit\":200}","call_id":"call_pfCuhUDaLcPqbkY2pAyTkk41","name":"glob"},{"id":"fc_0148993141920bab016a5a262b8c648195a4b440cd3236bb83","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding pump registry loops\",\"pattern\":\"pump|registry|dispatcher|dispatch|setInterval|setTimeout|sleep|poll|heartbeat|tick\",\"path\":\"src;packages;lib;test;tests\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_qGXD3vOsVdapbFlXEv6W2U3G","name":"grep"},{"id":"fc_0148993141920bab016a5a262b8c688195acdeecf05af16b8f","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating daemon logs\",\"path\":\"**/*.log; **/logs/**; .spt/**; .planning/**\",\"hidden\":true,\"gitignore\":false,\"limit\":200}","call_id":"call_pP2He3LfN1cI6tP9ZdDFZkMf","name":"glob"}]},"duration":8057.217099994421,"ttft":1546.2865999937057,"contextSnapshot":{"promptTokens":14968,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_abQgJv5ENPa7kLIEVd3myX9l|fc_0148993141920bab016a5a262b8c4c819580b1f07780852f78","toolName":"read","startedAt":"2026-07-17T12:55:07.614Z","args":{"path":"skill://diagnose"},"intent":"Reading diagnosis workflow"},"id":"72707009","parentId":"599e8cd1","timestamp":"2026-07-17T12:55:07.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pfCuhUDaLcPqbkY2pAyTkk41|fc_0148993141920bab016a5a262b8c5c8195b8b88859d8e7e38b","toolName":"glob","startedAt":"2026-07-17T12:55:07.614Z","args":{"path":"**/*brain*"},"intent":"Mapping brain source files"},"id":"52479627","parentId":"72707009","timestamp":"2026-07-17T12:55:07.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qGXD3vOsVdapbFlXEv6W2U3G|fc_0148993141920bab016a5a262b8c648195a4b440cd3236bb83","toolName":"grep","startedAt":"2026-07-17T12:55:07.614Z","args":{"path":"src;packages;lib;test;tests"},"intent":"Finding pump registry loops"},"id":"9e3fe7fd","parentId":"52479627","timestamp":"2026-07-17T12:55:07.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pP2He3LfN1cI6tP9ZdDFZkMf|fc_0148993141920bab016a5a262b8c688195acdeecf05af16b8f","toolName":"glob","startedAt":"2026-07-17T12:55:07.614Z","args":{"path":"**/*.log; **/logs/**; .spt/**; .planning/**"},"intent":"Locating daemon logs"},"id":"8d52bd09","parentId":"9e3fe7fd","timestamp":"2026-07-17T12:55:07.614Z"}
{"type":"message","id":"2ece7326","parentId":"8d52bd09","timestamp":"2026-07-17T12:55:07.617Z","message":{"role":"toolResult","toolCallId":"call_abQgJv5ENPa7kLIEVd3myX9l|fc_0148993141920bab016a5a262b8c4c819580b1f07780852f78","toolName":"read","content":[{"type":"text","text":"---\nname: diagnose\ndescription: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says \"diagnose this\" / \"debug this\", reports a bug, says something is broken/throwing/failing, or describes a performance regression.\n---\n\n# Diagnose\n\nA discipline for hard bugs. Skip phases only when explicitly justified.\n\nWhen exploring the codebase, use the project's domain glossary to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.\n\n## Phase 1 — Build a feedback loop\n\n**This is the skill.** Everything else is mechanical. If you have a fast, deterministic, agent-runnable pass/fail signal for the bug, you will find the cause — bisection, hypothesis-testing, and instrumentation all just consume that signal. If you don't have one, no amount of staring at code will save you.\n\nSpend disproportionate effort here. **Be aggressive. Be creative. Refuse to give up.**\n\n### Ways to construct one — try them in roughly this order\n\n1. **Failing test** at whatever seam reaches the bug — unit, integration, e2e.\n2. **Curl / HTTP script** against a running dev server.\n3. **CLI invocation** with a fixture input, diffing stdout against a known-good snapshot.\n4. **Headless browser script** (Playwright / Puppeteer) — drives the UI, asserts on DOM/console/network.\n5. **Replay a captured trace.** Save a real network request / payload / event log to disk; replay it through the code path in isolation.\n6. **Throwaway harness.** Spin up a minimal subset of the system (one service, mocked deps) that exercises the bug code path with a single function call.\n7. **Property / fuzz loop.** If the bug is \"sometimes wrong output\", run 1000 random inputs and look for the failure mode.\n8. **Bisection harness.** If the bug appeared between two known states (commit, dataset, version), automate \"boot at state X, check, repeat\" so you can `git bisect run` it.\n9. **Differential loop.** Run the same input through old-version vs new-version (or two configs) and diff outputs.\n10. **HITL bash script.** Last resort. If a human must click, drive _them_ with `scripts/hitl-loop.template.sh` so the loop is still structured. Captured output feeds back to you.\n\nBuild the right feedback loop, and the bug is 90% fixed.\n\n### Iterate on the loop itself\n\nTreat the loop as a product. Once you have _a_ loop, ask:\n\n- Can I make it faster? (Cache setup, skip unrelated init, narrow the test scope.)\n- Can I make the signal sharper? (Assert on the specific symptom, not \"didn't crash\".)\n- Can I make it more deterministic? (Pin time, seed RNG, isolate filesystem, freeze network.)\n\nA 30-second flaky loop is barely better than no loop. A 2-second deterministic loop is a debugging superpower.\n\n### Non-deterministic bugs\n\nThe goal is not a clean repro but a **higher reproduction rate**. Loop the trigger 100×, parallelise, add stress, narrow timing windows, inject sleeps. A 50%-flake bug is debuggable; 1% is not — keep raising the rate until it's debuggable.\n\n### When you genuinely cannot build a loop\n\nStop and say so explicitly. List what you tried. Ask the user for: (a) access to whatever environment reproduces it, (b) a captured artifact (HAR file, log dump, core dump, screen recording with timestamps), or (c) permission to add temporary production instrumentation. Do **not** proceed to hypothesise without a loop.\n\nDo not proceed to Phase 2 until you have a loop you believe in.\n\n## Phase 2 — Reproduce\n\nRun the loop. Watch the bug appear.\n\nConfirm:\n\n- [ ] The loop produces the failure mode the **user** described — not a different failure that happens to be nearby. Wrong bug = wrong fix.\n- [ ] The failure is reproducible across multiple runs (or, for non-deterministic bugs, reproducible at a high enough rate to debug against).\n- [ ] You have captured the exact symptom (error message, wrong output, slow timing) so later phases can verify the fix actually addresses it.\n\nDo not proceed until you reproduce the bug.\n\n## Phase 3 — Hypothesise\n\nGenerate **3–5 ranked hypotheses** before testing any of them. Single-hypothesis generation anchors on the first plausible idea.\n\nEach hypothesis must be **falsifiable**: state the prediction it makes.\n\n> Format: \"If <X> is the cause, then <changing Y> will make the bug disappear / <changing Z> will make it worse.\"\n\nIf you cannot state the prediction, the hypothesis is a vibe — discard or sharpen it.\n\n**Show the ranked list to the user before testing.** They often have domain knowledge that re-ranks instantly (\"we just deployed a change to #3\"), or know hypotheses they've already ruled out. Cheap checkpoint, big time saver. Don't block on it — proceed with your ranking if the user is AFK.\n\n## Phase 4 — Instrument\n\nEach probe must map to a specific prediction from Phase 3. **Change one variable at a time.**\n\nTool preference:\n\n1. **Debugger / REPL inspection** if the env supports it. One breakpoint beats ten logs.\n2. **Targeted logs** at the boundaries that distinguish hypotheses.\n3. Never \"log everything and grep\".\n\n**Tag every debug log** with a unique prefix, e.g. `[DEBUG-a4f2]`. Cleanup at the end becomes a single grep. Untagged logs survive; tagged logs die.\n\n**Perf branch.** For performance regressions, logs are usually wrong. Instead: establish a baseline measurement (timing harness, `performance.now()`, profiler, query plan), then bisect. Measure first, fix second.\n\n## Phase 5 — Fix + regression test\n\nWrite the regression test **before the fix** — but only if there is a **correct seam** for it.\n\nA correct seam is one where the test exercises the **real bug pattern** as it occurs at the call site. If the only available seam is too shallow (single-caller test when the bug needs multiple callers, unit test that can't replicate the chain that triggered the bug), a regression test there gives false confidence.\n\n**If no correct seam exists, that itself is the finding.** Note it. The codebase architecture is preventing the bug from being locked down. Flag this for the next phase.\n\nIf a correct seam exists:\n\n1. Turn the minimised repro into a failing test at that seam.\n2. Watch it fail.\n3. Apply the fix.\n4. Watch it pass.\n5. Re-run the Phase 1 feedback loop against the original (un-minimised) scenario.\n\n## Phase 6 — Cleanup + post-mortem\n\nRequired before declaring done:\n\n- [ ] Original repro no longer reproduces (re-run the Phase 1 loop)\n- [ ] Regression test passes (or absence of seam is documented)\n- [ ] All `[DEBUG-...]` instrumentation removed (`grep` the prefix)\n- [ ] Throwaway prototypes deleted (or moved to a clearly-marked debug location)\n- [ ] The hypothesis that turned out correct is stated in the commit / PR message — so the next debugger learns\n\n**Then ask: what would have prevented this bug?** If the answer involves architectural change (no good test seam, tangled callers, hidden coupling) hand off to the `/improve-codebase-architecture` skill with the specifics. Make the recommendation **after** the fix is in, not before — you have more information now than when you started.\n"}],"details":{"resolvedPath":"C:\\Users\\decid\\.claude\\skills\\diagnose\\SKILL.md","contentType":"text/markdown","displayContent":{"text":"---\r\nname: diagnose\r\ndescription: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says \"diagnose this\" / \"debug this\", reports a bug, says something is broken/throwing/failing, or describes a performance regression.\r\n---\r\n\r\n# Diagnose\r\n\r\nA discipline for hard bugs. Skip phases only when explicitly justified.\r\n\r\nWhen exploring the codebase, use the project's domain glossary to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.\r\n\r\n## Phase 1 — Build a feedback loop\r\n\r\n**This is the skill.** Everything else is mechanical. If you have a fast, deterministic, agent-runnable pass/fail signal for the bug, you will find the cause — bisection, hypothesis-testing, and instrumentation all just consume that signal. If you don't have one, no amount of staring at code will save you.\r\n\r\nSpend disproportionate effort here. **Be aggressive. Be creative. Refuse to give up.**\r\n\r\n### Ways to construct one — try them in roughly this order\r\n\r\n1. **Failing test** at whatever seam reaches the bug — unit, integration, e2e.\r\n2. **Curl / HTTP script** against a running dev server.\r\n3. **CLI invocation** with a fixture input, diffing stdout against a known-good snapshot.\r\n4. **Headless browser script** (Playwright / Puppeteer) — drives the UI, asserts on DOM/console/network.\r\n5. **Replay a captured trace.** Save a real network request / payload / event log to disk; replay it through the code path in isolation.\r\n6. **Throwaway harness.** Spin up a minimal subset of the system (one service, mocked deps) that exercises the bug code path with a single function call.\r\n7. **Property / fuzz loop.** If the bug is \"sometimes wrong output\", run 1000 random inputs and look for the failure mode.\r\n8. **Bisection harness.** If the bug appeared between two known states (commit, dataset, version), automate \"boot at state X, check, repeat\" so you can `git bisect run` it.\r\n9. **Differential loop.** Run the same input through old-version vs new-version (or two configs) and diff outputs.\r\n10. **HITL bash script.** Last resort. If a human must click, drive _them_ with `scripts/hitl-loop.template.sh` so the loop is still structured. Captured output feeds back to you.\r\n\r\nBuild the right feedback loop, and the bug is 90% fixed.\r\n\r\n### Iterate on the loop itself\r\n\r\nTreat the loop as a product. Once you have _a_ loop, ask:\r\n\r\n- Can I make it faster? (Cache setup, skip unrelated init, narrow the test scope.)\r\n- Can I make the signal sharper? (Assert on the specific symptom, not \"didn't crash\".)\r\n- Can I make it more deterministic? (Pin time, seed RNG, isolate filesystem, freeze network.)\r\n\r\nA 30-second flaky loop is barely better than no loop. A 2-second deterministic loop is a debugging superpower.\r\n\r\n### Non-deterministic bugs\r\n\r\nThe goal is not a clean repro but a **higher reproduction rate**. Loop the trigger 100×, parallelise, add stress, narrow timing windows, inject sleeps. A 50%-flake bug is debuggable; 1% is not — keep raising the rate until it's debuggable.\r\n\r\n### When you genuinely cannot build a loop\r\n\r\nStop and say so explicitly. List what you tried. Ask the user for: (a) access to whatever environment reproduces it, (b) a captured artifact (HAR file, log dump, core dump, screen recording with timestamps), or (c) permission to add temporary production instrumentation. Do **not** proceed to hypothesise without a loop.\r\n\r\nDo not proceed to Phase 2 until you have a loop you believe in.\r\n\r\n## Phase 2 — Reproduce\r\n\r\nRun the loop. Watch the bug appear.\r\n\r\nConfirm:\r\n\r\n- [ ] The loop produces the failure mode the **user** described — not a different failure that happens to be nearby. Wrong bug = wrong fix.\r\n- [ ] The failure is reproducible across multiple runs (or, for non-deterministic bugs, reproducible at a high enough rate to debug against).\r\n- [ ] You have captured the exact symptom (error message, wrong output, slow timing) so later phases can verify the fix actually addresses it.\r\n\r\nDo not proceed until you reproduce the bug.\r\n\r\n## Phase 3 — Hypothesise\r\n\r\nGenerate **3–5 ranked hypotheses** before testing any of them. Single-hypothesis generation anchors on the first plausible idea.\r\n\r\nEach hypothesis must be **falsifiable**: state the prediction it makes.\r\n\r\n> Format: \"If <X> is the cause, then <changing Y> will make the bug disappear / <changing Z> will make it worse.\"\r\n\r\nIf you cannot state the prediction, the hypothesis is a vibe — discard or sharpen it.\r\n\r\n**Show the ranked list to the user before testing.** They often have domain knowledge that re-ranks instantly (\"we just deployed a change to #3\"), or know hypotheses they've already ruled out. Cheap checkpoint, big time saver. Don't block on it — proceed with your ranking if the user is AFK.\r\n\r\n## Phase 4 — Instrument\r\n\r\nEach probe must map to a specific prediction from Phase 3. **Change one variable at a time.**\r\n\r\nTool preference:\r\n\r\n1. **Debugger / REPL inspection** if the env supports it. One breakpoint beats ten logs.\r\n2. **Targeted logs** at the boundaries that distinguish hypotheses.\r\n3. Never \"log everything and grep\".\r\n\r\n**Tag every debug log** with a unique prefix, e.g. `[DEBUG-a4f2]`. Cleanup at the end becomes a single grep. Untagged logs survive; tagged logs die.\r\n\r\n**Perf branch.** For performance regressions, logs are usually wrong. Instead: establish a baseline measurement (timing harness, `performance.now()`, profiler, query plan), then bisect. Measure first, fix second.\r\n\r\n## Phase 5 — Fix + regression test\r\n\r\nWrite the regression test **before the fix** — but only if there is a **correct seam** for it.\r\n\r\nA correct seam is one where the test exercises the **real bug pattern** as it occurs at the call site. If the only available seam is too shallow (single-caller test when the bug needs multiple callers, unit test that can't replicate the chain that triggered the bug), a regression test there gives false confidence.\r\n\r\n**If no correct seam exists, that itself is the finding.** Note it. The codebase architecture is preventing the bug from being locked down. Flag this for the next phase.\r\n\r\nIf a correct seam exists:\r\n\r\n1. Turn the minimised repro into a failing test at that seam.\r\n2. Watch it fail.\r\n3. Apply the fix.\r\n4. Watch it pass.\r\n5. Re-run the Phase 1 feedback loop against the original (un-minimised) scenario.\r\n\r\n## Phase 6 — Cleanup + post-mortem\r\n\r\nRequired before declaring done:\r\n\r\n- [ ] Original repro no longer reproduces (re-run the Phase 1 loop)\r\n- [ ] Regression test passes (or absence of seam is documented)\r\n- [ ] All `[DEBUG-...]` instrumentation removed (`grep` the prefix)\r\n- [ ] Throwaway prototypes deleted (or moved to a clearly-marked debug location)\r\n- [ ] The hypothesis that turned out correct is stated in the commit / PR message — so the next debugger learns\r\n\r\n**Then ask: what would have prevented this bug?** If the answer involves architectural change (no good test seam, tangled callers, hidden coupling) hand off to the `/improve-codebase-architecture` skill with the specifics. Make the recommendation **after** the fix is in, not before — you have more information now than when you started.\r\n","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118]},"meta":{"source":{"type":"internal","value":"skill://diagnose"}}},"isError":false,"timestamp":1784292907616}}
{"type":"message","id":"a826bf71","parentId":"2ece7326","timestamp":"2026-07-17T12:55:07.629Z","message":{"role":"toolResult","toolCallId":"call_pfCuhUDaLcPqbkY2pAyTkk41|fc_0148993141920bab016a5a262b8c5c8195b8b88859d8e7e38b","toolName":"glob","content":[{"type":"text","text":"# crates/\n## spt-daemon/\n### src/\nbrain.rs\nbrainproc.rs\n### tests/\nbrain_decouple.rs\nbrain_resume_conn_deadlock.rs\ndaemon_lifecycle_real_brain.rs\nbrain_swap.rs\n## spt/tests/\nbrain_survive.rs\nbrain_split.rs\nbrain_respawn_rename.rs\n# docs/adr/\n0018-broker-brain-process-isolation-restoration.md\n0004-single-daemon-broker-brain-split-and-self-update.md"}],"details":{"scopePath":".","fileCount":11,"files":["crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/tests/brain_decouple.rs","crates/spt-daemon/tests/brain_resume_conn_deadlock.rs","crates/spt/tests/brain_survive.rs","crates/spt-daemon/tests/daemon_lifecycle_real_brain.rs","crates/spt-daemon/tests/brain_swap.rs","crates/spt/tests/brain_split.rs","crates/spt/tests/brain_respawn_rename.rs","docs/adr/0018-broker-brain-process-isolation-restoration.md","docs/adr/0004-single-daemon-broker-brain-split-and-self-update.md"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784292907629}}
{"type":"message","id":"95bb2214","parentId":"a826bf71","timestamp":"2026-07-17T12:55:07.632Z","message":{"role":"toolResult","toolCallId":"call_qGXD3vOsVdapbFlXEv6W2U3G|fc_0148993141920bab016a5a262b8c648195a4b440cd3236bb83","toolName":"grep","content":[{"type":"text","text":"No matches found\nSkipped missing paths: packages, lib, test"}],"details":{"scopePath":"src, tests","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false,"missingPaths":["packages","lib","test"]},"isError":false,"useless":true,"timestamp":1784292907632}}
{"type":"message","id":"a0a28f39","parentId":"95bb2214","timestamp":"2026-07-17T12:55:11.265Z","message":{"role":"toolResult","toolCallId":"call_pP2He3LfN1cI6tP9ZdDFZkMf|fc_0148993141920bab016a5a262b8c688195acdeecf05af16b8f","toolName":"glob","content":[{"type":"text","text":"# .worktrees/r4-stale-guard/\ngate.log\n# .gstack/\nbrowse-console.log\nbrowse-network.log\n\nSkipped missing paths: .spt/**, .planning/**"}],"details":{"scopePath":"**/*.log, **/logs/**","fileCount":3,"files":[".worktrees/r4-stale-guard/gate.log",".gstack/browse-console.log",".gstack/browse-network.log"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","missingPaths":[".spt/**",".planning/**"]},"isError":false,"timestamp":1784292911265}}
{"type":"message","id":"23b3834b","parentId":"a0a28f39","timestamp":"2026-07-17T12:55:19.971Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning log and source path discovery**"},{"type":"toolCall","id":"call_kNKZmG1jBravEPvsUXe9UT2h|fc_0148993141920bab016a5a2637e7ac8195af30a9c2a1cdd3bc","name":"read","arguments":{"i":"Mapping repository root","path":".","selector":null}},{"type":"toolCall","id":"call_mipRCiPaQ9uckU4NEfjh8EeD|fc_0148993141920bab016a5a2637e7c081958caaf41ac102d2cf","name":"read","arguments":{"i":"Mapping brain module","path":"crates/spt-daemon/src/brain.rs","selector":null}},{"type":"toolCall","id":"call_TcDBXeQrRBYa1AbeLbtIwilp|fc_0148993141920bab016a5a2637e7c48195abcc8bc7fde34ac5","name":"read","arguments":{"i":"Mapping brain process module","path":"crates/spt-daemon/src/brainproc.rs","selector":null}},{"type":"toolCall","id":"call_qPlkyUu0mKcEUXL0xaGVJWSi|fc_0148993141920bab016a5a2637e7cc8195b523c28183ee69c9","name":"grep","arguments":{"i":"Finding periodic Rust work","pattern":"interval|sleep|tick|recv_timeout|select!|poll|refresh|registry|dispatch|pump","path":"crates/spt-daemon/src;crates/spt-core/src;crates/spt/src","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_beHarAIGKna0Li70DrhjP1l7|fc_0148993141920bab016a5a2637e7e48195b08e116af72b53d8","name":"glob","arguments":{"i":"Locating user daemon logs","path":"C:/Users/decid/.spt/**/*.log; C:/Users/decid/AppData/Local/**/spt*.log; C:/Users/decid/AppData/Roaming/**/spt*.log; C:/Users/decid/.local/**/*.log","hidden":true,"gitignore":false,"limit":300}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":2223,"output":368,"cacheRead":14848,"cacheWrite":0,"totalTokens":17439,"reasoningTokens":86,"cost":{"input":0.011115000000000002,"output":0.01104,"cacheRead":0.007424,"cacheWrite":0,"total":0.029579}},"stopReason":"toolUse","timestamp":1784292911309,"responseId":"resp_0148993141920bab016a5a262f839c8195b4b1001436080d19","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26314d7c819596c29f76f03c7e7b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiY327TLWpA0TXt91vUD-XvAIFoJDG6jclA0ANsFLyYnnvxJt9TJKEFvZYYL0m378qy8AkaT_STZYtWujoITEfYGClDzxDAn0n47Km4b5B10l14OwzIwCZ2_y8od-iCVXyCmnbmVb77uWMoxLGDf0u8RSTi7lcWTL-8Iu_KMgBjlZyGigLTuCpEKQDxt6thFLKMfYgnzow--5DzDb0Uj2VU-mtp5ISqmzqFBV92myWjQZkTwnck7oRGChcA99itYybjVG1dwL7o-JKxiEWhb9R-O1VW6Xv_3Kzu4y-5C43-dLGSp8lSKKaPZex0UFuycee5pJdFnCGA5536dRUhGpiyxsbLa-Qgw2-2-vviNJW0nWuLOlEhpvp9J238KVlWILe3XVRqmBPyyOWFbJdBFrEoNS_N4LzWC9XtxQAahRBbkkbe-_OeXKxqt9SDsOALu--73gAIdmh_ncyLiAmXB8Q9at4crhE1396cOkpj1AY6DdZk1oOglmXuirLmjB52my48XUEQ_nAwgjKWTpyYVscCWlR67zTjlTKeoiGI4Lgy_aSqakC60YA3f3r7huW5qP-0a1HRX0rlXCZCNC-GAAmq3mZJvSwGv92PQga3KSJ34zR8-2yEnYdeVWzlBVHDfDqvFWCS-Q28Ugm572-ZxD_xjFpL80j0EY30At_IN0_owZ1O-mUJ2TPVnXtDAEAwRSlMWelij4Ro0NpihivZcRERZ_jGG4Nt3rSq47V9LtqwlqRPc0CV_Tb0mnAv5s4u5unJuTeHhsGLn2Y3fzoj-19aH9ddrXhYvBWAd1x9Lu4Eh_0jyX6nAYekg1tITWfmzEwani_bX67OO6vMfdpJDWrOARg_X4-Z56RQMoKQGyUtXTLR6DvkbZ-W_LmVC-JnepGXgiwk-4PoznJslxh8xa336Ai0QA5Z6eTuLl-oPZ4az5nnbXZYysV0HUjDRs3DzFkFK3lNNeXGZj7lI8kct3i9TY3dMiIszIgSUGhGkwj7xkx1UWBd36h60gPOd4j6odU68K0YeKFglbSTBT6QjYt2rZX8LdXq4C5xlkD9wumkyEzxpIwR0PP0w0DGp-garQ0kpr_rlWh5iFi6PUt-F4DB1lRBznTw4ibnTEYtZ8y7af_k4mcHiO7jrVshUbP6s1emYXVnuHpOJRJC5Q5VH7umiq2Rw4TiQVIpscdao-YgmzUykRpwF1SZ4B80nKzhaN8qIfQL29LdV5rSBhP65Ty5dHr-fCgfmWnCp5OJcPu31voYVNk8Y0KGOXCbuYE6TCa3v7tSV4XIZdVs7G13WDh88BNZPUO_vCxLN8HX1rwBB3FC3jQ4iPJiQSfXo-cqQ3vDk6YphrmrEEPhZ5Vp6P6mEsYYfqmYzrgzeF3yo4ci3kB3bEIt3UnNNvJ98da1-87NeekQA2uqlhRK78FsynoEfJw==","summary":[{"type":"summary_text","text":"**Planning log and source path discovery**"}]},{"id":"fc_0148993141920bab016a5a2637e7ac8195af30a9c2a1cdd3bc","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping repository root\",\"path\":\".\",\"selector\":null}","call_id":"call_kNKZmG1jBravEPvsUXe9UT2h","name":"read"},{"id":"fc_0148993141920bab016a5a2637e7c081958caaf41ac102d2cf","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping brain module\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":null}","call_id":"call_mipRCiPaQ9uckU4NEfjh8EeD","name":"read"},{"id":"fc_0148993141920bab016a5a2637e7c48195abcc8bc7fde34ac5","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping brain process module\",\"path\":\"crates/spt-daemon/src/brainproc.rs\",\"selector\":null}","call_id":"call_TcDBXeQrRBYa1AbeLbtIwilp","name":"read"},{"id":"fc_0148993141920bab016a5a2637e7cc8195b523c28183ee69c9","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding periodic Rust work\",\"pattern\":\"interval|sleep|tick|recv_timeout|select!|poll|refresh|registry|dispatch|pump\",\"path\":\"crates/spt-daemon/src;crates/spt-core/src;crates/spt/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_qPlkyUu0mKcEUXL0xaGVJWSi","name":"grep"},{"id":"fc_0148993141920bab016a5a2637e7e48195b08e116af72b53d8","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating user daemon logs\",\"path\":\"C:/Users/decid/.spt/**/*.log; C:/Users/decid/AppData/Local/**/spt*.log; C:/Users/decid/AppData/Roaming/**/spt*.log; C:/Users/decid/.local/**/*.log\",\"hidden\":true,\"gitignore\":false,\"limit\":300}","call_id":"call_beHarAIGKna0Li70DrhjP1l7","name":"glob"}]},"duration":8660.479000002146,"ttft":2012.5136000066996,"contextSnapshot":{"promptTokens":17071,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kNKZmG1jBravEPvsUXe9UT2h|fc_0148993141920bab016a5a2637e7ac8195af30a9c2a1cdd3bc","toolName":"read","startedAt":"2026-07-17T12:55:19.972Z","args":{"path":"."},"intent":"Mapping repository root"},"id":"7e09f20a","parentId":"23b3834b","timestamp":"2026-07-17T12:55:19.972Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_mipRCiPaQ9uckU4NEfjh8EeD|fc_0148993141920bab016a5a2637e7c081958caaf41ac102d2cf","toolName":"read","startedAt":"2026-07-17T12:55:19.972Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Mapping brain module"},"id":"7240f230","parentId":"7e09f20a","timestamp":"2026-07-17T12:55:19.972Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TcDBXeQrRBYa1AbeLbtIwilp|fc_0148993141920bab016a5a2637e7c48195abcc8bc7fde34ac5","toolName":"read","startedAt":"2026-07-17T12:55:19.972Z","args":{"path":"crates/spt-daemon/src/brainproc.rs"},"intent":"Mapping brain process module"},"id":"d03b1fd8","parentId":"7240f230","timestamp":"2026-07-17T12:55:19.972Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qPlkyUu0mKcEUXL0xaGVJWSi|fc_0148993141920bab016a5a2637e7cc8195b523c28183ee69c9","toolName":"grep","startedAt":"2026-07-17T12:55:19.972Z","args":{"path":"crates/spt-daemon/src;crates/spt-core/src;crates/spt/src"},"intent":"Finding periodic Rust work"},"id":"ae9a70be","parentId":"d03b1fd8","timestamp":"2026-07-17T12:55:19.972Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_beHarAIGKna0Li70DrhjP1l7|fc_0148993141920bab016a5a2637e7e48195b08e116af72b53d8","toolName":"glob","startedAt":"2026-07-17T12:55:19.972Z","args":{"path":"C:/Users/decid/.spt/**/*.log; C:/Users/decid/AppData/Local/**/spt*.log; C:/Users/decid/AppData/Roaming/**/spt*.log; C:/Users/decid/.local/**/*.log"},"intent":"Locating user daemon logs"},"id":"09448f29","parentId":"ae9a70be","timestamp":"2026-07-17T12:55:19.972Z"}
{"type":"message","id":"949de036","parentId":"09448f29","timestamp":"2026-07-17T12:55:19.977Z","message":{"role":"toolResult","toolCallId":"call_kNKZmG1jBravEPvsUXe9UT2h|fc_0148993141920bab016a5a2637e7ac8195af30a9c2a1cdd3bc","toolName":"read","content":[{"type":"text","text":".\n  - .worktrees/                                                       9m ago\n    - gate-f4727cd/                                                   8h ago\n    - gate-73b29b8/                                                   9h ago\n    - gate-ad7fde8/                                                   22h ago\n    - pi-w1-main-check/                                               1d ago\n    - gate-a841f5a/                                                   2d ago\n    - gate-w6/                                                        6d ago\n    - gate-w5/                                                        6d ago\n    - gate-w4/                                                        6d ago\n    - r4-stale-guard/                                                 6d ago\n    - rca-capture/                                                    1w ago\n    - f-035/                                                          1w ago\n    - … 1 more\n    - docs-reorg/                                                     1w ago\n  - .claude/                                                          34m ago\n    - todlando-commune.md                                   5.6KB     1h ago\n    - reports/                                                        5h ago\n    - hertz-pty-freeze-rca.md                               11.6KB    6d ago\n    - doyle-to-todlando.md                                  4.7KB     6d ago\n    - todlando-to-doyle.md                                  4.4KB     6d ago\n    - flynn-commune.md                                      307B      1w ago\n    - LIVE_AGENT_IDS.json                                   300B      1w ago\n    - agent-memory/                                                   4w ago\n  - CHANGELOG.md                                            110.9KB   1h ago\n  - Cargo.lock                                              131.2KB   1h ago\n  - Cargo.toml                                              1.5KB     1h ago\n  - traceable-reqs.toml                                     791.1KB   1h ago\n  - .config/                                                          1h ago\n    - nextest.toml                                          9.2KB     1h ago\n  - tests/                                                            4h ago\n    - .gitkeep                                              23B       1mo ago\n  - docs/                                                             5h ago\n    - adr/                                                            1h ago\n    - KNOWN-HAZARDS.md                                      220.4KB   5h ago\n    - REGISTRY-LIFECYCLE-TRIAGE.md                          10.0KB    5h ago\n    - RELEASE-RUNBOOK.md                                    6.4KB     5h ago\n    - REDISPATCH-STALL-TRIAGE.md                            8.8KB     12h ago\n    - MESH-RECOVERY-TRIAGE.md                               7.7KB     14h ago\n    - REDISPATCH-TRUTH-TRIAGE.md                            7.2KB     1d ago\n    - STORAGE.md                                            23.7KB    1d ago\n    - PROJECT-INDEX-TRIAGE.md                               5.4KB     1d ago\n    - THE-FORKENING-TRIAGE.md                               6.1KB     2d ago\n    - UPDATE-WEDGE-2-ROUND3-CODEREAD.md                     7.6KB     6d ago\n    - … 59 more\n    - reviews/                                                        1mo ago\n  - CONTEXT.md                                              198.2KB   14h ago\n  - README.md                                               2.7KB     1d ago\n  - docs-site/                                                        2d ago\n    - src/                                                            1d ago\n    - book.toml                                             872B      2d ago\n    - llms.txt                                              3.7KB     2d ago\n    - book/                                                           1w ago\n    - theme/                                                          1mo ago\n  - installer/                                                        2d ago\n    - install.sh                                            8.2KB     2d ago\n    - install.ps1                                           11.9KB    2d ago\n  - CLAUDE.md                                               3.1KB     1w ago\n  - .gitignore                                              443B      1w ago\n  - V0.19.0-P6-SCREEN-GRID-DESIGN.md                        12.0KB    2w ago\n  - V0.17.0-ROBUST-JOIN-AND-PRESENCE-JIT.md                 9.5KB     2w ago\n  - V0.16.0-UPDATE-ARC-AND-CLI-JIT.md                       7.0KB     3w ago\n  - AGENTS.md                                               3.0KB     3w ago\n  - V0.15.0-PLAN.md                                         21.0KB    3w ago\n  - ROADMAP.md                                              29.4KB    3w ago\n  - F-019-TRANSLATION-BINARY-INSTALL-DIR-RESOLVE-DESIGN.md  6.0KB     3w ago\n  - V0.14.1-HOME-SUBNET-PICKER-LAYER-DESIGN.md              7.4KB     3w ago\n  - F-018-ADAPTER-ADD-NONDESTRUCTIVE-DESIGN.md              5.1KB     3w ago\n  - V0.14.0-ENDPOINT-CREATION-FLOW-JIT.md                   10.4KB    3w ago\n  - W3-DESIGN-PROPOSAL.md                                   16.5KB    3w ago\n  - W3-GATE-VERDICT.md                                      6.9KB     3w ago\n  - W3-DESIGN-GATE.md                                       8.1KB     3w ago\n  - V0.13.2-ADAPTER-PACKAGING-JIT.md                        8.0KB     3w ago\n  - V0.13.0-W5-DRIVEN-BY-SELF-HEAL-PLAN.md                  4.8KB     3w ago\n  - V0.13.0-W4-PICKER-UX-PLAN.md                            4.6KB     3w ago\n  - V0.13.0-VIEWER-RING-ROLL-SNAP-JIT.md                    5.2KB     3w ago\n  - V0.13.0-VIEWER-DRAIN-DECOUPLE-JIT.md                    12.5KB    3w ago\n  - V0.13.0-SKIP-TO-LIVE-JIT.md                             8.3KB     3w ago\n  - V0.13.0-RC-VT-TRANSLATE-DESIGN.md                       6.4KB     3w ago\n  - V0.13.0-P2-SESSION-RESUME-DESIGN.md                     6.7KB     3w ago\n  - V0.13.0-P1C-CONTROLLER-WRITER-REORDER-PLAN.md           8.3KB     3w ago\n  - V0.13.0-P1-RC-PASTE-DESIGN.md                           5.0KB     3w ago\n  - V0.13.0-P0-PTY-INPUT-WRITER-DESIGN.md                   7.2KB     3w ago\n  - V0.13.0-P0-JIT-PLAN.md                                  6.9KB     3w ago\n  - V0.13.0-DELIVERY-CONTROL-JIT.md                         16.6KB    3w ago\n  - V0.13.0-BUG2-RC-VT-TRANSLATE-PLAN.md                    5.7KB     3w ago\n  - target-seam/                                                      4w ago\n    - .rustc_info.json                                      1.1KB     4w ago\n    - debug/                                                          4w ago\n    - tmp/                                                            4w ago\n    - CACHEDIR.TAG                                          177B      4w ago\n  - V0.12.1-LIFECYCLE-JIT.md                                17.7KB    4w ago\n  - V074-PLAN.md                                            14.8KB    1mo ago\n  - M11-PLAN.md                                             20.7KB    1mo ago\n  - DAEMON-LIFECYCLE-COMPLETION-PLAN.md                     8.5KB     1mo ago\n  - REQ-MSG-ENVELOPE-PLAN.md                                4.8KB     1mo ago\n  - PRD.md                                                  31.6KB    1mo ago\n  - M12-W4-RULING.md                                        5.8KB     1mo ago\n  - M12-W5-PLAN.md                                          6.9KB     1mo ago\n  - M12-W4-PLAN.md                                          14.6KB    1mo ago\n  - M12-W3-PLAN.md                                          3.7KB     1mo ago\n  - M12-W3-RULING.md                                        3.2KB     1mo ago\n  - M12-W2-RULING.md                                        8.8KB     1mo ago\n  - M12-W2.5-PLAN.md                                        23.8KB    1mo ago\n  - M12-W2.5-RULING.md                                      7.2KB     1mo ago\n  - M12-W2-PLAN.md                                          16.7KB    1mo ago\n  - M12-W1-PLAN.md                                          13.9KB    1mo ago\n  - M12-W1.5-PLAN.md                                        7.5KB     1mo ago\n  - M12-PLAN.md                                             5.2KB     1mo ago\n  - M12-ENDPOINT-RUN-PICKER.md                              5.5KB     1mo ago\n  - M12-CANDIDATES.md                                       5.2KB     1mo ago\n  - DIGEST-MILESTONE-PLAN.md                                8.9KB     1mo ago\n  - adapters/                                                         1mo ago\n    - mock/                                                           1w ago\n    - mock-gateway/                                                   1w ago\n  - M9-WAVE3-JIT.md                                         16.7KB    1mo ago\n  - M9-WAVE2-ROLE-WRITERS.md                                7.7KB     1mo ago\n  - M9-WAVE1-ADDRESSING-SURVEY.md                           5.7KB     1mo ago\n  - M9-GATEWAY-WAN-PLAN.md                                  5.8KB     1mo ago\n  - M9-PLAN.md                                              11.8KB    1mo ago\n  - V042-PLAN.md                                            9.1KB     1mo ago\n  - PUMP-SEAM-PLAN.md                                       14.5KB    1mo ago\n  - RESTORATION-D7-PLAN.md                                  35.7KB    1mo ago\n  - RESTORATION-D6-PLAN.md                                  38.7KB    1mo ago\n  - RESTORATION-D5-PLAN.md                                  22.0KB    1mo ago\n  - RESTORATION-D4-PLAN.md                                  18.7KB    1mo ago\n  - RESTORATION-PLAN.md                                     23.7KB    1mo ago\n  - RESTORATION-D3-PLAN.md                                  12.8KB    1mo ago\n  - RESTORATION-D2-PLAN.md                                  6.2KB     1mo ago\n  - RESTORATION-D1-PLAN.md                                  4.4KB     1mo ago\n  - V032-PLAN.md                                            6.3KB     1mo ago\n  - V031-PLAN.md                                            4.7KB     1mo ago\n  - releases-repo/                                                    1mo ago\n    - SYNC.md                                               512B      1mo ago\n    - LICENSE-MIT                                           1.3KB     1mo ago\n    - README.md                                             4.8KB     1mo ago\n    - LICENSE-BINARY                                        1.8KB     1mo ago\n  - crates/                                                           1mo ago\n    - spt-daemon/                                                     1d ago\n    - spt/                                                            1d ago\n    - spt-runtime/                                                    2d ago\n    - spt-store/                                                      6d ago\n    - spt-net/                                                        1w ago\n    - xtask/                                                          1w ago\n    - spt-term/                                                       1w ago\n    - spt-proto/                                                      1w ago\n    - spt-msg/                                                        1w ago\n    - spt-live/                                                       1w ago\n  - SUBNET-MESH-PLAN.md                                     11.8KB    1mo ago\n  - MESH-D7-PLAN.md                                         9.0KB     1mo ago\n  - MESH-D8-PLAN.md                                         6.6KB     1mo ago\n  - MESH-D4-PLAN.md                                         11.6KB    1mo ago\n  - MESH-D5-PLAN.md                                         12.2KB    1mo ago\n  - MESH-D6-PLAN.md                                         7.7KB     1mo ago\n  - MESH-D2-PLAN.md                                         11.6KB    1mo ago\n  - MESH-D3-PLAN.md                                         9.9KB     1mo ago\n  - M8-PLAN.md                                              20.1KB    1mo ago\n  - MESH-D0-PLAN.md                                         5.8KB     1mo ago\n  - MESH-D1-PLAN.md                                         6.3KB     1mo ago\n  - M8-ACCEPTANCE-STEPS.md                                  17.3KB    1mo ago\n  - M8-ACCEPTANCE.md                                        9.0KB     1mo ago\n  - M7-PLAN.md                                              9.0KB     1mo ago\n  - M5-PLAN.md                                              21.4KB    1mo ago\n  - M6-PLAN.md                                              10.3KB    1mo ago\n  - M5-D9-PLAN.md                                           7.1KB     1mo ago\n  - M5-D6-PLAN.md                                           8.7KB     1mo ago\n  - M5-D7-PLAN.md                                           8.5KB     1mo ago\n  - M5-D8-PLAN.md                                           9.6KB     1mo ago\n  - M5-D5-PLAN.md                                           7.2KB     1mo ago\n  - M5-D3-PLAN.md                                           19.1KB    1mo ago\n  - M5-D4-PLAN.md                                           14.3KB    1mo ago\n  - M4-D9-PLAN.md                                           20.4KB    1mo ago\n  - M4-PLAN.md                                              19.8KB    1mo ago\n  - M4-D8-PLAN.md                                           14.5KB    1mo ago\n  - M4-D7-PLAN.md                                           8.0KB     1mo ago\n  - M4-D7.5-PLAN.md                                         9.0KB     1mo ago\n  - M4-D5-PLAN.md                                           9.7KB     1mo ago\n  - M4-D6-PLAN.md                                           8.6KB     1mo ago\n  - M4-D3-PLAN.md                                           6.1KB     1mo ago\n  - M4-D4-PLAN.md                                           5.9KB     1mo ago\n  - M4-D2f-PLAN.md                                          4.1KB     1mo ago\n  - M4-D2g-PLAN.md                                          4.6KB     1mo ago\n  - M3c-PLAN.md                                             9.1KB     1mo ago\n  - M4-D2-WIRE-PLAN.md                                      7.6KB     1mo ago\n  - M3b-PLAN.md                                             15.8KB    1mo ago\n  - M3-PLAN.md                                              20.0KB    1mo ago\n  - M3a-PLAN.md                                             11.4KB    1mo ago\n  - M2a-PLAN.md                                             12.9KB    1mo ago\n  - M2b-PLAN.md                                             17.3KB    1mo ago\n  - M0-PLAN.md                                              7.9KB     1mo ago\n  - M1-PLAN.md                                              9.6KB     1mo ago\n  - DAEMON-LIFECYCLE-PLAN.md                                6.9KB     1mo ago\n  - DAEMON-LIFECYCLE-VERIFICATION.md                        3.0KB     1mo ago\n  - CI-SELFHOST-PLAN.md                                     3.8KB     1mo ago\n  - .github/                                                          1mo ago\n    - workflows/                                                      1h ago\n  - .gitattributes                                          363B      1mo ago\n  - .gstack/                                                          1mo ago\n    - browse-console.log                                    230B      1mo ago\n    - browse-network.log                                    2.1KB     1mo ago\n  - src/                                                              1mo ago\n    - .gitkeep                                              51B       1mo ago\n\n[1 results limit reached. Use limit=2 for more]"}],"details":{"isDirectory":true,"resolvedPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"limits":{"resultLimit":{"reached":1,"suggestion":2}}}},"isError":false,"timestamp":1784292919977}}
{"type":"message","id":"2dd70abe","parentId":"949de036","timestamp":"2026-07-17T12:55:19.997Z","message":{"role":"toolResult","toolCallId":"call_TcDBXeQrRBYa1AbeLbtIwilp|fc_0148993141920bab016a5a2637e7c48195abcc8bc7fde34ac5","toolName":"read","content":[{"type":"text","text":"//! The brain **process** + its broker-side supervisor (ADR-0018 Q2/Q3 — the\n//! broker/brain process-isolation restoration, D1 skeleton).\n//!\n//! ADR-0004 specified the broker/brain split as two **processes**; production\n//! drifted to an in-process thread (`daemon.rs`), so `spt update apply` swaps\n//! the binary on disk but never restarts the running code (the regression\n//! ADR-0018 corrects). D1 restores the process boundary as a *true minimal\n//! skeleton*: `spt daemon run` is the broker process and spawns a supervised\n//! `spt daemon brain` child. The child connects over the existing broker socket\n//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2\n//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n//! verb. The digest hub serve + seed-control stay broker-side continuity\n//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\n//! loops.\n//!\n//! What D1 proves (de-risk spike #1, the design's hardest invariant): the\n//! broker spawns + supervises a brain child over the socket, and the broker\n//! (with its PTY children + seed channel) survives the brain dying — the\n//! supervisor respawns it from the executable path, which on a real update is\n//! the swapped binary.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n\nuse std::io;\nuse std::path::{Path, PathBuf};\nuse std::process::{Child, Command};\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::{Arc, OnceLock};\nuse std::thread;\nuse std::time::{Duration, Instant};\n\nuse crate::brain::{now_ms, Brain};\nuse crate::endpoint::{brain_ready_path, broker_socket_name};\nuse crate::relcache::{AppliedRecord, ReleaseCache};\n\n/// Supervisor backoff floor after a brain death (mirrors the peer-pump\n/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\n/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\n/// Backoff ceiling — a persistently-crashing brain stays visible and bounded,\n/// never a hot respawn loop.\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(60);\n/// A run at least this long counts as healthy and resets the backoff floor.\n/// Reused as the per-attempt **trial window** (ADR-0018 Q7, D6-2): a candidate\n/// brain has this long to signal `ready` for its generation before the window\n/// elapses (the \"up but useless\" alive-never-ready rollback path).\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(30);\n/// The readiness-trial retry budget (ADR-0018 Q7, D6-2): a candidate that\n/// **exits before** signaling ready is respawned this many consecutive times\n/// (a transient first-boot hiccup should not abandon a good binary) before the\n/// supervisor auto-rolls-back to the last-known-good binary. Matched to the\n/// capped-backoff cadence; either this budget OR an alive-but-never-ready\n/// window-expiry triggers rollback.\nconst TRIAL_PREREADY_BUDGET: u32 = 3;\n/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\nconst TICK: Duration = Duration::from_millis(200);\n\n/// How long the brain child retries connecting to the broker socket before\n/// giving up (the broker may still be binding — the child is freshly spawned).\nconst BRAIN_CONNECT_TRIES: u32 = 300;\n/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\nconst BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\n\n/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\n/// broker stamps at spawn time (ADR-0018 V2). One channel, three payloads: the\n/// broker *observes* every respawn, so it alone is authoritative (strictly more\n/// reliable than a brain→brain frame, which retires in D4).\n///\n/// Parsing is **lenient** (KH-2.3 forward-compat): an unrecognized value — a\n/// reason a *future* broker adds that this brain predates — defaults to `Cold`,\n/// never a parse failure that would brick the brain before it rehydrates.\n// [impl->REQ-HAZARD-HANDOFF-ARGV-COMPAT]\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\npub enum StartReason {\n    /// The broker's first brain spawn this broker lifetime.\n    Cold,\n    /// A supervised respawn after an unexpected brain exit.\n    Crash,\n    /// A respawn the broker itself initiated for a binary swap (wired in D3-3).\n    Update,\n}\n\nimpl StartReason {\n    /// The argv token the broker passes to `spt daemon brain --start-reason`.\n    pub fn as_arg(self) -> &'static str {\n        match self {\n            StartReason::Cold => \"cold\",\n            StartReason::Crash => \"crash\",\n            StartReason::Update => \"update\",\n        }\n    }\n\n    /// Parse the `--start-reason` argv value, lenient: an unknown token (a\n    /// newer broker's reason an older brain predates) defaults to `Cold` rather\n    /// than failing the parse (KH-2.3 — defaults survive intermediate versions).\n    pub fn from_arg(s: &str) -> Self {\n        match s {\n            \"update\" => StartReason::Update,\n            \"crash\" => StartReason::Crash,\n            _ => StartReason::Cold,\n        }\n    }\n}\n\n/// The broker→supervisor **planned-restart signal** (ADR-0018 D3-3, Q3). The\n/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\n/// its next wait tick, kills the current brain child, and respawns it with\n/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\n/// between the broker serve path and the supervisor — both run in the broker\n/// process. This is the seam that makes a routine `apply` actually run new code,\n/// the pillar the in-process-collapse regression silently unrealized.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n#[derive(Default)]\npub struct BrainRestart {\n    requested: AtomicBool,\n}\n\nimpl BrainRestart {\n    /// A fresh signal with no pending request.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Request a planned restart (broker handler side) — idempotent: coalesces\n    /// with any already-pending request into one cycle.\n    pub fn request(&self) {\n        self.requested.store(true, Ordering::SeqCst);\n    }\n\n    /// Consume a pending request (supervisor side): true at most once per\n    /// `request`, clearing it so the next cycle starts fresh.\n    pub fn take(&self) -> bool {\n        self.requested.swap(false, Ordering::SeqCst)\n    }\n}\n\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\n/// holding the connection and probing broker liveness each heartbeat. A dropped\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\n/// from the (possibly swapped) binary.\n///\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\n/// and start them exactly once, on the first `enabled` reply. That single gate\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\n/// NetHost bind in the background and `net-status` flips `enabled` when it\n/// attaches, at which point the brain starts the consumers — no extra signal.\n///\n/// It inherits the broker's already-unelevated token as a plain child, so it\n/// runs no de-elevation guard of its own.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\n    let _ = crate::stderrlog::install(\"brain\", generation);\n    let name = broker_socket_name();\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\n    // *counter* is rehydrated, never the wall-clock stamp.\n    eprintln!(\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\n        std::process::id(),\n        reason.as_arg(),\n    );\n\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\n    // from its delivered cursor, the production replacement for the retired\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    match brain.resume_session_cursors() {\n        Ok(ids) if !ids.is_empty() => {\n            eprintln!(\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\n                ids.len()\n            )\n        }\n        Ok(_) => {}\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\n    }\n\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\n    // breadcrumb would accept a brain that connected but never rebuilt\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\n    // this is forward-correct: the gate is defined on the real readiness\n    // semantic the live-agent adapter inherits.\n    write_ready(generation);\n\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\n    // online/offline exclusivity — a reconcile loop that runs each offline\n    // instance's `wake_command` as a supervised watcher child. Relocated from\n    // the broker process to the brain child: shellwake is brain-owned logic\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\n    // posture. The stop flag is held for symmetry, never raised (the watchers\n    // die with the brain process and the next brain re-sweeps them).\n    // [impl->REQ-SHELL-2]\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n    // shell waker). Online-only is staged behind the interim `api listen`\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\n    // brain the first-host. The stop flag is held for symmetry; the threads die\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\n    // [impl->REQ-DAEMON-1]\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\n    // reconcile in the background (ready-without-warm is preserved because\n    // write_ready already fired above), then drain/debounce/coalesce the\n    // invalidation queue. Same posture as the hosts above: the stop flag is\n    // held for symmetry, the thread dies with the brain, and the next brain\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\n    // [impl->REQ-PROJECT-INDEX-WRITER]\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\n\n    let mut consumers_started = false;\n    loop {\n        thread::sleep(BRAIN_HEARTBEAT);\n        // `net-status` is both the net-capability probe and the broker-liveness\n        // probe: an `Err` is the broker gone (or a future planned\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n        let status = match brain.net_status() {\n            Ok(s) => s,\n            Err(e) => {\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\n                return Err(e);\n            }\n        };\n        if consumer_gate(status.enabled, consumers_started) {\n            let hex = status.node_id_hex.clone().unwrap_or_default();\n            spawn_net_consumers(&hex);\n            consumers_started = true;\n            eprintln!(\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n            );\n        }\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\n        // window, so without this the wedge never drains: the promotion DRAINED gate\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\n        // best-effort — a transient sessions error must never fell the heartbeat (the\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\n        // its own trial against a live older broker — no coordinated broker restart.\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\n        let _ = brain.sessions();\n        write_ready(generation);\n    }\n}\n\n\n[Showing lines 1-300 of 2165. Use :301 to continue]"}],"details":{"truncation":{"content":"//! The brain **process** + its broker-side supervisor (ADR-0018 Q2/Q3 — the\r\n//! broker/brain process-isolation restoration, D1 skeleton).\r\n//!\r\n//! ADR-0004 specified the broker/brain split as two **processes**; production\r\n//! drifted to an in-process thread (`daemon.rs`), so `spt update apply` swaps\r\n//! the binary on disk but never restarts the running code (the regression\r\n//! ADR-0018 corrects). D1 restores the process boundary as a *true minimal\r\n//! skeleton*: `spt daemon run` is the broker process and spawns a supervised\r\n//! `spt daemon brain` child. The child connects over the existing broker socket\r\n//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2\r\n//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\r\n//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\r\n//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\r\n//! verb. The digest hub serve + seed-control stay broker-side continuity\r\n//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\r\n//! loops.\r\n//!\r\n//! What D1 proves (de-risk spike #1, the design's hardest invariant): the\r\n//! broker spawns + supervises a brain child over the socket, and the broker\r\n//! (with its PTY children + seed channel) survives the brain dying — the\r\n//! supervisor respawns it from the executable path, which on a real update is\r\n//! the swapped binary.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n\r\nuse std::io;\r\nuse std::path::{Path, PathBuf};\r\nuse std::process::{Child, Command};\r\nuse std::sync::atomic::{AtomicBool, Ordering};\r\nuse std::sync::{Arc, OnceLock};\r\nuse std::thread;\r\nuse std::time::{Duration, Instant};\r\n\r\nuse crate::brain::{now_ms, Brain};\r\nuse crate::endpoint::{brain_ready_path, broker_socket_name};\r\nuse crate::relcache::{AppliedRecord, ReleaseCache};\r\n\r\n/// Supervisor backoff floor after a brain death (mirrors the peer-pump\r\n/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\r\n/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\r\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\r\n/// Backoff ceiling — a persistently-crashing brain stays visible and bounded,\r\n/// never a hot respawn loop.\r\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(60);\r\n/// A run at least this long counts as healthy and resets the backoff floor.\r\n/// Reused as the per-attempt **trial window** (ADR-0018 Q7, D6-2): a candidate\r\n/// brain has this long to signal `ready` for its generation before the window\r\n/// elapses (the \"up but useless\" alive-never-ready rollback path).\r\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(30);\r\n/// The readiness-trial retry budget (ADR-0018 Q7, D6-2): a candidate that\r\n/// **exits before** signaling ready is respawned this many consecutive times\r\n/// (a transient first-boot hiccup should not abandon a good binary) before the\r\n/// supervisor auto-rolls-back to the last-known-good binary. Matched to the\r\n/// capped-backoff cadence; either this budget OR an alive-but-never-ready\r\n/// window-expiry triggers rollback.\r\nconst TRIAL_PREREADY_BUDGET: u32 = 3;\r\n/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\r\nconst TICK: Duration = Duration::from_millis(200);\r\n\r\n/// How long the brain child retries connecting to the broker socket before\r\n/// giving up (the broker may still be binding — the child is freshly spawned).\r\nconst BRAIN_CONNECT_TRIES: u32 = 300;\r\n/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\r\nconst BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\r\n\r\n/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\r\n/// broker stamps at spawn time (ADR-0018 V2). One channel, three payloads: the\r\n/// broker *observes* every respawn, so it alone is authoritative (strictly more\r\n/// reliable than a brain→brain frame, which retires in D4).\r\n///\r\n/// Parsing is **lenient** (KH-2.3 forward-compat): an unrecognized value — a\r\n/// reason a *future* broker adds that this brain predates — defaults to `Cold`,\r\n/// never a parse failure that would brick the brain before it rehydrates.\r\n// [impl->REQ-HAZARD-HANDOFF-ARGV-COMPAT]\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\r\npub enum StartReason {\r\n    /// The broker's first brain spawn this broker lifetime.\r\n    Cold,\r\n    /// A supervised respawn after an unexpected brain exit.\r\n    Crash,\r\n    /// A respawn the broker itself initiated for a binary swap (wired in D3-3).\r\n    Update,\r\n}\r\n\r\nimpl StartReason {\r\n    /// The argv token the broker passes to `spt daemon brain --start-reason`.\r\n    pub fn as_arg(self) -> &'static str {\r\n        match self {\r\n            StartReason::Cold => \"cold\",\r\n            StartReason::Crash => \"crash\",\r\n            StartReason::Update => \"update\",\r\n        }\r\n    }\r\n\r\n    /// Parse the `--start-reason` argv value, lenient: an unknown token (a\r\n    /// newer broker's reason an older brain predates) defaults to `Cold` rather\r\n    /// than failing the parse (KH-2.3 — defaults survive intermediate versions).\r\n    pub fn from_arg(s: &str) -> Self {\r\n        match s {\r\n            \"update\" => StartReason::Update,\r\n            \"crash\" => StartReason::Crash,\r\n            _ => StartReason::Cold,\r\n        }\r\n    }\r\n}\r\n\r\n/// The broker→supervisor **planned-restart signal** (ADR-0018 D3-3, Q3). The\r\n/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\r\n/// its next wait tick, kills the current brain child, and respawns it with\r\n/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\r\n/// between the broker serve path and the supervisor — both run in the broker\r\n/// process. This is the seam that makes a routine `apply` actually run new code,\r\n/// the pillar the in-process-collapse regression silently unrealized.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n#[derive(Default)]\r\npub struct BrainRestart {\r\n    requested: AtomicBool,\r\n}\r\n\r\nimpl BrainRestart {\r\n    /// A fresh signal with no pending request.\r\n    pub fn new() -> Self {\r\n        Self::default()\r\n    }\r\n\r\n    /// Request a planned restart (broker handler side) — idempotent: coalesces\r\n    /// with any already-pending request into one cycle.\r\n    pub fn request(&self) {\r\n        self.requested.store(true, Ordering::SeqCst);\r\n    }\r\n\r\n    /// Consume a pending request (supervisor side): true at most once per\r\n    /// `request`, clearing it so the next cycle starts fresh.\r\n    pub fn take(&self) -> bool {\r\n        self.requested.swap(false, Ordering::SeqCst)\r\n    }\r\n}\r\n\r\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\r\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\r\n/// holding the connection and probing broker liveness each heartbeat. A dropped\r\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\r\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\r\n/// from the (possibly swapped) binary.\r\n///\r\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\r\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\r\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\r\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\r\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\r\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\r\n/// and start them exactly once, on the first `enabled` reply. That single gate\r\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\r\n/// NetHost bind in the background and `net-status` flips `enabled` when it\r\n/// attaches, at which point the brain starts the consumers — no extra signal.\r\n///\r\n/// It inherits the broker's already-unelevated token as a plain child, so it\r\n/// runs no de-elevation guard of its own.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\r\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\r\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\r\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\r\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\r\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\r\n    let _ = crate::stderrlog::install(\"brain\", generation);\r\n    let name = broker_socket_name();\r\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\r\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\r\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\r\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\r\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\r\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\r\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\r\n    // *counter* is rehydrated, never the wall-clock stamp.\r\n    eprintln!(\r\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\r\n        std::process::id(),\r\n        reason.as_arg(),\r\n    );\r\n\r\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\r\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\r\n    // from its delivered cursor, the production replacement for the retired\r\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\r\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\r\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\r\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\r\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\r\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\r\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\r\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\r\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\r\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\r\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\r\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\r\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\r\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\r\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\r\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\r\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\r\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\r\n    match brain.resume_session_cursors() {\r\n        Ok(ids) if !ids.is_empty() => {\r\n            eprintln!(\r\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\r\n                ids.len()\r\n            )\r\n        }\r\n        Ok(_) => {}\r\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\r\n    }\r\n\r\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\r\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\r\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\r\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\r\n    // breadcrumb would accept a brain that connected but never rebuilt\r\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\r\n    // this is forward-correct: the gate is defined on the real readiness\r\n    // semantic the live-agent adapter inherits.\r\n    write_ready(generation);\r\n\r\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\r\n    // online/offline exclusivity — a reconcile loop that runs each offline\r\n    // instance's `wake_command` as a supervised watcher child. Relocated from\r\n    // the broker process to the brain child: shellwake is brain-owned logic\r\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\r\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\r\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\r\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\r\n    // posture. The stop flag is held for symmetry, never raised (the watchers\r\n    // die with the brain process and the next brain re-sweeps them).\r\n    // [impl->REQ-SHELL-2]\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\r\n\r\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\r\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\r\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\r\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\r\n    // shell waker). Online-only is staged behind the interim `api listen`\r\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\r\n    // brain the first-host. The stop flag is held for symmetry; the threads die\r\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\r\n    // [impl->REQ-DAEMON-1]\r\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\r\n\r\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\r\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\r\n    // reconcile in the background (ready-without-warm is preserved because\r\n    // write_ready already fired above), then drain/debounce/coalesce the\r\n    // invalidation queue. Same posture as the hosts above: the stop flag is\r\n    // held for symmetry, the thread dies with the brain, and the next brain\r\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\r\n\r\n    let mut consumers_started = false;\r\n    loop {\r\n        thread::sleep(BRAIN_HEARTBEAT);\r\n        // `net-status` is both the net-capability probe and the broker-liveness\r\n        // probe: an `Err` is the broker gone (or a future planned\r\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\r\n        let status = match brain.net_status() {\r\n            Ok(s) => s,\r\n            Err(e) => {\r\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\r\n                return Err(e);\r\n            }\r\n        };\r\n        if consumer_gate(status.enabled, consumers_started) {\r\n            let hex = status.node_id_hex.clone().unwrap_or_default();\r\n            spawn_net_consumers(&hex);\r\n            consumers_started = true;\r\n            eprintln!(\r\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\r\n            );\r\n        }\r\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\r\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\r\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\r\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\r\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\r\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\r\n        // window, so without this the wedge never drains: the promotion DRAINED gate\r\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\r\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\r\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\r\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\r\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\r\n        // best-effort — a transient sessions error must never fell the heartbeat (the\r\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\r\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\r\n        // its own trial against a live older broker — no coordinated broker restart.\r\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n        let _ = brain.sessions();\r\n        write_ready(generation);\r\n    }\r\n}\r\n\r","truncated":true,"truncatedBy":"lines","totalLines":2165,"totalBytes":17036,"outputLines":300,"outputBytes":17036,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! The brain **process** + its broker-side supervisor (ADR-0018 Q2/Q3 — the\r\n//! broker/brain process-isolation restoration, D1 skeleton).\r\n//!\r\n//! ADR-0004 specified the broker/brain split as two **processes**; production\r\n//! drifted to an in-process thread (`daemon.rs`), so `spt update apply` swaps\r\n//! the binary on disk but never restarts the running code (the regression\r\n//! ADR-0018 corrects). D1 restores the process boundary as a *true minimal\r\n//! skeleton*: `spt daemon run` is the broker process and spawns a supervised\r\n//! `spt daemon brain` child. The child connects over the existing broker socket\r\n//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2\r\n//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\r\n//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\r\n//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\r\n//! verb. The digest hub serve + seed-control stay broker-side continuity\r\n//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\r\n//! loops.\r\n//!\r\n//! What D1 proves (de-risk spike #1, the design's hardest invariant): the\r\n//! broker spawns + supervises a brain child over the socket, and the broker\r\n//! (with its PTY children + seed channel) survives the brain dying — the\r\n//! supervisor respawns it from the executable path, which on a real update is\r\n//! the swapped binary.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n\r\nuse std::io;\r\nuse std::path::{Path, PathBuf};\r\nuse std::process::{Child, Command};\r\nuse std::sync::atomic::{AtomicBool, Ordering};\r\nuse std::sync::{Arc, OnceLock};\r\nuse std::thread;\r\nuse std::time::{Duration, Instant};\r\n\r\nuse crate::brain::{now_ms, Brain};\r\nuse crate::endpoint::{brain_ready_path, broker_socket_name};\r\nuse crate::relcache::{AppliedRecord, ReleaseCache};\r\n\r\n/// Supervisor backoff floor after a brain death (mirrors the peer-pump\r\n/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\r\n/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\r\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\r\n/// Backoff ceiling — a persistently-crashing brain stays visible and bounded,\r\n/// never a hot respawn loop.\r\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(60);\r\n/// A run at least this long counts as healthy and resets the backoff floor.\r\n/// Reused as the per-attempt **trial window** (ADR-0018 Q7, D6-2): a candidate\r\n/// brain has this long to signal `ready` for its generation before the window\r\n/// elapses (the \"up but useless\" alive-never-ready rollback path).\r\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(30);\r\n/// The readiness-trial retry budget (ADR-0018 Q7, D6-2): a candidate that\r\n/// **exits before** signaling ready is respawned this many consecutive times\r\n/// (a transient first-boot hiccup should not abandon a good binary) before the\r\n/// supervisor auto-rolls-back to the last-known-good binary. Matched to the\r\n/// capped-backoff cadence; either this budget OR an alive-but-never-ready\r\n/// window-expiry triggers rollback.\r\nconst TRIAL_PREREADY_BUDGET: u32 = 3;\r\n/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\r\nconst TICK: Duration = Duration::from_millis(200);\r\n\r\n/// How long the brain child retries connecting to the broker socket before\r\n/// giving up (the broker may still be binding — the child is freshly spawned).\r\nconst BRAIN_CONNECT_TRIES: u32 = 300;\r\n/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\r\nconst BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\r\n\r\n/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\r\n/// broker stamps at spawn time (ADR-0018 V2). One channel, three payloads: the\r\n/// broker *observes* every respawn, so it alone is authoritative (strictly more\r\n/// reliable than a brain→brain frame, which retires in D4).\r\n///\r\n/// Parsing is **lenient** (KH-2.3 forward-compat): an unrecognized value — a\r\n/// reason a *future* broker adds that this brain predates — defaults to `Cold`,\r\n/// never a parse failure that would brick the brain before it rehydrates.\r\n// [impl->REQ-HAZARD-HANDOFF-ARGV-COMPAT]\r\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\r\npub enum StartReason {\r\n    /// The broker's first brain spawn this broker lifetime.\r\n    Cold,\r\n    /// A supervised respawn after an unexpected brain exit.\r\n    Crash,\r\n    /// A respawn the broker itself initiated for a binary swap (wired in D3-3).\r\n    Update,\r\n}\r\n\r\nimpl StartReason {\r\n    /// The argv token the broker passes to `spt daemon brain --start-reason`.\r\n    pub fn as_arg(self) -> &'static str {\r\n        match self {\r\n            StartReason::Cold => \"cold\",\r\n            StartReason::Crash => \"crash\",\r\n            StartReason::Update => \"update\",\r\n        }\r\n    }\r\n\r\n    /// Parse the `--start-reason` argv value, lenient: an unknown token (a\r\n    /// newer broker's reason an older brain predates) defaults to `Cold` rather\r\n    /// than failing the parse (KH-2.3 — defaults survive intermediate versions).\r\n    pub fn from_arg(s: &str) -> Self {\r\n        match s {\r\n            \"update\" => StartReason::Update,\r\n            \"crash\" => StartReason::Crash,\r\n            _ => StartReason::Cold,\r\n        }\r\n    }\r\n}\r\n\r\n/// The broker→supervisor **planned-restart signal** (ADR-0018 D3-3, Q3). The\r\n/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\r\n/// its next wait tick, kills the current brain child, and respawns it with\r\n/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\r\n/// between the broker serve path and the supervisor — both run in the broker\r\n/// process. This is the seam that makes a routine `apply` actually run new code,\r\n/// the pillar the in-process-collapse regression silently unrealized.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n#[derive(Default)]\r\npub struct BrainRestart {\r\n    requested: AtomicBool,\r\n}\r\n\r\nimpl BrainRestart {\r\n    /// A fresh signal with no pending request.\r\n    pub fn new() -> Self {\r\n        Self::default()\r\n    }\r\n\r\n    /// Request a planned restart (broker handler side) — idempotent: coalesces\r\n    /// with any already-pending request into one cycle.\r\n    pub fn request(&self) {\r\n        self.requested.store(true, Ordering::SeqCst);\r\n    }\r\n\r\n    /// Consume a pending request (supervisor side): true at most once per\r\n    /// `request`, clearing it so the next cycle starts fresh.\r\n    pub fn take(&self) -> bool {\r\n        self.requested.swap(false, Ordering::SeqCst)\r\n    }\r\n}\r\n\r\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\r\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\r\n/// holding the connection and probing broker liveness each heartbeat. A dropped\r\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\r\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\r\n/// from the (possibly swapped) binary.\r\n///\r\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\r\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\r\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\r\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\r\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\r\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\r\n/// and start them exactly once, on the first `enabled` reply. That single gate\r\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\r\n/// NetHost bind in the background and `net-status` flips `enabled` when it\r\n/// attaches, at which point the brain starts the consumers — no extra signal.\r\n///\r\n/// It inherits the broker's already-unelevated token as a plain child, so it\r\n/// runs no de-elevation guard of its own.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\r\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\r\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\r\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\r\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\r\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\r\n    let _ = crate::stderrlog::install(\"brain\", generation);\r\n    let name = broker_socket_name();\r\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\r\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\r\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\r\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\r\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\r\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\r\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\r\n    // *counter* is rehydrated, never the wall-clock stamp.\r\n    eprintln!(\r\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\r\n        std::process::id(),\r\n        reason.as_arg(),\r\n    );\r\n\r\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\r\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\r\n    // from its delivered cursor, the production replacement for the retired\r\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\r\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\r\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\r\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\r\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\r\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\r\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\r\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\r\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\r\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\r\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\r\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\r\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\r\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\r\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\r\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\r\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\r\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\r\n    match brain.resume_session_cursors() {\r\n        Ok(ids) if !ids.is_empty() => {\r\n            eprintln!(\r\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\r\n                ids.len()\r\n            )\r\n        }\r\n        Ok(_) => {}\r\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\r\n    }\r\n\r\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\r\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\r\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\r\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\r\n    // breadcrumb would accept a brain that connected but never rebuilt\r\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\r\n    // this is forward-correct: the gate is defined on the real readiness\r\n    // semantic the live-agent adapter inherits.\r\n    write_ready(generation);\r\n\r\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\r\n    // online/offline exclusivity — a reconcile loop that runs each offline\r\n    // instance's `wake_command` as a supervised watcher child. Relocated from\r\n    // the broker process to the brain child: shellwake is brain-owned logic\r\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\r\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\r\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\r\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\r\n    // posture. The stop flag is held for symmetry, never raised (the watchers\r\n    // die with the brain process and the next brain re-sweeps them).\r\n    // [impl->REQ-SHELL-2]\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\r\n\r\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\r\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\r\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\r\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\r\n    // shell waker). Online-only is staged behind the interim `api listen`\r\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\r\n    // brain the first-host. The stop flag is held for symmetry; the threads die\r\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\r\n    // [impl->REQ-DAEMON-1]\r\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\r\n\r\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\r\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\r\n    // reconcile in the background (ready-without-warm is preserved because\r\n    // write_ready already fired above), then drain/debounce/coalesce the\r\n    // invalidation queue. Same posture as the hosts above: the stop flag is\r\n    // held for symmetry, the thread dies with the brain, and the next brain\r\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\r\n\r\n    let mut consumers_started = false;\r\n    loop {\r\n        thread::sleep(BRAIN_HEARTBEAT);\r\n        // `net-status` is both the net-capability probe and the broker-liveness\r\n        // probe: an `Err` is the broker gone (or a future planned\r\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\r\n        let status = match brain.net_status() {\r\n            Ok(s) => s,\r\n            Err(e) => {\r\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\r\n                return Err(e);\r\n            }\r\n        };\r\n        if consumer_gate(status.enabled, consumers_started) {\r\n            let hex = status.node_id_hex.clone().unwrap_or_default();\r\n            spawn_net_consumers(&hex);\r\n            consumers_started = true;\r\n            eprintln!(\r\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\r\n            );\r\n        }\r\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\r\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\r\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\r\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\r\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\r\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\r\n        // window, so without this the wedge never drains: the promotion DRAINED gate\r\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\r\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\r\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\r\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\r\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\r\n        // best-effort — a transient sessions error must never fell the heartbeat (the\r\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\r\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\r\n        // its own trial against a live older broker — no coordinated broker restart.\r\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n        let _ = brain.sessions();\r\n        write_ready(generation);\r\n    }\r\n}\r\n\r","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brainproc.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2165,"totalBytes":17036,"outputLines":300,"outputBytes":17036,"shownRange":{"start":1,"end":300},"nextOffset":301}}},"isError":false,"timestamp":1784292919997}}
{"type":"message","id":"767db17e","parentId":"2dd70abe","timestamp":"2026-07-17T12:55:20.046Z","message":{"role":"toolResult","toolCallId":"call_mipRCiPaQ9uckU4NEfjh8EeD|fc_0148993141920bab016a5a2637e7c081958caaf41ac102d2cf","toolName":"read","content":[{"type":"text","text":"//! The brain (B2) — the restartable logic half that attaches to the broker.\n//!\n//! The brain holds all the volatile logic; it may be killed and restarted at\n//! any moment (a routine self-update swaps it; a crash kills it). It connects to\n//! the stable [`crate::broker::Broker`] over the versioned IPC, drives sessions\n//! (spawn / input / resize / kill), and consumes their output. Two invariants\n//! this type encodes:\n//!\n//! - **`gen_start = now()` on cold-start *and* handoff (KNOWN-HAZARDS 2.4).**\n//!   The wall-clock generation stamp is taken fresh on every start. A handed-off\n//!   brain rehydrates its resume cursor and generation *counter* from prior\n//!   state, but its `gen_start` is `now()`, **never** the stale value from that\n//!   state — a rehydrated `gen_start` would fire time-based discriminators on\n//!   the new generation. [`Brain::handoff`] takes the prior state by value yet\n//!   ignores its `gen_start_ms`.\n//! - **Gapless, exactly-once resume.** The brain tracks `next_seq` — the next\n//!   output sequence it still needs. On handoff it `subscribe`s from that cursor;\n//!   the broker replays buffered output from there. [`Brain::read_event`] accepts\n//!   only the contiguous next `seq` (advancing the cursor), silently drops an\n//!   already-seen `seq` (a replay duplicate), and treats a forward gap as a hard\n//!   error — so a lost chunk can never pass silently.\n// [impl->REQ-HAZARD-GEN-START-NOW]\n// [impl->REQ-DAEMON-2]\n\nuse std::io;\nuse std::sync::mpsc::{self, Receiver, RecvTimeoutError};\nuse std::thread::{self, JoinHandle};\nuse std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\n\nuse interprocess::local_socket::prelude::*;\n\nuse interprocess::local_socket::{SendHalf, Stream};\n\nuse crate::codec::{read_frame, write_frame};\nuse crate::frame::{Envelope, Role};\nuse crate::effect::MintedOp;\nuse crate::msg::{\n    decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,\n    EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,\n    InputReq,\n    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n    SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,\n    SubscribeReq, SubscribedReply, ViewerEvictedEvent,\n    KIND_ADAPTER_APPLY, KIND_APPLIED, KIND_BRAIN_RESTART, KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY, KIND_VIEWER_EVICTED,\n    KIND_BRAIN_RESTARTED, KIND_DISPLACED, KIND_ENDPOINT_INJECTED, KIND_ENDPOINT_INPUT, KIND_ERROR, KIND_EXIT, KIND_INPUT, KIND_KILL, KIND_NET_DIAL,\n    KIND_NET_DIALED, KIND_NET_DIAL_LOOPBACK, KIND_NET_DIAL_SUBMIT, KIND_NET_DIAL_SUBMITTED,\n    KIND_NET_PRESENCE_EVENT, KIND_NET_PRESENCE_SUBSCRIBE,\n    KIND_NET_SENT,\n    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\n    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n    KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,\n    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n    KIND_SPAWN_CONFLICT, KIND_SPAWN_FRESH,\n    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\n};\nuse spt_net::net::attach::AttachIntent;\nuse crate::transport::{send_hello, LocalSocketTransport};\n\n/// Wall-clock now in epoch milliseconds — the source for `gen_start` (matches\n/// the epoch-ms stamping used elsewhere in the tree; no date dependency).\npub fn now_ms() -> u64 {\n    SystemTime::now()\n        .duration_since(UNIX_EPOCH)\n        .map(|d| d.as_millis() as u64)\n        .unwrap_or(0)\n}\n\n/// The brain's durable state across a handoff: enough to re-attach gaplessly and\n/// advance the generation. `gen_start_ms` is recorded for observability but is\n/// **deliberately not authoritative on restart** — [`Brain::handoff`] sets a\n/// fresh `gen_start` from `now()` (2.4).\n///\n/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain→brain\n/// frame is **retired from the production path**: a brain the broker's supervisor\n/// respawns reconstructs continuity by querying the broker\n/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this\n/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`\n/// solely because the integration tests (separate test target — `#[cfg(test)]`\n/// would hide them) still drive the handoff-frame shape directly; there is **no\n/// non-test caller** (KNOWN-HAZARDS 2.4 grep-clean close-out).\n#[derive(Debug, Clone)]\npub struct BrainState {\n    /// The session the brain was driving.\n    pub session_id: u64,\n    /// The generation counter (incremented on each handoff).\n    pub generation: u64,\n    /// The next output sequence still needed (the resume cursor).\n    pub next_seq: u64,\n    /// The prior generation's wall-clock start (ignored as authoritative on\n    /// handoff — kept only to demonstrate it is *not* carried forward).\n    pub gen_start_ms: u64,\n}\n\n/// The outcome of a FRESH/RejectExisting spawn (ADR-0041 decision 5): either a\n/// real fresh session was created, or the endpoint's EXISTING live session is\n/// named in a typed, side-effect-free conflict.\n// [impl->REQ-SPAWN-FRESH-TRUTHFUL]\n#[derive(Debug, Clone, PartialEq, Eq)]\npub enum FreshSpawn {\n    /// A fresh session exists — the create contract's success.\n    Created { session_id: u64, pid: Option<u32> },\n    /// A live session already exists; nothing was created or mutated.\n    Conflict { existing_session: u64 },\n}\n\n/// A demuxed broker→brain event.\n#[derive(Debug)]\npub enum BrokerEvent {\n    /// A contiguous chunk of a session's output (the cursor has advanced past it).\n    Output {\n        session_id: u64,\n        seq: u64,\n        bytes: Vec<u8>,\n    },\n    /// A spawn succeeded.\n    Spawned { session_id: u64, pid: Option<u32> },\n    /// A FRESH spawn was refused typed (ADR-0041 decision 5): the endpoint\n    /// already holds a live session — nothing was created or mutated.\n    SpawnConflict { endpoint: String, session_id: u64 },\n    /// A session's child exited.\n    Exit { session_id: u64, code: Option<i32> },\n    /// The resolved controller/viewer role of a [`Brain::attach_as`] subscribe\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). The serving brain wakes (controller-only),\n    /// stays wake-neutral (viewer), or refuses the operator (busy).\n    Subscribed {\n        session_id: u64,\n        outcome: SubscribeOutcome,\n    },\n    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\n    /// REQ-RCVIEW-1).\n    Size {\n        session_id: u64,\n        rows: u16,\n        cols: u16,\n    },\n    /// This controller was DISPLACED by a different operator's `--take`/`kick`\n    /// (REQ-KICK-1). The serving brain forwards a loud notice and detaches.\n    Displaced { session_id: u64, by: String },\n    /// This VIEWER's bounded subscription queue overflowed and it was evicted\n    /// (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT). DISTINCT from a session-exit EOF: the\n    /// serving brain re-subscribes from the current ring floor (skip-to-live)\n    /// rather than tearing the attach down.\n    ViewerEvicted { session_id: u64 },\n    /// An idempotent effect is durably applied (or was deduped — `applied_now`\n    /// distinguishes). The exactly-once ack for a [`Brain::send_effect`] (B5).\n    Applied {\n        session_id: u64,\n        op_id: u64,\n        applied_now: bool,\n    },\n    /// The broker-owned net endpoint's status (a `net-status` reply, D4a).\n    NetStatus(NetStatusReply),\n    /// A net dial durably landed — fresh or deduped (D4a).\n    NetDialed(NetDialed),\n    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n    /// ([`Self::NetPresence`]), not this frame.\n    NetDialSubmitted,\n    /// A stream open durably landed — fresh or deduped (D4b).\n    NetStreamOpened(NetStreamOpened),\n    /// A journaled stream send durably landed — fresh or deduped (D4b).\n    NetSent(NetSent),\n    /// The broker's held-streams listing (D4b).\n    NetStreams(NetStreamsReply),\n    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\n    Sessions(SessionsReply),\n    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\n    PairJoined(PairJoinReply),\n    /// Phase 1 of the two-phase join met a seed-holder — its real address is held\n    /// under a session id, awaiting the code (REQ-JOIN-TWO-PHASE).\n    MetMember(MetMember),\n    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\n    NetStreamData {\n        stream_id: u64,\n        seq: u64,\n        bytes: Vec<u8>,\n    },\n    /// A stream's read side finished cleanly; `next_seq` is the completeness\n    /// check (the subscriber's cursor must equal it to have missed nothing).\n    NetStreamEof { stream_id: u64, next_seq: u64 },\n    /// A contiguous conn-liveness event (the presence cursor has advanced past\n    /// it) — connected/disconnected on the broker's conn table (D4c).\n    NetPresence(NetPresenceEvent),\n    /// The broker reported a command error.\n    Error { message: String },\n    /// A frame of an unrecognized kind (forward-compat: tolerated, surfaced).\n    Other(Envelope),\n}\n\n/// The outcome of the two-phase join's MEET phase ([`Brain::pair_meet`],\n/// REQ-JOIN-TWO-PHASE): a member was found (its real address is held under the\n/// session id), or the meet failed before any code was needed (rendered for the\n/// operator without ever prompting for a code).\n#[derive(Debug, Clone)]\npub enum MetOutcome {\n    /// A seed-holder was met — proceed to collect the code and submit it.\n    Met(MetMember),\n    /// The meet failed (no member, unknown subnet, …) — a classified\n    /// `pair-joined` failure surfaced before the code prompt.\n    Failed(PairJoinReply),\n}\n\n/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n/// **split** carrier for the peer pump.\n///\n/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\n/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\n/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\n/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n/// channel supplies the deadline. On a timeout the pump bubbles out to a\n/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n/// old conn's drop eventually errors its read and the thread exits).\nenum BrainConn {\n    /// The ordinary blocking carrier — every non-pump brain.\n    Whole(Stream),\n    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n    Split {\n        send: SendHalf,\n        frames: Receiver<io::Result<Envelope>>,\n        /// The reader-thread handle — held so the thread is owned, not detached\n        /// silently. On a supervised restart the whole [`Brain`] drops; this\n        /// handle drops with it (the thread, blocked in `read_frame`, is\n        /// abandoned and exits when the old conn closes — KH 7.6).\n        _reader: JoinHandle<()>,\n    },\n}\n\nimpl BrainConn {\n    /// Split a connected+handshaked stream into the pump carrier: spawn the\n    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n    /// reader is diagnosable in the field (KH 7.6).\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    fn split_with_reader(stream: Stream) -> BrainConn {\n        let (mut recv, send) = stream.split();\n        let (tx, frames) = mpsc::channel();\n        let reader = thread::Builder::new()\n            .name(\"pump-ipc-reader\".to_string())\n            .spawn(move || {\n                eprintln!(\"PUMP_IPC_READER: spawned\");\n                loop {\n                    let framed = read_frame(&mut recv);\n                    let was_err = framed.is_err();\n                    // Receiver gone (Brain dropped) → stop reading.\n                    if tx.send(framed).is_err() {\n                        break;\n                    }\n                    // A transport error (conn closed / hung up) is terminal —\n                    // forward it once (above), then exit so the thread never\n                    // spins on a dead half.\n                    if was_err {\n                        break;\n                    }\n                }\n                eprintln!(\"PUMP_IPC_READER: exited\");\n            })\n            .expect(\"spawn pump-ipc-reader thread\");\n        BrainConn::Split {\n            send,\n            frames,\n            _reader: reader,\n        }\n    }\n}\n\n/// A live brain attached to a broker.\npub struct Brain {\n    conn: BrainConn,\n    generation: u64,\n    gen_start_ms: u64,\n    session_id: Option<u64>,\n    /// The next output sequence still needed (resume cursor / dedup floor).\n    next_seq: u64,\n    /// Per-net-stream resume cursors (D4b) — the stream-read siblings of\n    /// `next_seq`, set by [`Brain::net_stream_subscribe`] and advanced by\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\n    /// Durability across a handoff is the logic layer's job (a re-attaching\n    /// brain queries `net-streams` and re-subscribes from its durable cursors).\n    net_cursors: std::collections::HashMap<u64, u64>,\n    /// The presence resume cursor (D4c) — the conn-liveness sibling of\n    /// `net_cursors`, set by [`Brain::net_presence_subscribe`] and advanced by\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\n    /// `None` until subscribed (or the first event arrives).\n    presence_cursor: Option<u64>,\n    /// Per-session **resume** output cursors (restoration D4-2): the multi-session\n    /// continuity state a cold-started brain rebuilds from the broker via\n…\n}\n\n[Showing lines 1-300 of 2370. Use :301 to continue]"}],"details":{"truncation":{"content":"//! The brain (B2) — the restartable logic half that attaches to the broker.\r\n//!\r\n//! The brain holds all the volatile logic; it may be killed and restarted at\r\n//! any moment (a routine self-update swaps it; a crash kills it). It connects to\r\n//! the stable [`crate::broker::Broker`] over the versioned IPC, drives sessions\r\n//! (spawn / input / resize / kill), and consumes their output. Two invariants\r\n//! this type encodes:\r\n//!\r\n//! - **`gen_start = now()` on cold-start *and* handoff (KNOWN-HAZARDS 2.4).**\r\n//!   The wall-clock generation stamp is taken fresh on every start. A handed-off\r\n//!   brain rehydrates its resume cursor and generation *counter* from prior\r\n//!   state, but its `gen_start` is `now()`, **never** the stale value from that\r\n//!   state — a rehydrated `gen_start` would fire time-based discriminators on\r\n//!   the new generation. [`Brain::handoff`] takes the prior state by value yet\r\n//!   ignores its `gen_start_ms`.\r\n//! - **Gapless, exactly-once resume.** The brain tracks `next_seq` — the next\r\n//!   output sequence it still needs. On handoff it `subscribe`s from that cursor;\r\n//!   the broker replays buffered output from there. [`Brain::read_event`] accepts\r\n//!   only the contiguous next `seq` (advancing the cursor), silently drops an\r\n//!   already-seen `seq` (a replay duplicate), and treats a forward gap as a hard\r\n//!   error — so a lost chunk can never pass silently.\r\n// [impl->REQ-HAZARD-GEN-START-NOW]\r\n// [impl->REQ-DAEMON-2]\r\n\r\nuse std::io;\r\nuse std::sync::mpsc::{self, Receiver, RecvTimeoutError};\r\nuse std::thread::{self, JoinHandle};\r\nuse std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\r\n\r\nuse interprocess::local_socket::prelude::*;\r\n\r\nuse interprocess::local_socket::{SendHalf, Stream};\r\n\r\nuse crate::codec::{read_frame, write_frame};\r\nuse crate::frame::{Envelope, Role};\r\nuse crate::effect::MintedOp;\r\nuse crate::msg::{\r\n    decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,\r\n    EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,\r\n    InputReq,\r\n    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\r\n    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\r\n    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\r\n    SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,\r\n    SubscribeReq, SubscribedReply, ViewerEvictedEvent,\r\n    KIND_ADAPTER_APPLY, KIND_APPLIED, KIND_BRAIN_RESTART, KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY, KIND_VIEWER_EVICTED,\r\n    KIND_BRAIN_RESTARTED, KIND_DISPLACED, KIND_ENDPOINT_INJECTED, KIND_ENDPOINT_INPUT, KIND_ERROR, KIND_EXIT, KIND_INPUT, KIND_KILL, KIND_NET_DIAL,\r\n    KIND_NET_DIALED, KIND_NET_DIAL_LOOPBACK, KIND_NET_DIAL_SUBMIT, KIND_NET_DIAL_SUBMITTED,\r\n    KIND_NET_PRESENCE_EVENT, KIND_NET_PRESENCE_SUBSCRIBE,\r\n    KIND_NET_SENT,\r\n    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\r\n    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\r\n    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\r\n    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\r\n    KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,\r\n    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\r\n    KIND_SPAWN_CONFLICT, KIND_SPAWN_FRESH,\r\n    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\r\n};\r\nuse spt_net::net::attach::AttachIntent;\r\nuse crate::transport::{send_hello, LocalSocketTransport};\r\n\r\n/// Wall-clock now in epoch milliseconds — the source for `gen_start` (matches\r\n/// the epoch-ms stamping used elsewhere in the tree; no date dependency).\r\npub fn now_ms() -> u64 {\r\n    SystemTime::now()\r\n        .duration_since(UNIX_EPOCH)\r\n        .map(|d| d.as_millis() as u64)\r\n        .unwrap_or(0)\r\n}\r\n\r\n/// The brain's durable state across a handoff: enough to re-attach gaplessly and\r\n/// advance the generation. `gen_start_ms` is recorded for observability but is\r\n/// **deliberately not authoritative on restart** — [`Brain::handoff`] sets a\r\n/// fresh `gen_start` from `now()` (2.4).\r\n///\r\n/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain→brain\r\n/// frame is **retired from the production path**: a brain the broker's supervisor\r\n/// respawns reconstructs continuity by querying the broker\r\n/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this\r\n/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`\r\n/// solely because the integration tests (separate test target — `#[cfg(test)]`\r\n/// would hide them) still drive the handoff-frame shape directly; there is **no\r\n/// non-test caller** (KNOWN-HAZARDS 2.4 grep-clean close-out).\r\n#[derive(Debug, Clone)]\r\npub struct BrainState {\r\n    /// The session the brain was driving.\r\n    pub session_id: u64,\r\n    /// The generation counter (incremented on each handoff).\r\n    pub generation: u64,\r\n    /// The next output sequence still needed (the resume cursor).\r\n    pub next_seq: u64,\r\n    /// The prior generation's wall-clock start (ignored as authoritative on\r\n    /// handoff — kept only to demonstrate it is *not* carried forward).\r\n    pub gen_start_ms: u64,\r\n}\r\n\r\n/// The outcome of a FRESH/RejectExisting spawn (ADR-0041 decision 5): either a\r\n/// real fresh session was created, or the endpoint's EXISTING live session is\r\n/// named in a typed, side-effect-free conflict.\r\n// [impl->REQ-SPAWN-FRESH-TRUTHFUL]\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub enum FreshSpawn {\r\n    /// A fresh session exists — the create contract's success.\r\n    Created { session_id: u64, pid: Option<u32> },\r\n    /// A live session already exists; nothing was created or mutated.\r\n    Conflict { existing_session: u64 },\r\n}\r\n\r\n/// A demuxed broker→brain event.\r\n#[derive(Debug)]\r\npub enum BrokerEvent {\r\n    /// A contiguous chunk of a session's output (the cursor has advanced past it).\r\n    Output {\r\n        session_id: u64,\r\n        seq: u64,\r\n        bytes: Vec<u8>,\r\n    },\r\n    /// A spawn succeeded.\r\n    Spawned { session_id: u64, pid: Option<u32> },\r\n    /// A FRESH spawn was refused typed (ADR-0041 decision 5): the endpoint\r\n    /// already holds a live session — nothing was created or mutated.\r\n    SpawnConflict { endpoint: String, session_id: u64 },\r\n    /// A session's child exited.\r\n    Exit { session_id: u64, code: Option<i32> },\r\n    /// The resolved controller/viewer role of a [`Brain::attach_as`] subscribe\r\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). The serving brain wakes (controller-only),\r\n    /// stays wake-neutral (viewer), or refuses the operator (busy).\r\n    Subscribed {\r\n        session_id: u64,\r\n        outcome: SubscribeOutcome,\r\n    },\r\n    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\r\n    /// REQ-RCVIEW-1).\r\n    Size {\r\n        session_id: u64,\r\n        rows: u16,\r\n        cols: u16,\r\n    },\r\n    /// This controller was DISPLACED by a different operator's `--take`/`kick`\r\n    /// (REQ-KICK-1). The serving brain forwards a loud notice and detaches.\r\n    Displaced { session_id: u64, by: String },\r\n    /// This VIEWER's bounded subscription queue overflowed and it was evicted\r\n    /// (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT). DISTINCT from a session-exit EOF: the\r\n    /// serving brain re-subscribes from the current ring floor (skip-to-live)\r\n    /// rather than tearing the attach down.\r\n    ViewerEvicted { session_id: u64 },\r\n    /// An idempotent effect is durably applied (or was deduped — `applied_now`\r\n    /// distinguishes). The exactly-once ack for a [`Brain::send_effect`] (B5).\r\n    Applied {\r\n        session_id: u64,\r\n        op_id: u64,\r\n        applied_now: bool,\r\n    },\r\n    /// The broker-owned net endpoint's status (a `net-status` reply, D4a).\r\n    NetStatus(NetStatusReply),\r\n    /// A net dial durably landed — fresh or deduped (D4a).\r\n    NetDialed(NetDialed),\r\n    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\r\n    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\r\n    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\r\n    /// ([`Self::NetPresence`]), not this frame.\r\n    NetDialSubmitted,\r\n    /// A stream open durably landed — fresh or deduped (D4b).\r\n    NetStreamOpened(NetStreamOpened),\r\n    /// A journaled stream send durably landed — fresh or deduped (D4b).\r\n    NetSent(NetSent),\r\n    /// The broker's held-streams listing (D4b).\r\n    NetStreams(NetStreamsReply),\r\n    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\r\n    Sessions(SessionsReply),\r\n    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\r\n    PairJoined(PairJoinReply),\r\n    /// Phase 1 of the two-phase join met a seed-holder — its real address is held\r\n    /// under a session id, awaiting the code (REQ-JOIN-TWO-PHASE).\r\n    MetMember(MetMember),\r\n    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\r\n    NetStreamData {\r\n        stream_id: u64,\r\n        seq: u64,\r\n        bytes: Vec<u8>,\r\n    },\r\n    /// A stream's read side finished cleanly; `next_seq` is the completeness\r\n    /// check (the subscriber's cursor must equal it to have missed nothing).\r\n    NetStreamEof { stream_id: u64, next_seq: u64 },\r\n    /// A contiguous conn-liveness event (the presence cursor has advanced past\r\n    /// it) — connected/disconnected on the broker's conn table (D4c).\r\n    NetPresence(NetPresenceEvent),\r\n    /// The broker reported a command error.\r\n    Error { message: String },\r\n    /// A frame of an unrecognized kind (forward-compat: tolerated, surfaced).\r\n    Other(Envelope),\r\n}\r\n\r\n/// The outcome of the two-phase join's MEET phase ([`Brain::pair_meet`],\r\n/// REQ-JOIN-TWO-PHASE): a member was found (its real address is held under the\r\n/// session id), or the meet failed before any code was needed (rendered for the\r\n/// operator without ever prompting for a code).\r\n#[derive(Debug, Clone)]\r\npub enum MetOutcome {\r\n    /// A seed-holder was met — proceed to collect the code and submit it.\r\n    Met(MetMember),\r\n    /// The meet failed (no member, unknown subnet, …) — a classified\r\n    /// `pair-joined` failure surfaced before the code prompt.\r\n    Failed(PairJoinReply),\r\n}\r\n\r\n/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\r\n/// non-pump client: blocking, unbounded reads, correct everywhere) or a\r\n/// **split** carrier for the peer pump.\r\n///\r\n/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\r\n/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\r\n/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\r\n/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\r\n/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\r\n/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\r\n/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\r\n/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\r\n/// framed result down a channel; the main thread writes on the [`SendHalf`] and\r\n/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\r\n/// channel supplies the deadline. On a timeout the pump bubbles out to a\r\n/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\r\n/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\r\n/// old conn's drop eventually errors its read and the thread exits).\r\nenum BrainConn {\r\n    /// The ordinary blocking carrier — every non-pump brain.\r\n    Whole(Stream),\r\n    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\r\n    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\r\n    Split {\r\n        send: SendHalf,\r\n        frames: Receiver<io::Result<Envelope>>,\r\n        /// The reader-thread handle — held so the thread is owned, not detached\r\n        /// silently. On a supervised restart the whole [`Brain`] drops; this\r\n        /// handle drops with it (the thread, blocked in `read_frame`, is\r\n        /// abandoned and exits when the old conn closes — KH 7.6).\r\n        _reader: JoinHandle<()>,\r\n    },\r\n}\r\n\r\nimpl BrainConn {\r\n    /// Split a connected+handshaked stream into the pump carrier: spawn the\r\n    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\r\n    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\r\n    /// reader is diagnosable in the field (KH 7.6).\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    fn split_with_reader(stream: Stream) -> BrainConn {\r\n        let (mut recv, send) = stream.split();\r\n        let (tx, frames) = mpsc::channel();\r\n        let reader = thread::Builder::new()\r\n            .name(\"pump-ipc-reader\".to_string())\r\n            .spawn(move || {\r\n                eprintln!(\"PUMP_IPC_READER: spawned\");\r\n                loop {\r\n                    let framed = read_frame(&mut recv);\r\n                    let was_err = framed.is_err();\r\n                    // Receiver gone (Brain dropped) → stop reading.\r\n                    if tx.send(framed).is_err() {\r\n                        break;\r\n                    }\r\n                    // A transport error (conn closed / hung up) is terminal —\r\n                    // forward it once (above), then exit so the thread never\r\n                    // spins on a dead half.\r\n                    if was_err {\r\n                        break;\r\n                    }\r\n                }\r\n                eprintln!(\"PUMP_IPC_READER: exited\");\r\n            })\r\n            .expect(\"spawn pump-ipc-reader thread\");\r\n        BrainConn::Split {\r\n            send,\r\n            frames,\r\n            _reader: reader,\r\n        }\r\n    }\r\n}\r\n\r\n/// A live brain attached to a broker.\r\npub struct Brain {\r\n    conn: BrainConn,\r\n    generation: u64,\r\n    gen_start_ms: u64,\r\n    session_id: Option<u64>,\r\n    /// The next output sequence still needed (resume cursor / dedup floor).\r\n    next_seq: u64,\r\n    /// Per-net-stream resume cursors (D4b) — the stream-read siblings of\r\n    /// `next_seq`, set by [`Brain::net_stream_subscribe`] and advanced by\r\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\r\n    /// Durability across a handoff is the logic layer's job (a re-attaching\r\n    /// brain queries `net-streams` and re-subscribes from its durable cursors).\r\n    net_cursors: std::collections::HashMap<u64, u64>,\r\n    /// The presence resume cursor (D4c) — the conn-liveness sibling of\r\n    /// `net_cursors`, set by [`Brain::net_presence_subscribe`] and advanced by\r\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\r\n    /// `None` until subscribed (or the first event arrives).\r\n    presence_cursor: Option<u64>,\r\n    /// Per-session **resume** output cursors (restoration D4-2): the multi-session\r\n    /// continuity state a cold-started brain rebuilds from the broker via\r","truncated":true,"truncatedBy":"lines","totalLines":2370,"totalBytes":15584,"outputLines":300,"outputBytes":15584,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! The brain (B2) — the restartable logic half that attaches to the broker.\r\n//!\r\n//! The brain holds all the volatile logic; it may be killed and restarted at\r\n//! any moment (a routine self-update swaps it; a crash kills it). It connects to\r\n//! the stable [`crate::broker::Broker`] over the versioned IPC, drives sessions\r\n//! (spawn / input / resize / kill), and consumes their output. Two invariants\r\n//! this type encodes:\r\n//!\r\n//! - **`gen_start = now()` on cold-start *and* handoff (KNOWN-HAZARDS 2.4).**\r\n//!   The wall-clock generation stamp is taken fresh on every start. A handed-off\r\n//!   brain rehydrates its resume cursor and generation *counter* from prior\r\n//!   state, but its `gen_start` is `now()`, **never** the stale value from that\r\n//!   state — a rehydrated `gen_start` would fire time-based discriminators on\r\n//!   the new generation. [`Brain::handoff`] takes the prior state by value yet\r\n//!   ignores its `gen_start_ms`.\r\n//! - **Gapless, exactly-once resume.** The brain tracks `next_seq` — the next\r\n//!   output sequence it still needs. On handoff it `subscribe`s from that cursor;\r\n//!   the broker replays buffered output from there. [`Brain::read_event`] accepts\r\n//!   only the contiguous next `seq` (advancing the cursor), silently drops an\r\n//!   already-seen `seq` (a replay duplicate), and treats a forward gap as a hard\r\n//!   error — so a lost chunk can never pass silently.\r\n// [impl->REQ-HAZARD-GEN-START-NOW]\r\n// [impl->REQ-DAEMON-2]\r\n\r\nuse std::io;\r\nuse std::sync::mpsc::{self, Receiver, RecvTimeoutError};\r\nuse std::thread::{self, JoinHandle};\r\nuse std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};\r\n\r\nuse interprocess::local_socket::prelude::*;\r\n\r\nuse interprocess::local_socket::{SendHalf, Stream};\r\n\r\nuse crate::codec::{read_frame, write_frame};\r\nuse crate::frame::{Envelope, Role};\r\nuse crate::effect::MintedOp;\r\nuse crate::msg::{\r\n    decode_bytes, encode_bytes, AdapterApplyReq, AppliedEvent, BrainRestarted, BrokerImageReply, StallEvictsReply, DisplacedEvent,\r\n    EndpointInjected, EndpointInputReq, ErrorEvent, ExitEvent,\r\n    InputReq,\r\n    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\r\n    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\r\n    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\r\n    SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,\r\n    SubscribeReq, SubscribedReply, ViewerEvictedEvent,\r\n    KIND_ADAPTER_APPLY, KIND_APPLIED, KIND_BRAIN_RESTART, KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY, KIND_VIEWER_EVICTED,\r\n    KIND_BRAIN_RESTARTED, KIND_DISPLACED, KIND_ENDPOINT_INJECTED, KIND_ENDPOINT_INPUT, KIND_ERROR, KIND_EXIT, KIND_INPUT, KIND_KILL, KIND_NET_DIAL,\r\n    KIND_NET_DIALED, KIND_NET_DIAL_LOOPBACK, KIND_NET_DIAL_SUBMIT, KIND_NET_DIAL_SUBMITTED,\r\n    KIND_NET_PRESENCE_EVENT, KIND_NET_PRESENCE_SUBSCRIBE,\r\n    KIND_NET_SENT,\r\n    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\r\n    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\r\n    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\r\n    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\r\n    KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,\r\n    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\r\n    KIND_SPAWN_CONFLICT, KIND_SPAWN_FRESH,\r\n    KIND_SUBSCRIBE, KIND_SUBSCRIBED, KIND_UNSUBSCRIBE, UnsubscribeReq,\r\n};\r\nuse spt_net::net::attach::AttachIntent;\r\nuse crate::transport::{send_hello, LocalSocketTransport};\r\n\r\n/// Wall-clock now in epoch milliseconds — the source for `gen_start` (matches\r\n/// the epoch-ms stamping used elsewhere in the tree; no date dependency).\r\npub fn now_ms() -> u64 {\r\n    SystemTime::now()\r\n        .duration_since(UNIX_EPOCH)\r\n        .map(|d| d.as_millis() as u64)\r\n        .unwrap_or(0)\r\n}\r\n\r\n/// The brain's durable state across a handoff: enough to re-attach gaplessly and\r\n/// advance the generation. `gen_start_ms` is recorded for observability but is\r\n/// **deliberately not authoritative on restart** — [`Brain::handoff`] sets a\r\n/// fresh `gen_start` from `now()` (2.4).\r\n///\r\n/// **Test-only continuity (restoration D4-3, ADR-0018 Q6).** This brain→brain\r\n/// frame is **retired from the production path**: a brain the broker's supervisor\r\n/// respawns reconstructs continuity by querying the broker\r\n/// ([`Brain::resume_sessions`] over the broker's cursor-of-record), never this\r\n/// message. `BrainState` / [`Brain::handoff`] / [`Brain::snapshot`] stay `pub`\r\n/// solely because the integration tests (separate test target — `#[cfg(test)]`\r\n/// would hide them) still drive the handoff-frame shape directly; there is **no\r\n/// non-test caller** (KNOWN-HAZARDS 2.4 grep-clean close-out).\r\n#[derive(Debug, Clone)]\r\npub struct BrainState {\r\n    /// The session the brain was driving.\r\n    pub session_id: u64,\r\n    /// The generation counter (incremented on each handoff).\r\n    pub generation: u64,\r\n    /// The next output sequence still needed (the resume cursor).\r\n    pub next_seq: u64,\r\n    /// The prior generation's wall-clock start (ignored as authoritative on\r\n    /// handoff — kept only to demonstrate it is *not* carried forward).\r\n    pub gen_start_ms: u64,\r\n}\r\n\r\n/// The outcome of a FRESH/RejectExisting spawn (ADR-0041 decision 5): either a\r\n/// real fresh session was created, or the endpoint's EXISTING live session is\r\n/// named in a typed, side-effect-free conflict.\r\n// [impl->REQ-SPAWN-FRESH-TRUTHFUL]\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub enum FreshSpawn {\r\n    /// A fresh session exists — the create contract's success.\r\n    Created { session_id: u64, pid: Option<u32> },\r\n    /// A live session already exists; nothing was created or mutated.\r\n    Conflict { existing_session: u64 },\r\n}\r\n\r\n/// A demuxed broker→brain event.\r\n#[derive(Debug)]\r\npub enum BrokerEvent {\r\n    /// A contiguous chunk of a session's output (the cursor has advanced past it).\r\n    Output {\r\n        session_id: u64,\r\n        seq: u64,\r\n        bytes: Vec<u8>,\r\n    },\r\n    /// A spawn succeeded.\r\n    Spawned { session_id: u64, pid: Option<u32> },\r\n    /// A FRESH spawn was refused typed (ADR-0041 decision 5): the endpoint\r\n    /// already holds a live session — nothing was created or mutated.\r\n    SpawnConflict { endpoint: String, session_id: u64 },\r\n    /// A session's child exited.\r\n    Exit { session_id: u64, code: Option<i32> },\r\n    /// The resolved controller/viewer role of a [`Brain::attach_as`] subscribe\r\n    /// (REQ-RCVIEW-1 / REQ-KICK-1). The serving brain wakes (controller-only),\r\n    /// stays wake-neutral (viewer), or refuses the operator (busy).\r\n    Subscribed {\r\n        session_id: u64,\r\n        outcome: SubscribeOutcome,\r\n    },\r\n    /// The current PTY size of a session, pushed to a VIEWER (the letterbox feed,\r\n    /// REQ-RCVIEW-1).\r\n    Size {\r\n        session_id: u64,\r\n        rows: u16,\r\n        cols: u16,\r\n    },\r\n    /// This controller was DISPLACED by a different operator's `--take`/`kick`\r\n    /// (REQ-KICK-1). The serving brain forwards a loud notice and detaches.\r\n    Displaced { session_id: u64, by: String },\r\n    /// This VIEWER's bounded subscription queue overflowed and it was evicted\r\n    /// (REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT). DISTINCT from a session-exit EOF: the\r\n    /// serving brain re-subscribes from the current ring floor (skip-to-live)\r\n    /// rather than tearing the attach down.\r\n    ViewerEvicted { session_id: u64 },\r\n    /// An idempotent effect is durably applied (or was deduped — `applied_now`\r\n    /// distinguishes). The exactly-once ack for a [`Brain::send_effect`] (B5).\r\n    Applied {\r\n        session_id: u64,\r\n        op_id: u64,\r\n        applied_now: bool,\r\n    },\r\n    /// The broker-owned net endpoint's status (a `net-status` reply, D4a).\r\n    NetStatus(NetStatusReply),\r\n    /// A net dial durably landed — fresh or deduped (D4a).\r\n    NetDialed(NetDialed),\r\n    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\r\n    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\r\n    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\r\n    /// ([`Self::NetPresence`]), not this frame.\r\n    NetDialSubmitted,\r\n    /// A stream open durably landed — fresh or deduped (D4b).\r\n    NetStreamOpened(NetStreamOpened),\r\n    /// A journaled stream send durably landed — fresh or deduped (D4b).\r\n    NetSent(NetSent),\r\n    /// The broker's held-streams listing (D4b).\r\n    NetStreams(NetStreamsReply),\r\n    /// The broker's hosted-sessions listing (D9-1: session → endpoint).\r\n    Sessions(SessionsReply),\r\n    /// The subnet-join ceremony's verdict (a `pair-joined` reply, M7 D3).\r\n    PairJoined(PairJoinReply),\r\n    /// Phase 1 of the two-phase join met a seed-holder — its real address is held\r\n    /// under a session id, awaiting the code (REQ-JOIN-TWO-PHASE).\r\n    MetMember(MetMember),\r\n    /// A contiguous chunk of a stream's reads (the cursor has advanced past it).\r\n    NetStreamData {\r\n        stream_id: u64,\r\n        seq: u64,\r\n        bytes: Vec<u8>,\r\n    },\r\n    /// A stream's read side finished cleanly; `next_seq` is the completeness\r\n    /// check (the subscriber's cursor must equal it to have missed nothing).\r\n    NetStreamEof { stream_id: u64, next_seq: u64 },\r\n    /// A contiguous conn-liveness event (the presence cursor has advanced past\r\n    /// it) — connected/disconnected on the broker's conn table (D4c).\r\n    NetPresence(NetPresenceEvent),\r\n    /// The broker reported a command error.\r\n    Error { message: String },\r\n    /// A frame of an unrecognized kind (forward-compat: tolerated, surfaced).\r\n    Other(Envelope),\r\n}\r\n\r\n/// The outcome of the two-phase join's MEET phase ([`Brain::pair_meet`],\r\n/// REQ-JOIN-TWO-PHASE): a member was found (its real address is held under the\r\n/// session id), or the meet failed before any code was needed (rendered for the\r\n/// operator without ever prompting for a code).\r\n#[derive(Debug, Clone)]\r\npub enum MetOutcome {\r\n    /// A seed-holder was met — proceed to collect the code and submit it.\r\n    Met(MetMember),\r\n    /// The meet failed (no member, unknown subnet, …) — a classified\r\n    /// `pair-joined` failure surfaced before the code prompt.\r\n    Failed(PairJoinReply),\r\n}\r\n\r\n/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\r\n/// non-pump client: blocking, unbounded reads, correct everywhere) or a\r\n/// **split** carrier for the peer pump.\r\n///\r\n/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\r\n/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\r\n/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\r\n/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\r\n/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\r\n/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\r\n/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\r\n/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\r\n/// framed result down a channel; the main thread writes on the [`SendHalf`] and\r\n/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\r\n/// channel supplies the deadline. On a timeout the pump bubbles out to a\r\n/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\r\n/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\r\n/// old conn's drop eventually errors its read and the thread exits).\r\nenum BrainConn {\r\n    /// The ordinary blocking carrier — every non-pump brain.\r\n    Whole(Stream),\r\n    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\r\n    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\r\n    Split {\r\n        send: SendHalf,\r\n        frames: Receiver<io::Result<Envelope>>,\r\n        /// The reader-thread handle — held so the thread is owned, not detached\r\n        /// silently. On a supervised restart the whole [`Brain`] drops; this\r\n        /// handle drops with it (the thread, blocked in `read_frame`, is\r\n        /// abandoned and exits when the old conn closes — KH 7.6).\r\n        _reader: JoinHandle<()>,\r\n    },\r\n}\r\n\r\nimpl BrainConn {\r\n    /// Split a connected+handshaked stream into the pump carrier: spawn the\r\n    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\r\n    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\r\n    /// reader is diagnosable in the field (KH 7.6).\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    fn split_with_reader(stream: Stream) -> BrainConn {\r\n        let (mut recv, send) = stream.split();\r\n        let (tx, frames) = mpsc::channel();\r\n        let reader = thread::Builder::new()\r\n            .name(\"pump-ipc-reader\".to_string())\r\n            .spawn(move || {\r\n                eprintln!(\"PUMP_IPC_READER: spawned\");\r\n                loop {\r\n                    let framed = read_frame(&mut recv);\r\n                    let was_err = framed.is_err();\r\n                    // Receiver gone (Brain dropped) → stop reading.\r\n                    if tx.send(framed).is_err() {\r\n                        break;\r\n                    }\r\n                    // A transport error (conn closed / hung up) is terminal —\r\n                    // forward it once (above), then exit so the thread never\r\n                    // spins on a dead half.\r\n                    if was_err {\r\n                        break;\r\n                    }\r\n                }\r\n                eprintln!(\"PUMP_IPC_READER: exited\");\r\n            })\r\n            .expect(\"spawn pump-ipc-reader thread\");\r\n        BrainConn::Split {\r\n            send,\r\n            frames,\r\n            _reader: reader,\r\n        }\r\n    }\r\n}\r\n\r\n/// A live brain attached to a broker.\r\npub struct Brain {\r\n    conn: BrainConn,\r\n    generation: u64,\r\n    gen_start_ms: u64,\r\n    session_id: Option<u64>,\r\n    /// The next output sequence still needed (resume cursor / dedup floor).\r\n    next_seq: u64,\r\n    /// Per-net-stream resume cursors (D4b) — the stream-read siblings of\r\n    /// `next_seq`, set by [`Brain::net_stream_subscribe`] and advanced by\r\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\r\n    /// Durability across a handoff is the logic layer's job (a re-attaching\r\n    /// brain queries `net-streams` and re-subscribes from its durable cursors).\r\n    net_cursors: std::collections::HashMap<u64, u64>,\r\n    /// The presence resume cursor (D4c) — the conn-liveness sibling of\r\n    /// `net_cursors`, set by [`Brain::net_presence_subscribe`] and advanced by\r\n    /// [`Brain::read_event`] under the same accept/dedup/gap discipline.\r\n    /// `None` until subscribed (or the first event arrives).\r\n    presence_cursor: Option<u64>,\r\n    /// Per-session **resume** output cursors (restoration D4-2): the multi-session\r\n    /// continuity state a cold-started brain rebuilds from the broker via\r\n…\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,null,331]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2370,"totalBytes":15584,"outputLines":300,"outputBytes":15584,"shownRange":{"start":1,"end":300},"nextOffset":301}}},"isError":false,"timestamp":1784292920046}}
{"type":"message","id":"8b3c4f83","parentId":"767db17e","timestamp":"2026-07-17T12:55:20.068Z","message":{"role":"toolResult","toolCallId":"call_qPlkyUu0mKcEUXL0xaGVJWSi|fc_0148993141920bab016a5a2637e7cc8195b523c28183ee69c9","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## access.rs\n 4|//! order: subnet *visibility* (is the endpoint routable here at all? —\n*5|//! `spt_store::visibility`, applied inside registry resolution) → the\n 6|//! **endpoint access whitelist** (may *your node* remotely reach it? — THIS\n 7|//! module) → *capability grants* (may this agent do this high-risk thing? —\n 8|//! [`crate::consent`], default-deny). The whitelist is the outer gate before\n## adapter_update.rs\n 7|//! its manifest `[update]` block ([`Update`]); this module turns that directive\n*8|//! into a per-adapter [`AdapterUpdateOutcome`], dispatched by avenue:\n 9|//!\n 10|//! - **`file_pull`** — spt-core controls the bytes, so it *verifies* them: the\n 11|//!   pulled payload is checked against the adapter's **own** Ed25519 key (declared\n...\n 163|/// is complete here. Soft-deregistered adapters are excluded by\n*164|/// [`spt_runtime::registry::registered`].\n 165|// [impl->REQ-INSTALL-4]\n 166|pub fn ripple_registered(adapters_dir: &std::path::Path) -> Vec<(String, AdapterUpdateOutcome)> {\n*167|    let mut set = spt_runtime::registry::registered(adapters_dir);\n 168|    set.sort_by_key(|(r, _)| r.registered_at_ms);\n 169|    set.iter()\n 170|        .map(|(r, m)| {\n...\n 408|        // Register out of name order to prove registration-time ordering.\n*409|        spt_runtime::registry::register(&adapters_dir, &updatable, 100).unwrap();\n*410|        spt_runtime::registry::register(&adapters_dir, &plain, 200).unwrap();\n*411|        spt_runtime::registry::register(&adapters_dir, &gone, 300).unwrap();\n*412|        spt_runtime::registry::deregister(&adapters_dir, \"gone\").unwrap();\n 413|\n 414|        let out = ripple_registered(&adapters_dir);\n 415|        assert_eq!(\n## applyhost.rs\n 11|//!\n*12|//! [`apply_staged`] drives the whole chain against what the peer pump left\n 13|//! behind (REQ-UPD-4: staged + consent-notified, never auto-applied):\n 14|//!\n 15|//! 1. **Re-verify at rest** (`plan_verified` under the production\n...\n 167|    // disk. Fail-closed on an unprovisioned key file (same posture as the\n*168|    // pump's pull leg).\n 169|    let policy = VerifyPolicy::load_from(release_keys, 0, now_ms());\n 170|    if policy.trusted_keys.is_empty() {\n 171|        return Ok(Prepared::Done(ApplyStagedOutcome::Rejected(\n...\n 352|/// Cycle the brain of a RUNNING daemon with NO binary swap and NO staging\n*353|/// preconditions (REQ-DAEMON-REFRESH, `spt daemon refresh`): connect to the\n 354|/// broker and raise the same supervisor brain-restart signal the post-swap\n 355|/// apply rides ([`Brain::request_brain_restart`], ADR-0018 D3-3) — brain stop →\n 356|/// respawn → readiness trial → promote, broker + every hosted PTY untouched by\n...\n 362|/// (accepted, not acted on).\n*363|// [impl->REQ-DAEMON-REFRESH]\n*364|pub fn refresh_brain(broker_name: &str) -> Result<bool, String> {\n 365|    let mut brain = connect_retry(broker_name).map_err(|e| format!(\"broker connect: {e}\"))?;\n 366|    brain\n 367|        .request_brain_restart()\n...\n 461|        }\n*462|        std::thread::sleep(Duration::from_millis(10));\n 463|    }\n 464|    Err(last)\n 465|}\n...\n 560|            }\n*561|            std::thread::sleep(Duration::from_millis(10));\n 562|        }\n 563|        panic!(\"brain cold-start could not connect\");\n 564|    }\n...\n 567|    // COMPILED image version over IPC: a Brain connected to a live broker gets back\n*568|    // Some(the broker's own CARGO_PKG_VERSION) — the KIND_BROKER_IMAGE dispatch +\n 569|    // reply round-trip end to end (the new-broker leg; the old-broker→None leg rides\n 570|    // the router's `unknown command kind` default, caught client-side as None).\n 571|    #[test]\n...\n 760|        //    registered platform that is not this host — derived from the\n*761|        //    SUPPORTED_PLATFORMS registry (not a hardcoded win/linux pair), so a\n 762|        //    third platform (musl) is covered with no edit here.\n 763|        let other = crate::release::SUPPORTED_PLATFORMS\n 764|            .iter()\n...\n 766|            .find(|&t| t != current_platform())\n*767|            .expect(\"registry must have a platform other than the current host\");\n 768|        cache\n 769|            .stage_single_with_platform(&signed, b\"CROSS-OS BYTES\", other)\n 770|            .unwrap();\n...\n 822|\n*823|    // [unit->REQ-DAEMON-REFRESH] `refresh_brain` routes the SAME supervisor\n 824|    // brain-cycle signal as the post-swap apply — against a bare broker with NO\n 825|    // staged release, NO release cache, NO binary swap. The verb has no staging\n 826|    // preconditions: the signal raises and `honored` reports the supervisor\n...\n 828|    #[test]\n*829|    fn refresh_brain_cycles_without_staging_or_swap_preconditions() {\n 830|        let name = unique_name();\n 831|        let broker = served_broker(&name);\n 832|\n*833|        // No supervisor wired: the refresh round-trips and reports not-honored.\n 834|        assert!(\n*835|            !refresh_brain(&name).expect(\"refresh round-trips on a bare broker\"),\n 836|            \"no supervisor wired must report honored=false\"\n 837|        );\n 838|\n*839|        // Supervisor wired: refresh raises the same planned-restart signal the\n 840|        // apply path rides — with nothing staged anywhere.\n 841|        let signal = Arc::new(crate::brainproc::BrainRestart::new());\n 842|        assert!(broker.set_brain_restart(Arc::clone(&signal)), \"first wire wins\");\n 843|        assert!(\n*844|            refresh_brain(&name).expect(\"refresh round-trips\"),\n 845|            \"a wired supervisor must report honored=true\"\n 846|        );\n 847|        assert!(\n 848|            signal.take(),\n*849|            \"refresh must raise the planned-restart signal the supervisor consumes\"\n 850|        );\n 851|    }\n 852|\n## attach.rs\n 4|//! The operator's daemon opened a bidi QUIC stream to this node (D4) and sent\n*5|//! [`AttachRecord::Request`]; this module is the target-side pump between that\n 6|//! stream and the local broker-hosted session:\n 7|//!\n 8|//! - session `Output` chunks → [`AttachRecord::Output`] lines onto the wire\n...\n 18|//! journaled [`Brain::net_stream_send`] blocks reading events until its ack\n*19|//! and *discards* everything interleaved — inside a full-duplex pump loop that\n 20|//! eats the operator's `Input` records (both sides starve; found the hard way\n 21|//! in `tests/attach.rs`). Idempotency holds without it because each direction\n 22|//! dedups at its **effect**: the PTY write is journaled by the operator-minted\n...\n 99|/// each re-subscribe; without spacing that is an evict→resubscribe CPU spin. With\n*100|/// it, the operator sees an intermittent LIVE burst each interval (forward\n 101|/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.\n*102|const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);\n 103|\n 104|/// The CONTROLLER fell behind the live ring further than the ring holds — the\n 105|/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an\n...\n 206|/// `session_id` it could not have. `None` ⇒ no live session under that endpoint\n*207|/// (a stale registry row routed us an attach for something gone → the caller\n 208|/// refuses cleanly, D6).\n 209|// [impl->REQ-RC-CROSS-NODE-ATTACH]\n 210|pub(crate) fn resolve_local_session(brain: &mut Brain, endpoint: &str) -> Option<u64> {\n...\n 220|/// One attach `Request` — the SINGLE handling path for both a wire-arriving\n*221|/// record and the dispatcher's durable-opener seed (ADR-0038 B; one\n 222|/// implementation so the two entries cannot drift):\n 223|///\n 224|/// - Unsolicited-inbound gate (ADR-0009) under the transport-proven origin;\n...\n 226|///   denial finishes our send side and ends the serve (`Some(Refused)`).\n*227|/// - Cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH): the dispatcher-resolved\n 228|///   session id wins (the owning node is authoritative for its own table);\n 229|///   the LOCAL path uses the wire `session_id` unchanged.\n 230|/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /\n...\n 279|/// the replayed `Request`/`Input` records re-gate and dedup at the PTY\n*280|/// journal, and re-pumped output dedups at the operator's render cursor).\n 281|///\n 282|/// `remote_session` is `Some(sid)` ONLY on the cross-node leg (#4,\n*283|/// REQ-RC-CROSS-NODE-ATTACH): the dispatcher has ALREADY resolved endpoint→our\n 284|/// session id ([`resolve_local_session`]) BEFORE this serve loop subscribed, so\n 285|/// the wire's placeholder `session_id` (0) is overridden here with the resolved\n 286|/// id. It is passed down — never re-queried mid-loop — because a `sessions()`\n...\n 293|/// record — a reconstruction that waited for one would idle forever. The\n*294|/// dispatcher hands the durable opener here and it is handled EXACTLY like a\n 295|/// wire-arriving Request (same gate, same subscribe); a Request that then\n 296|/// replays from the ring anyway re-runs the same-identity re-take, which is\n 297|/// silent and idempotent (the successor-re-take parity the fix must keep).\n...\n 359|\n*360|    // Durable-opener seed (ADR-0038 B): process the dispatcher-pinned Request\n 361|    // BEFORE the event loop, through the exact wire-Request path — a rolled\n 362|    // ring can no longer replay it. Non-Request seeds are ignored (the opener\n 363|    // of an attach stream is always its Request).\n...\n 442|                            intent: req_intent,\n*443|                            // The dispatcher already resolved endpoint_id→session\n 444|                            // (passed as remote_session) BEFORE this loop; ignore\n 445|                            // the wire copy here (a mid-loop re-resolve would swallow\n 446|                            // interleaved attach records — see remote_session docs).\n...\n 561|            // the attach down: DISTINCT from a session-exit EOF. Rate-limited\n*562|            // (RESUBSCRIBE_INTERVAL) so a hopelessly-behind viewer under sustained\n 563|            // flood sees intermittent LIVE bursts, never an evict→resubscribe CPU\n 564|            // spin. The next live Output carries a forward seq jump; the operator's\n 565|            // render cursor snaps to it (tail -f reconnect). VIEWER-only → B2-safe.\n...\n 571|                    let since = prev.elapsed();\n*572|                    if since < RESUBSCRIBE_INTERVAL {\n*573|                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n 574|                    }\n 575|                }\n 576|                brain.attach_skip_to_live(sid, Some(origin_node))?;\n## autostart.rs\n 14|//! restore-what-was-up was rejected): the adapter option re-resolves against\n*15|//! the live registry, the session id is freshly minted, and home rides the\n 16|//! endpoint's existing perch (durable — REQ-INST-15), so no `--subnet` is\n 17|//! recorded or needed.\n 18|\n...\n 49|        let (record, manifest) =\n*50|            match spt_runtime::registry::resolve_option(&adapters_dir, &entry.adapter) {\n 51|                Ok((r, m)) if m.adapter.kind == spt_runtime::manifest::AdapterKind::Harness => {\n 52|                    (r, m)\n 53|                }\n...\n 104|                    if attempt < LAUNCH_ATTEMPTS {\n*105|                        std::thread::sleep(LAUNCH_RETRY_DELAY);\n 106|                    }\n 107|                }\n 108|            }\n...\n 137|        });\n*138|        rx.recv_timeout(budget).expect(\n 139|            \"replay_startup_endpoints must return promptly on the pre-launch paths \\\n 140|             (empty list / unresolved adapter loud-skip), never hang the boot thread\",\n 141|        );\n## brain.rs\n 159|    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n*160|    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n 161|    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 162|    /// ([`Self::NetPresence`]), not this frame.\n 163|    NetDialSubmitted,\n...\n 208|/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n*209|/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n*210|/// **split** carrier for the peer pump.\n 211|///\n*212|/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\n 213|/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\n 214|/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\n 215|/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n*216|/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n 217|/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n*218|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 219|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 220|/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n*221|/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n*222|/// channel supplies the deadline. On a timeout the pump bubbles out to a\n 223|/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n 224|/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n 225|/// old conn's drop eventually errors its read and the thread exits).\n 226|enum BrainConn {\n*227|    /// The ordinary blocking carrier — every non-pump brain.\n 228|    Whole(Stream),\n*229|    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n*230|    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n 231|    Split {\n 232|        send: SendHalf,\n 233|        frames: Receiver<io::Result<Envelope>>,\n...\n 242|impl BrainConn {\n*243|    /// Split a connected+handshaked stream into the pump carrier: spawn the\n*244|    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n 245|    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n 246|    /// reader is diagnosable in the field (KH 7.6).\n*247|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n 248|    fn split_with_reader(stream: Stream) -> BrainConn {\n 249|        let (mut recv, send) = stream.split();\n 250|        let (tx, frames) = mpsc::channel();\n 251|        let reader = thread::Builder::new()\n*252|            .name(\"pump-ipc-reader\".to_string())\n 253|            .spawn(move || {\n*254|                eprintln!(\"PUMP_IPC_READER: spawned\");\n 255|                loop {\n 256|                    let framed = read_frame(&mut recv);\n 257|                    let was_err = framed.is_err();\n...\n 268|                }\n*269|                eprintln!(\"PUMP_IPC_READER: exited\");\n 270|            })\n*271|            .expect(\"spawn pump-ipc-reader thread\");\n 272|        BrainConn::Split {\n 273|            send,\n 274|            frames,\n...\n 311|    /// When `Some`, every reply read is bounded by this per-call deadline budget\n*312|    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n 313|    /// into the reader-thread form so the deadline can be honored over a channel\n*314|    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 315|    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n## brainproc.rs\n 11|//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n*12|//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n 13|//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n 14|//! verb. The digest hub serve + seed-control stay broker-side continuity\n 15|//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\n...\n 36|\n*37|/// Supervisor backoff floor after a brain death (mirrors the peer-pump\n 38|/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\n 39|/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\n 40|const SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\n...\n 55|const TRIAL_PREREADY_BUDGET: u32 = 3;\n*56|/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\n*57|const TICK: Duration = Duration::from_millis(200);\n 58|\n 59|/// How long the brain child retries connecting to the broker socket before\n 60|/// giving up (the broker may still be binding — the child is freshly spawned).\n 61|const BRAIN_CONNECT_TRIES: u32 = 300;\n*62|/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\n 63|const BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\n 64|\n 65|/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\n...\n 107|/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\n*108|/// its next wait tick, kills the current brain child, and respawns it with\n 109|/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\n 110|/// between the broker serve path and the supervisor — both run in the broker\n 111|/// process. This is the seam that makes a routine `apply` actually run new code,\n...\n 144|///\n*145|/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\n*146|/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\n 147|/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\n 148|/// broker — a brain respawn re-spawns them from the swapped binary. They are\n 149|/// meaningful only once the broker-owned NetHost is up, so we gate on the\n...\n 238|    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n*239|    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240|    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241|    // shell waker). Online-only is staged behind the interim `api listen`\n 242|    // (status-absent perches are skipped — no double-host) until W0.2 makes the\n...\n 259|    loop {\n*260|        thread::sleep(BRAIN_HEARTBEAT);\n 261|        // `net-status` is both the net-capability probe and the broker-liveness\n 262|        // probe: an `Err` is the broker gone (or a future planned\n 263|        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n...\n 275|            eprintln!(\n*276|                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n 277|            );\n 278|        }\n 279|        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\n*280|        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\n 281|        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\n 282|        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\n 283|        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\n*284|        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\n 285|        // window, so without this the wedge never drains: the promotion DRAINED gate\n 286|        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\n 287|        // drives the evict) stays false for the full trial → \"alive but never ready\"\n...\n 303|/// them. Pure for the unit table — the spawn-exactly-once + net-gating\n*304|/// semantics that keep a single dispatcher/peer-pump set running.\n 305|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 306|fn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\n 307|    net_enabled && !already_started\n...\n 309|\n*310|/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\n 311|/// (D9-1) — against the broker's socket. **Relocated from the broker process to\n 312|/// the brain child (restoration D2-1):** both are standalone IPC clients\n 313|/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\n*314|/// restartable brain. Each mints its own registry + stop flag and connects\n 315|/// independently; when the brain process exits these in-process threads die with\n 316|/// it, and the respawned brain re-spawns them from the current binary. Mirrors\n 317|/// the wiring the broker boot used to do, `node_hex` now sourced from the\n...\n 321|fn spawn_net_consumers(node_hex: &str) {\n*322|    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323|    let stop = Arc::new(AtomicBool::new(false));\n*324|    let _ = crate::dispatch::spawn_dispatcher(\n 325|        broker_socket_name(),\n*326|        Arc::clone(&registry),\n 327|        Arc::clone(&stop),\n 328|    );\n 329|    let cfg = crate::config::DaemonConfig::load();\n*330|    if cfg.peer_pump {\n## broker.rs\n 5|//! the spawned child (both via [`spt_term::PtySession`]), and the accepted\n*6|//! client / listening sockets. It runs **no logic** — no routing, registry,\n 7|//! manifest parse, or lifecycle. It is a relay: spawn a child under a PTY,\n 8|//! forward its output to the brain, inject the brain's input, report exit.\n 9|//!\n...\n 150|/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n*151|/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n 152|/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n 153|/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n 154|/// untouched.\n...\n 198|const WAKE_DEDUP_WAIT: Duration = Duration::from_secs(2);\n*199|/// Poll slice while waiting on a racing wake's session to appear.\n*200|const WAKE_DEDUP_POLL: Duration = Duration::from_millis(50);\n 201|\n 202|/// RAII release of a single-flight wake claim (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP):\n 203|/// the broker holds an endpoint id in [`Broker::wake_inflight`] for the duration of a\n...\n 394|/// shared with the inject worker and RESET to 0 on a healthy `{commit}`, so a\n*395|/// respawned binary that recovers refreshes the whole budget (the C3(b) give-up-\n 396|/// budget shape: consecutive-failures bounded, healthy-run resets). Mirrors the\n 397|/// psyche crash-loop backoff's bounded give-up.\n 398|const TRANSLATE_RESPAWN_BUDGET: u32 = 3;\n...\n 426|/// inject after startup, the pre-settle window; re-drives settle again). An echoing PTY\n*427|/// returns in a tick or two, well under this.\n 428|const INJECT_SETTLE_DEADLINE: Duration = Duration::from_millis(400);\n*429|/// Poll/probe cadence within the settle-gate and the echo-verify wait.\n*430|const INJECT_SETTLE_POLL: Duration = Duration::from_millis(40);\n 431|/// The benign readiness probe: a DSR cursor-position query (`ESC[6n`). Invisible to\n 432|/// a TUI input line and never a submit; a live terminal/child answers or re-renders,\n 433|/// producing output — the POSITIVE signal that the input reader is attached.\n...\n 569|    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n*570|    /// The drain does a SINGLE non-blocking `try_send` per chunk and NEVER sleeps;\n 571|    /// a channel that stays Full for [`CONTROLLER_WRITE_DEADLINE`] PAST this stamp\n 572|    /// evicts the stalled controller (bounded wedge preserved), while a slow-but-\n 573|    /// alive controller just drops the chunk + falls behind the ring (resume-from-\n...\n 687|/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n*688|/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n 689|// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n 690|fn stamp_divergence(\n 691|    rec_driven_by: Option<&str>,\n...\n 704|/// REQ-CONTROL-STAMP-CONVERGENCE): the generation counter a definitive\n*705|/// no-session truth (the exit-waiter reap) BUMPS, and a poll-derived stamp\n 706|/// write VALIDATES against — so a `KIND_SESSIONS` snapshot taken PRE-reap can\n 707|/// never relatch `controlled=true` after the reap cleared it (the session is\n*708|/// gone; no later poll would ever heal the latch). The `write` mutex\n 709|/// serializes the validate-then-write pair against the bump-then-clear pair —\n*710|/// without it the poll could pass validation and still land its stale write\n 711|/// AFTER the reap's clears. Per-ENDPOINT, so stamps to different perches never\n 712|/// serialize (KH 7.12 stays about global locks; the fs writes here are the\n 713|/// same bounded per-perch fsyncs the exit-waiter always did).\n...\n 737|/// `controlled:false` and no later edge re-stamps, so the endpoint reads uncontrolled\n*738|/// forever while driven. This DIVERGENCE-GATED re-assert (on the `KIND_SESSIONS` poll,\n 739|/// bounded by the reconcile cadence) writes ONLY on a real difference — no fsync storm.\n 740|/// Best-effort: an unbound / corrupt / perch-less endpoint has nowhere to converge yet.\n 741|///\n...\n 829|    /// the bounded ring, then FAN OUT to viewers AND the controller — both a SINGLE\n*830|    /// non-blocking `try_send`, so the drain NEVER blocks/sleeps here. Returns\n 831|    /// `Some(epoch)` when the controller must be EVICTED (stalled past the deadline,\n 832|    /// or its writer is gone) so the drain can `mark_controller_gone(epoch)` OFF the\n 833|    /// log lock; `None` otherwise.\n...\n 836|    /// controller SOCKET WRITE off the drain (the `controller_writer` thread) but\n*837|    /// left the HANDOFF as an inline sleep-poll (`ControllerJob::deliver`, up to\n 838|    /// `CONTROLLER_WRITE_DEADLINE`) ON the drain — so a controller draining slower\n*839|    /// than the PTY floods filled its channel, the inline poll throttled the drain,\n 840|    /// and the viewer fan-out below stopped running → a concurrent `rc --view`\n 841|    /// VIEWER starved. Now the controller handoff is ONE non-blocking `try_send`\n 842|    /// exactly like a viewer: the drain runs at full PTY speed regardless of\n...\n 938|        // Controller: the SAME non-blocking discipline as a viewer (b4). One\n*939|        // `try_send`, never a sleep. Ok → record the handoff time. Full → DROP (a\n 940|        // slow controller falls behind the ring) unless it has been Full for the\n 941|        // whole deadline since its last success → EVICT. Disconnected (writer gone)\n 942|        // → EVICT. The drain off-lock turns `Some(epoch)` into `mark_controller_gone`.\n...\n 1083|    /// THREAD has EXITED — the record-vs-truth honesty step, run on the authoritative\n*1084|    /// `KIND_SESSIONS` poll BEFORE `controller_by`/`has_controller` are read. The\n 1085|    /// writer exits when a socket write fails (a severed / keepalive-killed controller\n 1086|    /// conn) or its `tx` drops; while it is parked on `rx.recv()` (a LIVE but idle\n 1087|    /// controller) it is NOT finished, so a live controller is never touched (the\n...\n 1300|            // re-take is for a SUCCESSOR — the SAME Request re-served after a\n*1301|            // dispatcher restart (equal generation) or a NEWER viewport\n 1302|            // (greater). A REPLAYED stale Request (an UNFINISHED backlog row\n 1303|            // whose viewport died raw, no FIN — the shape finished-row\n 1304|            // retirement cannot see) carries an OLDER generation than the\n## config.rs\n 30|/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\n*31|/// — a binary handoff relaunch or a brief stale poll — without delaying a real\n 32|/// teardown for long. Configurable per machine via `crash_grace_ms`.\n 33|pub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\n 34|\n*35|/// Default peer-pump cadences (D9-1): how often the daemon pushes its\n*36|/// registry/notif feeds to trusted peers and pulls context syncs from them.\n 37|/// Conservative defaults — every loop is a thin call over an idempotent\n*38|/// driver, so a missed tick costs only latency, never correctness.\n*39|pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n*40|pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n 41|pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n 42|pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n 43|\n*44|/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n 45|/// authored by a node not heard within this window are evicted on the next\n*46|/// registry pump tick. Sized to ~10 default pump cadences — generous against\n 47|/// transient drops (a peer re-advertises every cadence, so one admitted feed\n 48|/// inside the window keeps its rows), short enough that a dead node identity\n 49|/// stops poisoning bare-id resolution within minutes.\n*50|pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\n 51|\n 52|/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\n 53|/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\n...\n 102|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*103|    peer_pump: Option<bool>,\n 104|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*105|    registry_pump_period_ms: Option<u64>,\n 106|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*107|    registry_evict_after_ms: Option<u64>,\n 108|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*109|    notif_pump_period_ms: Option<u64>,\n 110|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 111|    sync_pull_period_ms: Option<u64>,\n 112|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n...\n 149|    pub relay: RelayChoice,\n*150|    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\n 151|    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n*152|    pub peer_pump: bool,\n*153|    /// Registry feed push cadence (D9-1).\n*154|    pub registry_pump_period: Duration,\n*155|    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n*156|    /// node not heard within this window are evicted on the next registry\n*157|    /// pump tick — a dead node identity must not poison bare-id resolution\n## conn.rs\n 7|//! ACROSS a blocking [`write_frame`]. On Windows, `interprocess 2.4.2` routes\n*8|//! that send to `WriteFileEx` + `SleepEx(INFINITE, alertable)` — a local-socket\n 9|//! path with **no supported write timeout** (`set_timeout` → `Unsupported`).\n 10|//! A connected consumer that stops reading (an `rc --take` whose process\n 11|//! wedged; a suspended brain) therefore blocks the write INDEFINITELY, and the\n...\n 32|//! connection and aborts the in-flight I/O (`CancelIoEx` on Windows — the\n*33|//! completion APC makes the wedged `SleepEx` loop return with\n 34|//! `ERROR_OPERATION_ABORTED`; `shutdown(SHUT_RDWR)` on Unix — the blocked\n 35|//! write returns `EPIPE`). A gate-waiter that exhausts its own deadline fires\n 36|//! the same abort (the stuck op it waited behind is the wedge).\n...\n 307|        }\n*308|        // Wake gate-waiters so they observe the poison instead of sleeping\n 309|        // out their full deadline, and the watchdog so it re-evaluates.\n 310|        self.gate_cv.notify_all();\n 311|        self.dog_cv.notify_all();\n...\n 337|\n*338|    /// The watchdog body: park until a write is in flight, then sleep to its\n 339|    /// absolute deadline. If the op is still in flight at the deadline,\n 340|    /// poison + cancel, re-canceling periodically until the op reports\n 341|    /// completion (the writer clears `inflight` the instant `write_frame`\n...\n 358|            };\n*359|            // Sleep toward the deadline while THIS op stays in flight.\n 360|            let fired = loop {\n 361|                if d.shutdown {\n 362|                    return;\n## consent.rs\n 12|//!   orchestrator should prompt.\n*13|//! - [`most_recently_active`] — resolve that target over the **v1 registry**\n 14|//!   (live perches + their `last_active_ms` recency stamp). This is the\n*15|//!   registry-resolution precursor CONTEXT names; the deferred PresenceChannel\n 16|//!   later generalizes it.\n 17|//!\n 18|//! What C2 deliberately does **not** build: the interactive prompt UX itself.\n...\n 71|///\n*72|/// This is the **v1 registry resolution** the consent flow rides — live perches +\n 73|/// their recency stamp, not the deferred PresenceChannel. The resolver core is\n 74|/// shared with the notif engine ([`crate::notif::most_recently_active_where`],\n 75|/// D8b — the subnet-scoped form); consent is the degenerate (unscoped) call.\n## crc_swap.rs\n 549|        #[cfg(target_os = \"linux\")]\n*550|        let image = std::path::PathBuf::from(\"/bin/sleep\");\n 551|        if !image.exists() {\n 552|            return; // no reference image on this host — inconclusive, not a fail\n 553|        }\n...\n 566|        // Give the OS a beat to map the image.\n*567|        std::thread::sleep(std::time::Duration::from_millis(150));\n 568|\n 569|        let plan = plan_crc_swap(s, i).unwrap();\n 570|        let result = apply_crc_swap(&plan);\n## daemon.rs\n 31|use crate::nethost::{NetConfig, NetHost};\n*32|use crate::seedmap::{self, SeedRegistry};\n 33|\n 34|/// How long auto-start waits for a freshly-spawned daemon to bind its channel.\n 35|const START_TIMEOUT: Duration = Duration::from_secs(5);\n*36|/// Poll cadence while waiting for the spawned daemon to come up.\n*37|const START_POLL: Duration = Duration::from_millis(25);\n 38|\n 39|/// The per-machine broker/brain daemon process.\n 40|pub struct Daemon;\n...\n 120|\n*121|        let reg = Arc::new(SeedRegistry::new());\n 122|\n 123|        // Boot housekeeping (KNOWN-HAZARDS 1.3): sweep stale `index.lock`\n 124|        // wedges out of the git-touching runtime the daemon hosts — the\n...\n 195|                    });\n*196|                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n 197|                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n 198|                // so they live with the restartable brain and respawn with it.\n 199|                // The broker keeps only the NetHost bring-up and the boot-race\n*200|                // self-heal that binds it; the brain polls `net-status` and\n 201|                // starts the consumers once net reports enabled.\n 202|                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 203|                    if !net_up && node_hex.is_some() {\n...\n 272|        // nothing — the slot is ephemeral control, a restart correctly drops it).\n*273|        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n 274|        // [impl->REQ-SHELL-3]\n 275|        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n 276|        {\n...\n 282|\n*283|        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n 284|        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n 285|        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n 286|        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n...\n 442|    loop {\n*443|        thread::sleep(backoff);\n 444|        if let Some(host) = try_start_net() {\n 445|            if broker.attach_net(host) {\n 446|                eprintln!(\"NET_ATTACHED: net endpoint bound on retry — brain starts the consumers\");\n...\n 486|        }\n*487|        thread::sleep(START_POLL);\n*488|        waited += START_POLL;\n 489|    }\n 490|    Err(io::Error::new(\n 491|        io::ErrorKind::TimedOut,\n...\n 929|/// the real per-rung launchers and log which rung won. The caller still confirms\n*930|/// readiness via the existing `brain.ready` poll — the returned pid is for\n 931|/// logging/return, not readiness (WMI/schtasks pids are the launcher's view).\n 932|// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n 933|#[cfg(windows)]\n...\n 1185|/// is recoverable from schtasks → returns a sentinel; readiness is the caller's\n*1186|/// `brain.ready` poll. This is the FALLBACK rung (WMI is primary); its `/tr`\n 1187|/// quoting is best-effort.\n 1188|// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n 1189|#[cfg(windows)]\n...\n 1225|    }\n*1226|    // No pid from schtasks; sentinel — readiness is the brain.ready poll.\n 1227|    Ok(0)\n 1228|}\n 1229|\n...\n 1267|    use super::*;\n*1268|    use crate::seedmap::{serve_seed_control, SeedRegistry};\n 1269|    use crate::test_home::with_home;\n 1270|\n 1271|    // [unit->REQ-HAZARD-DETACHED-DAEMON-STDIO] the detached-in-fact decision is EXACTLY\n...\n 1299|    // and caps at NET_RETRY_CAP — so a long boot-race wait settles to a steady\n*1300|    // 30s poll, never an ever-growing or zero-length spin.\n 1301|    #[test]\n 1302|    fn net_retry_backoff_doubles_then_caps() {\n 1303|        assert_eq!(net_retry_backoff(NET_RETRY_FIRST), Duration::from_secs(2));\n...\n 1533|            std::fs::write(&pidfile, gc.to_string()).expect(\"launcher: write gc pid\");\n*1534|            std::thread::sleep(Duration::from_secs(300));\n 1535|            std::process::exit(0);\n 1536|        }\n 1537|\n...\n 1614|                }\n*1615|                std::thread::sleep(Duration::from_millis(20));\n 1616|            }\n 1617|            found.expect(\"launcher reports its grandchild pid\")\n 1618|        };\n...\n 1625|        for _ in 0..25 {\n*1626|            std::thread::sleep(Duration::from_millis(40));\n 1627|            if !is_process_alive(gc) {\n 1628|                still_alive = false;\n 1629|                break;\n...\n 1700|\n*1701|            let reg = Arc::new(SeedRegistry::new());\n 1702|            let name = seed_socket_name();\n 1703|            let srv = Arc::clone(&reg);\n 1704|            let serve_name = name.clone();\n## deadline.rs\n 10|//!\n*11|//! - [`DeadlineAnchor`] — a **periodic** `(anchor, interval)` grid. Persisted\n 12|//!   ONCE per fresh/crash start; every fire is derived functionally\n 13|//!   ([`DeadlineAnchor::next_fire`]) with **no per-fire write**. An\n 14|//!   [`StartReason::Update`] restart keeps the anchor (phase preserved, lands\n...\n 29|//!\n*30|//! **[V4] Only phase-significant loops convert.** The idempotent pump cadences\n*31|//! (`pump`) need none — they already stagger from everything-due-now,\n 32|//! catch-up/idempotent/restart-safe; converting them would re-add the per-loop\n 33|//! writes Q4 minimizes.\n 34|\n...\n 53|/// On-disk shape of a periodic deadline anchor (`<spt_home>/deadline-<key>.json`).\n*54|/// `interval_ms > 0` is an invariant the constructor enforces, so the pure derive\n 55|/// never divides by zero.\n 56|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 57|#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]\n 58|pub struct DeadlineAnchor {\n*59|    /// Epoch-ms grid origin. Periodic fires land at `anchor_ms + k·interval_ms`.\n 60|    pub anchor_ms: u64,\n 61|    /// Grid spacing in ms. Always `> 0` (the constructor degrades a zero value).\n*62|    pub interval_ms: u64,\n 63|}\n 64|\n 65|impl DeadlineAnchor {\n*66|    /// Resolve a non-zero interval (doyle minor — ONE degrade rule, unit-tested):\n*67|    /// a zero `interval_ms` degrades to the config default pulse period (a `const`\n 68|    /// that is always `> 0`), so the derive can never divide by zero. The `else\n 69|    /// 1ms` floor is belt-and-braces should that default ever be made zero.\n*70|    fn effective_interval(interval_ms: u64) -> u64 {\n*71|        if interval_ms > 0 {\n*72|            return interval_ms;\n 73|        }\n 74|        let default_ms = DEFAULT_PULSE_PERIOD.as_millis() as u64;\n 75|        default_ms.max(1)\n...\n 81|    /// - [`StartReason::Update`] → **keep** the existing anchor (phase preserved);\n*82|    ///   only the interval refreshes from live config. If no file exists (updating\n 83|    ///   *from* a pre-D5 binary that never wrote one), fall back to a fresh anchor\n 84|    ///   — never fail an update on a missing file.\n 85|    /// - [`StartReason::Crash`] / [`StartReason::Cold`] → write a **fresh** anchor\n...\n 88|    /// A corrupt file is treated as absent (degrade-to-fresh), matching\n*89|    /// `DaemonConfig::load_from` / `EffectJournal::open`. `interval_ms` is always\n 90|    /// (re)written from the caller's live config value, so a per-machine period\n 91|    /// change takes effect on the next start.\n 92|    pub fn open(\n 93|        key: &str,\n*94|        interval_ms: u64,\n 95|        reason: StartReason,\n 96|        now_ms: u64,\n 97|    ) -> std::io::Result<Self> {\n 98|        let path = anchor_path(key);\n*99|        let interval_ms = Self::effective_interval(interval_ms);\n 100|        let anchor = match (reason, Self::load(&path)) {\n*101|            // Update keeps the persisted phase; the interval refreshes to config.\n 102|            (StartReason::Update, Some(prev)) => DeadlineAnchor {\n 103|                anchor_ms: prev.anchor_ms,\n*104|                interval_ms,\n 105|            },\n 106|            // Update-with-no-file falls back to fresh; crash/cold are always fresh.\n 107|            _ => DeadlineAnchor {\n 108|                anchor_ms: now_ms,\n*109|                interval_ms,\n 110|            },\n 111|        };\n 112|        anchor.save(&path)?;\n...\n 133|    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n*134|    /// `anchor + interval · ⌈max(0, now − anchor) / interval⌉`.\n 135|    ///\n 136|    /// On an exact grid instant this returns `now` (fire-now); a long jump\n*137|    /// (`now ≫ anchor`) snaps to the next grid point, collapsing missed ticks to\n 138|    /// one (idempotent catch-up, no fire-storm). Saturating throughout (the\n## digest.rs\n 117|/// `from` points at the changed tail (a minimal delta); a window slide evicts the\n*118|/// oldest turn → the heads differ from index 0 → `from == 0` (a full refresh).\n 119|pub fn common_prefix_len(a: &[Turn], b: &[Turn]) -> usize {\n 120|    a.iter().zip(b.iter()).take_while(|(x, y)| x == y).count()\n 121|}\n...\n 148|        .and_then(|adapter| {\n*149|            spt_runtime::registry::resolve_option(&perch::adapters_dir(), adapter).ok()\n 150|        });\n 151|    let install_dir = resolved\n 152|        .as_ref()\n...\n 531|    // [unit->REQ-TERM-4] the diff base: a shared head yields its length (a tail\n*532|    // delta); a divergent front yields 0 (a full refresh).\n 533|    #[test]\n 534|    fn common_prefix_len_finds_the_unchanged_head() {\n 535|        let a = vec![turn(\"a\"), turn(\"b\")];\n...\n 801|            std::fs::write(asrc.join(\"manifest.toml\"), manifest).unwrap();\n*802|            spt_runtime::registry::register(&perch::adapters_dir(), &asrc, 1).unwrap();\n 803|\n 804|            // The endpoint records the adapter; the ledger holds both sessions.\n 805|            let perch = perch::resolve_perch_path(\"span\", ParentHint::Infer);\n## digesthub.rs\n 89|\n*90|/// The daemon's per-endpoint live-digest registry. The brain publishes; the\n 91|/// control channel reads + subscribes. Holds only the projected digest state —\n 92|/// the same ephemeral-projection category as the broker's accepted-socket\n*93|/// bookkeeping, not routing/registry/parse logic (the parse already happened in\n 94|/// the brain's engine).\n 95|#[derive(Default)]\n 96|pub struct DigestHub {\n...\n 121|        // The changed turns begin past the equal-by-value head; a window slide\n*122|        // (front eviction) diverges at 0 → a full refresh.\n 123|        let from = common_prefix_len(&st.snapshot.turns, &new.turns);\n 124|        st.version += 1;\n 125|        let update = DigestUpdate {\n...\n 463|    // [unit->REQ-TERM-4] the delta a publish fans out: an active-turn growth is a\n*464|    // tail delta (from past the unchanged head); a window slide refreshes from 0.\n 465|    #[test]\n*466|    fn publish_delta_is_tail_then_full_refresh() {\n 467|        let hub = DigestHub::new();\n 468|        let (_b, _v, rx) = hub.subscribe(\"doyle\");\n 469|        hub.project_and_publish(\"doyle\", digest(vec![turn(\"a\"), turn(\"b\")]));\n...\n 477|        assert_eq!(up.turns[0].input.as_deref(), Some(\"c\"));\n*478|        // A front eviction (window slide) diverges at 0 → full refresh.\n 479|        hub.project_and_publish(\"doyle\", digest(vec![turn(\"b\"), turn(\"c\"), turn(\"d\")]));\n 480|        let up = rx.recv().unwrap();\n 481|        assert_eq!(up.from, 0, \"front eviction resends from 0\");\n## dispatch.rs\n*1|//! Inbound net-stream dispatch (D9-1) — the daemon-side acceptor that turns\n 2|//! the hand-wired serve loops of D5–D8 into production behavior.\n 3|//!\n 4|//! Every E2E test so far drove the serve half manually (a probe brain calling\n...\n 13|//!\n*14|//! The stream table holds locally-opened outbound streams too. The dispatcher\n 15|//! claims only rows with `initiated_locally == false` — serving our own\n 16|//! requester stream would deadlock the requester against ourselves. The flag\n 17|//! is broker-recorded at registration (`open_stream` vs the accept loop),\n...\n 36|//! | untagged + `target`+`op_id` | WAN message feed ([`crate::wan::receive_wan`]) |\n*37|//! | untagged + `subnet`+`instance` | registry feed (D9-1-2) |\n 38|//! | anything else | unknown — dropped, loud |\n 39|//!\n 40|//! A family whose production wiring lands in a later slice is still\n 41|//! classified here (the table is complete) but routed to a typed\n*42|//! [`Unwired`](DispatchOutcome::Unwired) drop — loud, never silent.\n 43|//!\n 44|//! ## Worker model\n 45|//!\n...\n 66|use spt_net::net::replicate::{\n*67|    FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,\n 68|};\n 69|use spt_net::net::wanmsg::{WanDecoder, WanReply};\n 70|use spt_store::contextstore::ContextStore;\n...\n 78|use crate::propagate::serve_update;\n*79|use crate::registryhost::{RegistryGatePolicy, RegistryHost};\n 80|use crate::relcache::ReleaseCache;\n 81|use crate::sync::{serve_sync, SyncPolicy};\n 82|use crate::wan::receive_wan;\n...\n 84|\n*85|/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;\n 86|/// workers block on their stream's event feed).\n*87|pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n 88|\n 89|/// What protocol a peer-initiated stream speaks, by its first record's shape.\n 90|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n...\n 99|    WanMsg,\n*100|    /// A registry replication feed (untagged `RegistryUpdate` lines).\n*101|    Registry,\n 102|    /// A remote-drive attach (`AttachRecord::Request`).\n 103|    Attach,\n 104|    /// A file transfer (`XferRecord::Fetch`/`Push`).\n...\n 141|            } else if line.get(\"subnet\").is_some() && line.get(\"instance\").is_some() {\n*142|                StreamFamily::Registry\n 143|            } else if line.get(\"subnet\").is_some()\n 144|                && line.get(\"node\").is_some()\n 145|                && line.get(\"label\").is_some()\n...\n 149|                // first line is a NodeLabelUpdate. Same serve arm, same gate.\n*150|                StreamFamily::Registry\n 151|            } else {\n 152|                StreamFamily::Unknown\n 153|            }\n...\n 157|\n*158|/// Why a dispatched stream's worker ended — loud + typed, never silent.\n 159|#[derive(Debug)]\n*160|pub enum DispatchOutcome {\n 161|    /// The family's serve loop ran to its own outcome (rendered for the log).\n 162|    Served(String),\n 163|    /// The first line never arrived / didn't parse — dropped.\n...\n 168|\n*169|/// A claimed stream's dispatch lifecycle (ADR-0038 C,\n*170|/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\n 171|/// insert performed BEFORE worker spawn and never cleared — one transient\n 172|/// worker-setup failure permanently abandoned the stream. Claims now\n 173|/// distinguish in-flight vs terminal vs retryable, and a transient failure\n...\n 178|    InFlight { attempts: u32 },\n*179|    /// Done for this dispatcher's lifetime: served, unclassifiable, or\n 180|    /// retries exhausted. Terminal outcomes never re-enter the queue.\n 181|    Terminal,\n 182|    /// A transient failure released the claim; eligible again at `next_at`.\n...\n 185|\n*186|/// Bounded retry budget per stream per dispatcher lifetime — transient setup\n 187|/// failures recover, a persistently-failing stream goes terminal loud.\n*188|const MAX_DISPATCH_ATTEMPTS: u32 = 3;\n 189|\n 190|/// Backoff base for a released claim (doubles per failed attempt).\n*191|const DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\n 192|\n 193|/// The backoff before retry number `attempts` (1-based) runs.\n 194|fn retry_backoff(attempts: u32) -> Duration {\n## drivehub.rs\n 5|//! channel\" — the opaque control surface). An owner writes one drive frame for a\n*6|//! shell; the shell binary drains it with an ephemeral `api drive-poll --link`.\n 7|//! Unlike the durable command channel (spooled on the shell perch), a drive\n 8|//! frame is held in a **single in-memory slot per shell** and overwritten on\n*9|//! every write — a second write before the poll clobbers the first.\n 10|//!\n 11|//! **Where the slot lives (broker, not relay; broker, not brain).** The slot is\n 12|//! held by the always-up BROKER process (alongside [`crate::digesthub::DigestHub`]),\n...\n 22|//! stamps each frame with the **writing link token**; [`DriveHub::take`] serves\n*23|//! it only when the polling shell presents that same token. A link-break retires\n 24|//! the token and a relink mints a fresh one ([`crate::shellhost::close_shell`]\n 25|//! removes `LINK_TOKEN_FILE`; relaunch mints anew), so a frame stamped under the\n 26|//! pre-break generation can never match the relinked shell's fresh token — the\n...\n 78|\n*79|/// `drive_take` request payload: the slot key plus the polling shell's link\n 80|/// token (the serve gate).\n 81|#[derive(Debug, Clone, Serialize, Deserialize)]\n 82|pub struct DriveTakeReq {\n...\n 84|    pub shell_id: String,\n*85|    /// The polling shell's current link token — must match the slot stamp.\n 86|    pub token: String,\n 87|}\n 88|\n...\n 310|\n*311|    // [unit->REQ-SHELL-3] latest-wins: a second write before the poll clobbers\n 312|    // the first; the take serves the latest frame.\n 313|    #[test]\n 314|    fn write_is_latest_wins() {\n...\n 324|\n*325|    // [unit->REQ-SHELL-3] take-and-clear is exactly-once: a second poll after a\n 326|    // single write returns empty (the slot was cleared on the first take).\n 327|    #[test]\n 328|    fn take_is_exactly_once() {\n...\n 343|    // [unit->REQ-SHELL-3] no-replay-across-relink: a frame written under one link\n*344|    // token is NEVER served to a poll presenting a different (relinked) token —\n*345|    // and the dead frame is evicted by that very poll. This is the crash-proof\n 346|    // guarantee that does not depend on the explicit clear-on-close running.\n 347|    #[test]\n 348|    fn dead_generation_frame_is_never_served() {\n...\n 350|        hub.write(\"doyle\", \"mock-shell-0\", \"old-token\", \"stale-frame\");\n*351|        // Relink minted \"new-token\"; the shell polls with it.\n 352|        assert_eq!(\n 353|            hub.take(\"doyle\", \"mock-shell-0\", \"new-token\"),\n 354|            None,\n...\n 359|            !hub.has_slot(\"doyle\", \"mock-shell-0\"),\n*360|            \"the dead frame is cleared by the mismatching poll\"\n 361|        );\n 362|    }\n 363|\n## effect.rs\n 7|//! kills it. Effects it drives cross the broker↔brain boundary — a PTY write, a\n*8|//! spool row, a registry update. A brain that crashes *around* one of those\n 9|//! effects must, on restart, neither duplicate it (a re-injected keystroke, a\n 10|//! double-written row) nor drop it (a lost delivery).\n 11|//!\n...\n\n[Showing lines 1-965 of 1129 (50.0KB limit). Use :966 to continue]"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":255,"fileCount":20,"files":["crates/spt-daemon/src/access.rs","crates/spt-daemon/src/adapter_update.rs","crates/spt-daemon/src/applyhost.rs","crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/autostart.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/conn.rs","crates/spt-daemon/src/consent.rs","crates/spt-daemon/src/crc_swap.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/deadline.rs","crates/spt-daemon/src/digest.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/endpoint.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/access.rs","count":1},{"path":"crates/spt-daemon/src/adapter_update.rs","count":7},{"path":"crates/spt-daemon/src/applyhost.rs","count":17},{"path":"crates/spt-daemon/src/attach.rs","count":15},{"path":"crates/spt-daemon/src/autostart.rs","count":4},{"path":"crates/spt-daemon/src/brain.rs","count":20},{"path":"crates/spt-daemon/src/brainproc.rs","count":20},{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/config.rs","count":20},{"path":"crates/spt-daemon/src/conn.rs","count":5},{"path":"crates/spt-daemon/src/consent.rs","count":3},{"path":"crates/spt-daemon/src/crc_swap.rs","count":2},{"path":"crates/spt-daemon/src/daemon.rs","count":20},{"path":"crates/spt-daemon/src/deadline.rs","count":20},{"path":"crates/spt-daemon/src/digest.rs","count":4},{"path":"crates/spt-daemon/src/digesthub.rs","count":6},{"path":"crates/spt-daemon/src/dispatch.rs","count":20},{"path":"crates/spt-daemon/src/drivehub.rs","count":11},{"path":"crates/spt-daemon/src/effect.rs","count":20},{"path":"crates/spt-daemon/src/endpoint.rs","count":20}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## access.rs\n 4│//! order: subnet *visibility* (is the endpoint routable here at all? —\n*5│//! `spt_store::visibility`, applied inside registry resolution) → the\n 6│//! **endpoint access whitelist** (may *your node* remotely reach it? — THIS\n 7│//! module) → *capability grants* (may this agent do this high-risk thing? —\n 8│//! [`crate::consent`], default-deny). The whitelist is the outer gate before\n## adapter_update.rs\n   7│//! its manifest `[update]` block ([`Update`]); this module turns that directive\n  *8│//! into a per-adapter [`AdapterUpdateOutcome`], dispatched by avenue:\n   9│//!\n  10│//! - **`file_pull`** — spt-core controls the bytes, so it *verifies* them: the\n  11│//!   pulled payload is checked against the adapter's **own** Ed25519 key (declared\n    │...\n 163│/// is complete here. Soft-deregistered adapters are excluded by\n*164│/// [`spt_runtime::registry::registered`].\n 165│// [impl->REQ-INSTALL-4]\n 166│pub fn ripple_registered(adapters_dir: &std::path::Path) -> Vec<(String, AdapterUpdateOutcome)> {\n*167│    let mut set = spt_runtime::registry::registered(adapters_dir);\n 168│    set.sort_by_key(|(r, _)| r.registered_at_ms);\n 169│    set.iter()\n 170│        .map(|(r, m)| {\n    │...\n 408│        // Register out of name order to prove registration-time ordering.\n*409│        spt_runtime::registry::register(&adapters_dir, &updatable, 100).unwrap();\n*410│        spt_runtime::registry::register(&adapters_dir, &plain, 200).unwrap();\n*411│        spt_runtime::registry::register(&adapters_dir, &gone, 300).unwrap();\n*412│        spt_runtime::registry::deregister(&adapters_dir, \"gone\").unwrap();\n 413│\n 414│        let out = ripple_registered(&adapters_dir);\n 415│        assert_eq!(\n## applyhost.rs\n  11│//!\n *12│//! [`apply_staged`] drives the whole chain against what the peer pump left\n  13│//! behind (REQ-UPD-4: staged + consent-notified, never auto-applied):\n  14│//!\n  15│//! 1. **Re-verify at rest** (`plan_verified` under the production\n    │...\n 167│    // disk. Fail-closed on an unprovisioned key file (same posture as the\n*168│    // pump's pull leg).\n 169│    let policy = VerifyPolicy::load_from(release_keys, 0, now_ms());\n 170│    if policy.trusted_keys.is_empty() {\n 171│        return Ok(Prepared::Done(ApplyStagedOutcome::Rejected(\n    │...\n 352│/// Cycle the brain of a RUNNING daemon with NO binary swap and NO staging\n*353│/// preconditions (REQ-DAEMON-REFRESH, `spt daemon refresh`): connect to the\n 354│/// broker and raise the same supervisor brain-restart signal the post-swap\n 355│/// apply rides ([`Brain::request_brain_restart`], ADR-0018 D3-3) — brain stop →\n 356│/// respawn → readiness trial → promote, broker + every hosted PTY untouched by\n    │...\n 362│/// (accepted, not acted on).\n*363│// [impl->REQ-DAEMON-REFRESH]\n*364│pub fn refresh_brain(broker_name: &str) -> Result<bool, String> {\n 365│    let mut brain = connect_retry(broker_name).map_err(|e| format!(\"broker connect: {e}\"))?;\n 366│    brain\n 367│        .request_brain_restart()\n    │...\n 461│        }\n*462│        std::thread::sleep(Duration::from_millis(10));\n 463│    }\n 464│    Err(last)\n 465│}\n    │...\n 560│            }\n*561│            std::thread::sleep(Duration::from_millis(10));\n 562│        }\n 563│        panic!(\"brain cold-start could not connect\");\n 564│    }\n    │...\n 567│    // COMPILED image version over IPC: a Brain connected to a live broker gets back\n*568│    // Some(the broker's own CARGO_PKG_VERSION) — the KIND_BROKER_IMAGE dispatch +\n 569│    // reply round-trip end to end (the new-broker leg; the old-broker→None leg rides\n 570│    // the router's `unknown command kind` default, caught client-side as None).\n 571│    #[test]\n    │...\n 760│        //    registered platform that is not this host — derived from the\n*761│        //    SUPPORTED_PLATFORMS registry (not a hardcoded win/linux pair), so a\n 762│        //    third platform (musl) is covered with no edit here.\n 763│        let other = crate::release::SUPPORTED_PLATFORMS\n 764│            .iter()\n    │...\n 766│            .find(|&t| t != current_platform())\n*767│            .expect(\"registry must have a platform other than the current host\");\n 768│        cache\n 769│            .stage_single_with_platform(&signed, b\"CROSS-OS BYTES\", other)\n 770│            .unwrap();\n    │...\n 822│\n*823│    // [unit->REQ-DAEMON-REFRESH] `refresh_brain` routes the SAME supervisor\n 824│    // brain-cycle signal as the post-swap apply — against a bare broker with NO\n 825│    // staged release, NO release cache, NO binary swap. The verb has no staging\n 826│    // preconditions: the signal raises and `honored` reports the supervisor\n    │...\n 828│    #[test]\n*829│    fn refresh_brain_cycles_without_staging_or_swap_preconditions() {\n 830│        let name = unique_name();\n 831│        let broker = served_broker(&name);\n 832│\n*833│        // No supervisor wired: the refresh round-trips and reports not-honored.\n 834│        assert!(\n*835│            !refresh_brain(&name).expect(\"refresh round-trips on a bare broker\"),\n 836│            \"no supervisor wired must report honored=false\"\n 837│        );\n 838│\n*839│        // Supervisor wired: refresh raises the same planned-restart signal the\n 840│        // apply path rides — with nothing staged anywhere.\n 841│        let signal = Arc::new(crate::brainproc::BrainRestart::new());\n 842│        assert!(broker.set_brain_restart(Arc::clone(&signal)), \"first wire wins\");\n 843│        assert!(\n*844│            refresh_brain(&name).expect(\"refresh round-trips\"),\n 845│            \"a wired supervisor must report honored=true\"\n 846│        );\n 847│        assert!(\n 848│            signal.take(),\n*849│            \"refresh must raise the planned-restart signal the supervisor consumes\"\n 850│        );\n 851│    }\n 852│\n## attach.rs\n   4│//! The operator's daemon opened a bidi QUIC stream to this node (D4) and sent\n  *5│//! [`AttachRecord::Request`]; this module is the target-side pump between that\n   6│//! stream and the local broker-hosted session:\n   7│//!\n   8│//! - session `Output` chunks → [`AttachRecord::Output`] lines onto the wire\n    │...\n  18│//! journaled [`Brain::net_stream_send`] blocks reading events until its ack\n *19│//! and *discards* everything interleaved — inside a full-duplex pump loop that\n  20│//! eats the operator's `Input` records (both sides starve; found the hard way\n  21│//! in `tests/attach.rs`). Idempotency holds without it because each direction\n  22│//! dedups at its **effect**: the PTY write is journaled by the operator-minted\n    │...\n  99│/// each re-subscribe; without spacing that is an evict→resubscribe CPU spin. With\n*100│/// it, the operator sees an intermittent LIVE burst each interval (forward\n 101│/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.\n*102│const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);\n 103│\n 104│/// The CONTROLLER fell behind the live ring further than the ring holds — the\n 105│/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an\n    │...\n 206│/// `session_id` it could not have. `None` ⇒ no live session under that endpoint\n*207│/// (a stale registry row routed us an attach for something gone → the caller\n 208│/// refuses cleanly, D6).\n 209│// [impl->REQ-RC-CROSS-NODE-ATTACH]\n 210│pub(crate) fn resolve_local_session(brain: &mut Brain, endpoint: &str) -> Option<u64> {\n    │...\n 220│/// One attach `Request` — the SINGLE handling path for both a wire-arriving\n*221│/// record and the dispatcher's durable-opener seed (ADR-0038 B; one\n 222│/// implementation so the two entries cannot drift):\n 223│///\n 224│/// - Unsolicited-inbound gate (ADR-0009) under the transport-proven origin;\n    │...\n 226│///   denial finishes our send side and ends the serve (`Some(Refused)`).\n*227│/// - Cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH): the dispatcher-resolved\n 228│///   session id wins (the owning node is authoritative for its own table);\n 229│///   the LOCAL path uses the wire `session_id` unchanged.\n 230│/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /\n    │...\n 279│/// the replayed `Request`/`Input` records re-gate and dedup at the PTY\n*280│/// journal, and re-pumped output dedups at the operator's render cursor).\n 281│///\n 282│/// `remote_session` is `Some(sid)` ONLY on the cross-node leg (#4,\n*283│/// REQ-RC-CROSS-NODE-ATTACH): the dispatcher has ALREADY resolved endpoint→our\n 284│/// session id ([`resolve_local_session`]) BEFORE this serve loop subscribed, so\n 285│/// the wire's placeholder `session_id` (0) is overridden here with the resolved\n 286│/// id. It is passed down — never re-queried mid-loop — because a `sessions()`\n    │...\n 293│/// record — a reconstruction that waited for one would idle forever. The\n*294│/// dispatcher hands the durable opener here and it is handled EXACTLY like a\n 295│/// wire-arriving Request (same gate, same subscribe); a Request that then\n 296│/// replays from the ring anyway re-runs the same-identity re-take, which is\n 297│/// silent and idempotent (the successor-re-take parity the fix must keep).\n    │...\n 359│\n*360│    // Durable-opener seed (ADR-0038 B): process the dispatcher-pinned Request\n 361│    // BEFORE the event loop, through the exact wire-Request path — a rolled\n 362│    // ring can no longer replay it. Non-Request seeds are ignored (the opener\n 363│    // of an attach stream is always its Request).\n    │...\n 442│                            intent: req_intent,\n*443│                            // The dispatcher already resolved endpoint_id→session\n 444│                            // (passed as remote_session) BEFORE this loop; ignore\n 445│                            // the wire copy here (a mid-loop re-resolve would swallow\n 446│                            // interleaved attach records — see remote_session docs).\n    │...\n 561│            // the attach down: DISTINCT from a session-exit EOF. Rate-limited\n*562│            // (RESUBSCRIBE_INTERVAL) so a hopelessly-behind viewer under sustained\n 563│            // flood sees intermittent LIVE bursts, never an evict→resubscribe CPU\n 564│            // spin. The next live Output carries a forward seq jump; the operator's\n 565│            // render cursor snaps to it (tail -f reconnect). VIEWER-only → B2-safe.\n    │...\n 571│                    let since = prev.elapsed();\n*572│                    if since < RESUBSCRIBE_INTERVAL {\n*573│                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n 574│                    }\n 575│                }\n 576│                brain.attach_skip_to_live(sid, Some(origin_node))?;\n## autostart.rs\n  14│//! restore-what-was-up was rejected): the adapter option re-resolves against\n *15│//! the live registry, the session id is freshly minted, and home rides the\n  16│//! endpoint's existing perch (durable — REQ-INST-15), so no `--subnet` is\n  17│//! recorded or needed.\n  18│\n    │...\n  49│        let (record, manifest) =\n *50│            match spt_runtime::registry::resolve_option(&adapters_dir, &entry.adapter) {\n  51│                Ok((r, m)) if m.adapter.kind == spt_runtime::manifest::AdapterKind::Harness => {\n  52│                    (r, m)\n  53│                }\n    │...\n 104│                    if attempt < LAUNCH_ATTEMPTS {\n*105│                        std::thread::sleep(LAUNCH_RETRY_DELAY);\n 106│                    }\n 107│                }\n 108│            }\n    │...\n 137│        });\n*138│        rx.recv_timeout(budget).expect(\n 139│            \"replay_startup_endpoints must return promptly on the pre-launch paths \\\n 140│             (empty list / unresolved adapter loud-skip), never hang the boot thread\",\n 141│        );\n## brain.rs\n 159│    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n*160│    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n 161│    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 162│    /// ([`Self::NetPresence`]), not this frame.\n 163│    NetDialSubmitted,\n    │...\n 208│/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n*209│/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n*210│/// **split** carrier for the peer pump.\n 211│///\n*212│/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\n 213│/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\n 214│/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\n 215│/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n*216│/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n 217│/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n*218│/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 219│/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 220│/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n*221│/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n*222│/// channel supplies the deadline. On a timeout the pump bubbles out to a\n 223│/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n 224│/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n 225│/// old conn's drop eventually errors its read and the thread exits).\n 226│enum BrainConn {\n*227│    /// The ordinary blocking carrier — every non-pump brain.\n 228│    Whole(Stream),\n*229│    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n*230│    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n 231│    Split {\n 232│        send: SendHalf,\n 233│        frames: Receiver<io::Result<Envelope>>,\n    │...\n 242│impl BrainConn {\n*243│    /// Split a connected+handshaked stream into the pump carrier: spawn the\n*244│    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n 245│    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n 246│    /// reader is diagnosable in the field (KH 7.6).\n*247│    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n 248│    fn split_with_reader(stream: Stream) -> BrainConn {\n 249│        let (mut recv, send) = stream.split();\n 250│        let (tx, frames) = mpsc::channel();\n 251│        let reader = thread::Builder::new()\n*252│            .name(\"pump-ipc-reader\".to_string())\n 253│            .spawn(move || {\n*254│                eprintln!(\"PUMP_IPC_READER: spawned\");\n 255│                loop {\n 256│                    let framed = read_frame(&mut recv);\n 257│                    let was_err = framed.is_err();\n    │...\n 268│                }\n*269│                eprintln!(\"PUMP_IPC_READER: exited\");\n 270│            })\n*271│            .expect(\"spawn pump-ipc-reader thread\");\n 272│        BrainConn::Split {\n 273│            send,\n 274│            frames,\n    │...\n 311│    /// When `Some`, every reply read is bounded by this per-call deadline budget\n*312│    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n 313│    /// into the reader-thread form so the deadline can be honored over a channel\n*314│    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 315│    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n## brainproc.rs\n  11│//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n *12│//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n  13│//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n  14│//! verb. The digest hub serve + seed-control stay broker-side continuity\n  15│//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\n    │...\n  36│\n *37│/// Supervisor backoff floor after a brain death (mirrors the peer-pump\n  38│/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\n  39│/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\n  40│const SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\n    │...\n  55│const TRIAL_PREREADY_BUDGET: u32 = 3;\n *56│/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\n *57│const TICK: Duration = Duration::from_millis(200);\n  58│\n  59│/// How long the brain child retries connecting to the broker socket before\n  60│/// giving up (the broker may still be binding — the child is freshly spawned).\n  61│const BRAIN_CONNECT_TRIES: u32 = 300;\n *62│/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\n  63│const BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\n  64│\n  65│/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\n    │...\n 107│/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\n*108│/// its next wait tick, kills the current brain child, and respawns it with\n 109│/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\n 110│/// between the broker serve path and the supervisor — both run in the broker\n 111│/// process. This is the seam that makes a routine `apply` actually run new code,\n    │...\n 144│///\n*145│/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\n*146│/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\n 147│/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\n 148│/// broker — a brain respawn re-spawns them from the swapped binary. They are\n 149│/// meaningful only once the broker-owned NetHost is up, so we gate on the\n    │...\n 238│    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n*239│    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240│    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241│    // shell waker). Online-only is staged behind the interim `api listen`\n 242│    // (status-absent perches are skipped — no double-host) until W0.2 makes the\n    │...\n 259│    loop {\n*260│        thread::sleep(BRAIN_HEARTBEAT);\n 261│        // `net-status` is both the net-capability probe and the broker-liveness\n 262│        // probe: an `Err` is the broker gone (or a future planned\n 263│        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n    │...\n 275│            eprintln!(\n*276│                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n 277│            );\n 278│        }\n 279│        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\n*280│        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\n 281│        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\n 282│        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\n 283│        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\n*284│        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\n 285│        // window, so without this the wedge never drains: the promotion DRAINED gate\n 286│        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\n 287│        // drives the evict) stays false for the full trial → \"alive but never ready\"\n    │...\n 303│/// them. Pure for the unit table — the spawn-exactly-once + net-gating\n*304│/// semantics that keep a single dispatcher/peer-pump set running.\n 305│// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 306│fn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\n 307│    net_enabled && !already_started\n    │...\n 309│\n*310│/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\n 311│/// (D9-1) — against the broker's socket. **Relocated from the broker process to\n 312│/// the brain child (restoration D2-1):** both are standalone IPC clients\n 313│/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\n*314│/// restartable brain. Each mints its own registry + stop flag and connects\n 315│/// independently; when the brain process exits these in-process threads die with\n 316│/// it, and the respawned brain re-spawns them from the current binary. Mirrors\n 317│/// the wiring the broker boot used to do, `node_hex` now sourced from the\n    │...\n 321│fn spawn_net_consumers(node_hex: &str) {\n*322│    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323│    let stop = Arc::new(AtomicBool::new(false));\n*324│    let _ = crate::dispatch::spawn_dispatcher(\n 325│        broker_socket_name(),\n*326│        Arc::clone(&registry),\n 327│        Arc::clone(&stop),\n 328│    );\n 329│    let cfg = crate::config::DaemonConfig::load();\n*330│    if cfg.peer_pump {\n## broker.rs\n    5│//! the spawned child (both via [`spt_term::PtySession`]), and the accepted\n   *6│//! client / listening sockets. It runs **no logic** — no routing, registry,\n    7│//! manifest parse, or lifecycle. It is a relay: spawn a child under a PTY,\n    8│//! forward its output to the brain, inject the brain's input, report exit.\n    9│//!\n     │...\n  150│/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n *151│/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n  152│/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n  153│/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n  154│/// untouched.\n     │...\n  198│const WAKE_DEDUP_WAIT: Duration = Duration::from_secs(2);\n *199│/// Poll slice while waiting on a racing wake's session to appear.\n *200│const WAKE_DEDUP_POLL: Duration = Duration::from_millis(50);\n  201│\n  202│/// RAII release of a single-flight wake claim (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP):\n  203│/// the broker holds an endpoint id in [`Broker::wake_inflight`] for the duration of a\n     │...\n  394│/// shared with the inject worker and RESET to 0 on a healthy `{commit}`, so a\n *395│/// respawned binary that recovers refreshes the whole budget (the C3(b) give-up-\n  396│/// budget shape: consecutive-failures bounded, healthy-run resets). Mirrors the\n  397│/// psyche crash-loop backoff's bounded give-up.\n  398│const TRANSLATE_RESPAWN_BUDGET: u32 = 3;\n     │...\n  426│/// inject after startup, the pre-settle window; re-drives settle again). An echoing PTY\n *427│/// returns in a tick or two, well under this.\n  428│const INJECT_SETTLE_DEADLINE: Duration = Duration::from_millis(400);\n *429│/// Poll/probe cadence within the settle-gate and the echo-verify wait.\n *430│const INJECT_SETTLE_POLL: Duration = Duration::from_millis(40);\n  431│/// The benign readiness probe: a DSR cursor-position query (`ESC[6n`). Invisible to\n  432│/// a TUI input line and never a submit; a live terminal/child answers or re-renders,\n  433│/// producing output — the POSITIVE signal that the input reader is attached.\n     │...\n  569│    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n *570│    /// The drain does a SINGLE non-blocking `try_send` per chunk and NEVER sleeps;\n  571│    /// a channel that stays Full for [`CONTROLLER_WRITE_DEADLINE`] PAST this stamp\n  572│    /// evicts the stalled controller (bounded wedge preserved), while a slow-but-\n  573│    /// alive controller just drops the chunk + falls behind the ring (resume-from-\n     │...\n  687│/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n *688│/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n  689│// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n  690│fn stamp_divergence(\n  691│    rec_driven_by: Option<&str>,\n     │...\n  704│/// REQ-CONTROL-STAMP-CONVERGENCE): the generation counter a definitive\n *705│/// no-session truth (the exit-waiter reap) BUMPS, and a poll-derived stamp\n  706│/// write VALIDATES against — so a `KIND_SESSIONS` snapshot taken PRE-reap can\n  707│/// never relatch `controlled=true` after the reap cleared it (the session is\n *708│/// gone; no later poll would ever heal the latch). The `write` mutex\n  709│/// serializes the validate-then-write pair against the bump-then-clear pair —\n *710│/// without it the poll could pass validation and still land its stale write\n  711│/// AFTER the reap's clears. Per-ENDPOINT, so stamps to different perches never\n  712│/// serialize (KH 7.12 stays about global locks; the fs writes here are the\n  713│/// same bounded per-perch fsyncs the exit-waiter always did).\n     │...\n  737│/// `controlled:false` and no later edge re-stamps, so the endpoint reads uncontrolled\n *738│/// forever while driven. This DIVERGENCE-GATED re-assert (on the `KIND_SESSIONS` poll,\n  739│/// bounded by the reconcile cadence) writes ONLY on a real difference — no fsync storm.\n  740│/// Best-effort: an unbound / corrupt / perch-less endpoint has nowhere to converge yet.\n  741│///\n     │...\n  829│    /// the bounded ring, then FAN OUT to viewers AND the controller — both a SINGLE\n *830│    /// non-blocking `try_send`, so the drain NEVER blocks/sleeps here. Returns\n  831│    /// `Some(epoch)` when the controller must be EVICTED (stalled past the deadline,\n  832│    /// or its writer is gone) so the drain can `mark_controller_gone(epoch)` OFF the\n  833│    /// log lock; `None` otherwise.\n     │...\n  836│    /// controller SOCKET WRITE off the drain (the `controller_writer` thread) but\n *837│    /// left the HANDOFF as an inline sleep-poll (`ControllerJob::deliver`, up to\n  838│    /// `CONTROLLER_WRITE_DEADLINE`) ON the drain — so a controller draining slower\n *839│    /// than the PTY floods filled its channel, the inline poll throttled the drain,\n  840│    /// and the viewer fan-out below stopped running → a concurrent `rc --view`\n  841│    /// VIEWER starved. Now the controller handoff is ONE non-blocking `try_send`\n  842│    /// exactly like a viewer: the drain runs at full PTY speed regardless of\n     │...\n  938│        // Controller: the SAME non-blocking discipline as a viewer (b4). One\n *939│        // `try_send`, never a sleep. Ok → record the handoff time. Full → DROP (a\n  940│        // slow controller falls behind the ring) unless it has been Full for the\n  941│        // whole deadline since its last success → EVICT. Disconnected (writer gone)\n  942│        // → EVICT. The drain off-lock turns `Some(epoch)` into `mark_controller_gone`.\n     │...\n 1083│    /// THREAD has EXITED — the record-vs-truth honesty step, run on the authoritative\n*1084│    /// `KIND_SESSIONS` poll BEFORE `controller_by`/`has_controller` are read. The\n 1085│    /// writer exits when a socket write fails (a severed / keepalive-killed controller\n 1086│    /// conn) or its `tx` drops; while it is parked on `rx.recv()` (a LIVE but idle\n 1087│    /// controller) it is NOT finished, so a live controller is never touched (the\n     │...\n 1300│            // re-take is for a SUCCESSOR — the SAME Request re-served after a\n*1301│            // dispatcher restart (equal generation) or a NEWER viewport\n 1302│            // (greater). A REPLAYED stale Request (an UNFINISHED backlog row\n 1303│            // whose viewport died raw, no FIN — the shape finished-row\n 1304│            // retirement cannot see) carries an OLDER generation than the\n## config.rs\n  30│/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\n *31│/// — a binary handoff relaunch or a brief stale poll — without delaying a real\n  32│/// teardown for long. Configurable per machine via `crash_grace_ms`.\n  33│pub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\n  34│\n *35│/// Default peer-pump cadences (D9-1): how often the daemon pushes its\n *36│/// registry/notif feeds to trusted peers and pulls context syncs from them.\n  37│/// Conservative defaults — every loop is a thin call over an idempotent\n *38│/// driver, so a missed tick costs only latency, never correctness.\n *39│pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n *40│pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n  41│pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n  42│pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n  43│\n *44│/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n  45│/// authored by a node not heard within this window are evicted on the next\n *46│/// registry pump tick. Sized to ~10 default pump cadences — generous against\n  47│/// transient drops (a peer re-advertises every cadence, so one admitted feed\n  48│/// inside the window keeps its rows), short enough that a dead node identity\n  49│/// stops poisoning bare-id resolution within minutes.\n *50│pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\n  51│\n  52│/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\n  53│/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\n    │...\n 102│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*103│    peer_pump: Option<bool>,\n 104│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*105│    registry_pump_period_ms: Option<u64>,\n 106│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*107│    registry_evict_after_ms: Option<u64>,\n 108│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*109│    notif_pump_period_ms: Option<u64>,\n 110│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 111│    sync_pull_period_ms: Option<u64>,\n 112│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    │...\n 149│    pub relay: RelayChoice,\n*150│    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\n 151│    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n*152│    pub peer_pump: bool,\n*153│    /// Registry feed push cadence (D9-1).\n*154│    pub registry_pump_period: Duration,\n*155│    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n*156│    /// node not heard within this window are evicted on the next registry\n*157│    /// pump tick — a dead node identity must not poison bare-id resolution\n## conn.rs\n   7│//! ACROSS a blocking [`write_frame`]. On Windows, `interprocess 2.4.2` routes\n  *8│//! that send to `WriteFileEx` + `SleepEx(INFINITE, alertable)` — a local-socket\n   9│//! path with **no supported write timeout** (`set_timeout` → `Unsupported`).\n  10│//! A connected consumer that stops reading (an `rc --take` whose process\n  11│//! wedged; a suspended brain) therefore blocks the write INDEFINITELY, and the\n    │...\n  32│//! connection and aborts the in-flight I/O (`CancelIoEx` on Windows — the\n *33│//! completion APC makes the wedged `SleepEx` loop return with\n  34│//! `ERROR_OPERATION_ABORTED`; `shutdown(SHUT_RDWR)` on Unix — the blocked\n  35│//! write returns `EPIPE`). A gate-waiter that exhausts its own deadline fires\n  36│//! the same abort (the stuck op it waited behind is the wedge).\n    │...\n 307│        }\n*308│        // Wake gate-waiters so they observe the poison instead of sleeping\n 309│        // out their full deadline, and the watchdog so it re-evaluates.\n 310│        self.gate_cv.notify_all();\n 311│        self.dog_cv.notify_all();\n    │...\n 337│\n*338│    /// The watchdog body: park until a write is in flight, then sleep to its\n 339│    /// absolute deadline. If the op is still in flight at the deadline,\n 340│    /// poison + cancel, re-canceling periodically until the op reports\n 341│    /// completion (the writer clears `inflight` the instant `write_frame`\n    │...\n 358│            };\n*359│            // Sleep toward the deadline while THIS op stays in flight.\n 360│            let fired = loop {\n 361│                if d.shutdown {\n 362│                    return;\n## consent.rs\n 12│//!   orchestrator should prompt.\n*13│//! - [`most_recently_active`] — resolve that target over the **v1 registry**\n 14│//!   (live perches + their `last_active_ms` recency stamp). This is the\n*15│//!   registry-resolution precursor CONTEXT names; the deferred PresenceChannel\n 16│//!   later generalizes it.\n 17│//!\n 18│//! What C2 deliberately does **not** build: the interactive prompt UX itself.\n   │...\n 71│///\n*72│/// This is the **v1 registry resolution** the consent flow rides — live perches +\n 73│/// their recency stamp, not the deferred PresenceChannel. The resolver core is\n 74│/// shared with the notif engine ([`crate::notif::most_recently_active_where`],\n 75│/// D8b — the subnet-scoped form); consent is the degenerate (unscoped) call.\n## crc_swap.rs\n 549│        #[cfg(target_os = \"linux\")]\n*550│        let image = std::path::PathBuf::from(\"/bin/sleep\");\n 551│        if !image.exists() {\n 552│            return; // no reference image on this host — inconclusive, not a fail\n 553│        }\n    │...\n 566│        // Give the OS a beat to map the image.\n*567│        std::thread::sleep(std::time::Duration::from_millis(150));\n 568│\n 569│        let plan = plan_crc_swap(s, i).unwrap();\n 570│        let result = apply_crc_swap(&plan);\n## daemon.rs\n   31│use crate::nethost::{NetConfig, NetHost};\n  *32│use crate::seedmap::{self, SeedRegistry};\n   33│\n   34│/// How long auto-start waits for a freshly-spawned daemon to bind its channel.\n   35│const START_TIMEOUT: Duration = Duration::from_secs(5);\n  *36│/// Poll cadence while waiting for the spawned daemon to come up.\n  *37│const START_POLL: Duration = Duration::from_millis(25);\n   38│\n   39│/// The per-machine broker/brain daemon process.\n   40│pub struct Daemon;\n     │...\n  120│\n *121│        let reg = Arc::new(SeedRegistry::new());\n  122│\n  123│        // Boot housekeeping (KNOWN-HAZARDS 1.3): sweep stale `index.lock`\n  124│        // wedges out of the git-touching runtime the daemon hosts — the\n     │...\n  195│                    });\n *196│                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n  197│                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n  198│                // so they live with the restartable brain and respawn with it.\n  199│                // The broker keeps only the NetHost bring-up and the boot-race\n *200│                // self-heal that binds it; the brain polls `net-status` and\n  201│                // starts the consumers once net reports enabled.\n  202│                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n  203│                    if !net_up && node_hex.is_some() {\n     │...\n  272│        // nothing — the slot is ephemeral control, a restart correctly drops it).\n *273│        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n  274│        // [impl->REQ-SHELL-3]\n  275│        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n  276│        {\n     │...\n  282│\n *283│        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n  284│        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n  285│        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n  286│        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n     │...\n  442│    loop {\n *443│        thread::sleep(backoff);\n  444│        if let Some(host) = try_start_net() {\n  445│            if broker.attach_net(host) {\n  446│                eprintln!(\"NET_ATTACHED: net endpoint bound on retry — brain starts the consumers\");\n     │...\n  486│        }\n *487│        thread::sleep(START_POLL);\n *488│        waited += START_POLL;\n  489│    }\n  490│    Err(io::Error::new(\n  491│        io::ErrorKind::TimedOut,\n     │...\n  929│/// the real per-rung launchers and log which rung won. The caller still confirms\n *930│/// readiness via the existing `brain.ready` poll — the returned pid is for\n  931│/// logging/return, not readiness (WMI/schtasks pids are the launcher's view).\n  932│// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n  933│#[cfg(windows)]\n     │...\n 1185│/// is recoverable from schtasks → returns a sentinel; readiness is the caller's\n*1186│/// `brain.ready` poll. This is the FALLBACK rung (WMI is primary); its `/tr`\n 1187│/// quoting is best-effort.\n 1188│// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n 1189│#[cfg(windows)]\n     │...\n 1225│    }\n*1226│    // No pid from schtasks; sentinel — readiness is the brain.ready poll.\n 1227│    Ok(0)\n 1228│}\n 1229│\n     │...\n 1267│    use super::*;\n*1268│    use crate::seedmap::{serve_seed_control, SeedRegistry};\n 1269│    use crate::test_home::with_home;\n 1270│\n 1271│    // [unit->REQ-HAZARD-DETACHED-DAEMON-STDIO] the detached-in-fact decision is EXACTLY\n     │...\n 1299│    // and caps at NET_RETRY_CAP — so a long boot-race wait settles to a steady\n*1300│    // 30s poll, never an ever-growing or zero-length spin.\n 1301│    #[test]\n 1302│    fn net_retry_backoff_doubles_then_caps() {\n 1303│        assert_eq!(net_retry_backoff(NET_RETRY_FIRST), Duration::from_secs(2));\n     │...\n 1533│            std::fs::write(&pidfile, gc.to_string()).expect(\"launcher: write gc pid\");\n*1534│            std::thread::sleep(Duration::from_secs(300));\n 1535│            std::process::exit(0);\n 1536│        }\n 1537│\n     │...\n 1614│                }\n*1615│                std::thread::sleep(Duration::from_millis(20));\n 1616│            }\n 1617│            found.expect(\"launcher reports its grandchild pid\")\n 1618│        };\n     │...\n 1625│        for _ in 0..25 {\n*1626│            std::thread::sleep(Duration::from_millis(40));\n 1627│            if !is_process_alive(gc) {\n 1628│                still_alive = false;\n 1629│                break;\n     │...\n 1700│\n*1701│            let reg = Arc::new(SeedRegistry::new());\n 1702│            let name = seed_socket_name();\n 1703│            let srv = Arc::clone(&reg);\n 1704│            let serve_name = name.clone();\n## deadline.rs\n  10│//!\n *11│//! - [`DeadlineAnchor`] — a **periodic** `(anchor, interval)` grid. Persisted\n  12│//!   ONCE per fresh/crash start; every fire is derived functionally\n  13│//!   ([`DeadlineAnchor::next_fire`]) with **no per-fire write**. An\n  14│//!   [`StartReason::Update`] restart keeps the anchor (phase preserved, lands\n    │...\n  29│//!\n *30│//! **[V4] Only phase-significant loops convert.** The idempotent pump cadences\n *31│//! (`pump`) need none — they already stagger from everything-due-now,\n  32│//! catch-up/idempotent/restart-safe; converting them would re-add the per-loop\n  33│//! writes Q4 minimizes.\n  34│\n    │...\n  53│/// On-disk shape of a periodic deadline anchor (`<spt_home>/deadline-<key>.json`).\n *54│/// `interval_ms > 0` is an invariant the constructor enforces, so the pure derive\n  55│/// never divides by zero.\n  56│// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n  57│#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]\n  58│pub struct DeadlineAnchor {\n *59│    /// Epoch-ms grid origin. Periodic fires land at `anchor_ms + k·interval_ms`.\n  60│    pub anchor_ms: u64,\n  61│    /// Grid spacing in ms. Always `> 0` (the constructor degrades a zero value).\n *62│    pub interval_ms: u64,\n  63│}\n  64│\n  65│impl DeadlineAnchor {\n *66│    /// Resolve a non-zero interval (doyle minor — ONE degrade rule, unit-tested):\n *67│    /// a zero `interval_ms` degrades to the config default pulse period (a `const`\n  68│    /// that is always `> 0`), so the derive can never divide by zero. The `else\n  69│    /// 1ms` floor is belt-and-braces should that default ever be made zero.\n *70│    fn effective_interval(interval_ms: u64) -> u64 {\n *71│        if interval_ms > 0 {\n *72│            return interval_ms;\n  73│        }\n  74│        let default_ms = DEFAULT_PULSE_PERIOD.as_millis() as u64;\n  75│        default_ms.max(1)\n    │...\n  81│    /// - [`StartReason::Update`] → **keep** the existing anchor (phase preserved);\n *82│    ///   only the interval refreshes from live config. If no file exists (updating\n  83│    ///   *from* a pre-D5 binary that never wrote one), fall back to a fresh anchor\n  84│    ///   — never fail an update on a missing file.\n  85│    /// - [`StartReason::Crash`] / [`StartReason::Cold`] → write a **fresh** anchor\n    │...\n  88│    /// A corrupt file is treated as absent (degrade-to-fresh), matching\n *89│    /// `DaemonConfig::load_from` / `EffectJournal::open`. `interval_ms` is always\n  90│    /// (re)written from the caller's live config value, so a per-machine period\n  91│    /// change takes effect on the next start.\n  92│    pub fn open(\n  93│        key: &str,\n *94│        interval_ms: u64,\n  95│        reason: StartReason,\n  96│        now_ms: u64,\n  97│    ) -> std::io::Result<Self> {\n  98│        let path = anchor_path(key);\n *99│        let interval_ms = Self::effective_interval(interval_ms);\n 100│        let anchor = match (reason, Self::load(&path)) {\n*101│            // Update keeps the persisted phase; the interval refreshes to config.\n 102│            (StartReason::Update, Some(prev)) => DeadlineAnchor {\n 103│                anchor_ms: prev.anchor_ms,\n*104│                interval_ms,\n 105│            },\n 106│            // Update-with-no-file falls back to fresh; crash/cold are always fresh.\n 107│            _ => DeadlineAnchor {\n 108│                anchor_ms: now_ms,\n*109│                interval_ms,\n 110│            },\n 111│        };\n 112│        anchor.save(&path)?;\n    │...\n 133│    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n*134│    /// `anchor + interval · ⌈max(0, now − anchor) / interval⌉`.\n 135│    ///\n 136│    /// On an exact grid instant this returns `now` (fire-now); a long jump\n*137│    /// (`now ≫ anchor`) snaps to the next grid point, collapsing missed ticks to\n 138│    /// one (idempotent catch-up, no fire-storm). Saturating throughout (the\n## digest.rs\n 117│/// `from` points at the changed tail (a minimal delta); a window slide evicts the\n*118│/// oldest turn → the heads differ from index 0 → `from == 0` (a full refresh).\n 119│pub fn common_prefix_len(a: &[Turn], b: &[Turn]) -> usize {\n 120│    a.iter().zip(b.iter()).take_while(|(x, y)| x == y).count()\n 121│}\n    │...\n 148│        .and_then(|adapter| {\n*149│            spt_runtime::registry::resolve_option(&perch::adapters_dir(), adapter).ok()\n 150│        });\n 151│    let install_dir = resolved\n 152│        .as_ref()\n    │...\n 531│    // [unit->REQ-TERM-4] the diff base: a shared head yields its length (a tail\n*532│    // delta); a divergent front yields 0 (a full refresh).\n 533│    #[test]\n 534│    fn common_prefix_len_finds_the_unchanged_head() {\n 535│        let a = vec![turn(\"a\"), turn(\"b\")];\n    │...\n 801│            std::fs::write(asrc.join(\"manifest.toml\"), manifest).unwrap();\n*802│            spt_runtime::registry::register(&perch::adapters_dir(), &asrc, 1).unwrap();\n 803│\n 804│            // The endpoint records the adapter; the ledger holds both sessions.\n 805│            let perch = perch::resolve_perch_path(\"span\", ParentHint::Infer);\n## digesthub.rs\n  89│\n *90│/// The daemon's per-endpoint live-digest registry. The brain publishes; the\n  91│/// control channel reads + subscribes. Holds only the projected digest state —\n  92│/// the same ephemeral-projection category as the broker's accepted-socket\n *93│/// bookkeeping, not routing/registry/parse logic (the parse already happened in\n  94│/// the brain's engine).\n  95│#[derive(Default)]\n  96│pub struct DigestHub {\n    │...\n 121│        // The changed turns begin past the equal-by-value head; a window slide\n*122│        // (front eviction) diverges at 0 → a full refresh.\n 123│        let from = common_prefix_len(&st.snapshot.turns, &new.turns);\n 124│        st.version += 1;\n 125│        let update = DigestUpdate {\n    │...\n 463│    // [unit->REQ-TERM-4] the delta a publish fans out: an active-turn growth is a\n*464│    // tail delta (from past the unchanged head); a window slide refreshes from 0.\n 465│    #[test]\n*466│    fn publish_delta_is_tail_then_full_refresh() {\n 467│        let hub = DigestHub::new();\n 468│        let (_b, _v, rx) = hub.subscribe(\"doyle\");\n 469│        hub.project_and_publish(\"doyle\", digest(vec![turn(\"a\"), turn(\"b\")]));\n    │...\n 477│        assert_eq!(up.turns[0].input.as_deref(), Some(\"c\"));\n*478│        // A front eviction (window slide) diverges at 0 → full refresh.\n 479│        hub.project_and_publish(\"doyle\", digest(vec![turn(\"b\"), turn(\"c\"), turn(\"d\")]));\n 480│        let up = rx.recv().unwrap();\n 481│        assert_eq!(up.from, 0, \"front eviction resends from 0\");\n## dispatch.rs\n  *1│//! Inbound net-stream dispatch (D9-1) — the daemon-side acceptor that turns\n   2│//! the hand-wired serve loops of D5–D8 into production behavior.\n   3│//!\n   4│//! Every E2E test so far drove the serve half manually (a probe brain calling\n    │...\n  13│//!\n *14│//! The stream table holds locally-opened outbound streams too. The dispatcher\n  15│//! claims only rows with `initiated_locally == false` — serving our own\n  16│//! requester stream would deadlock the requester against ourselves. The flag\n  17│//! is broker-recorded at registration (`open_stream` vs the accept loop),\n    │...\n  36│//! | untagged + `target`+`op_id` | WAN message feed ([`crate::wan::receive_wan`]) |\n *37│//! | untagged + `subnet`+`instance` | registry feed (D9-1-2) |\n  38│//! | anything else | unknown — dropped, loud |\n  39│//!\n  40│//! A family whose production wiring lands in a later slice is still\n  41│//! classified here (the table is complete) but routed to a typed\n *42│//! [`Unwired`](DispatchOutcome::Unwired) drop — loud, never silent.\n  43│//!\n  44│//! ## Worker model\n  45│//!\n    │...\n  66│use spt_net::net::replicate::{\n *67│    FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,\n  68│};\n  69│use spt_net::net::wanmsg::{WanDecoder, WanReply};\n  70│use spt_store::contextstore::ContextStore;\n    │...\n  78│use crate::propagate::serve_update;\n *79│use crate::registryhost::{RegistryGatePolicy, RegistryHost};\n  80│use crate::relcache::ReleaseCache;\n  81│use crate::sync::{serve_sync, SyncPolicy};\n  82│use crate::wan::receive_wan;\n    │...\n  84│\n *85│/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;\n  86│/// workers block on their stream's event feed).\n *87│pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n  88│\n  89│/// What protocol a peer-initiated stream speaks, by its first record's shape.\n  90│#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n    │...\n  99│    WanMsg,\n*100│    /// A registry replication feed (untagged `RegistryUpdate` lines).\n*101│    Registry,\n 102│    /// A remote-drive attach (`AttachRecord::Request`).\n 103│    Attach,\n 104│    /// A file transfer (`XferRecord::Fetch`/`Push`).\n    │...\n 141│            } else if line.get(\"subnet\").is_some() && line.get(\"instance\").is_some() {\n*142│                StreamFamily::Registry\n 143│            } else if line.get(\"subnet\").is_some()\n 144│                && line.get(\"node\").is_some()\n 145│                && line.get(\"label\").is_some()\n    │...\n 149│                // first line is a NodeLabelUpdate. Same serve arm, same gate.\n*150│                StreamFamily::Registry\n 151│            } else {\n 152│                StreamFamily::Unknown\n 153│            }\n    │...\n 157│\n*158│/// Why a dispatched stream's worker ended — loud + typed, never silent.\n 159│#[derive(Debug)]\n*160│pub enum DispatchOutcome {\n 161│    /// The family's serve loop ran to its own outcome (rendered for the log).\n 162│    Served(String),\n 163│    /// The first line never arrived / didn't parse — dropped.\n    │...\n 168│\n*169│/// A claimed stream's dispatch lifecycle (ADR-0038 C,\n*170│/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\n 171│/// insert performed BEFORE worker spawn and never cleared — one transient\n 172│/// worker-setup failure permanently abandoned the stream. Claims now\n 173│/// distinguish in-flight vs terminal vs retryable, and a transient failure\n    │...\n 178│    InFlight { attempts: u32 },\n*179│    /// Done for this dispatcher's lifetime: served, unclassifiable, or\n 180│    /// retries exhausted. Terminal outcomes never re-enter the queue.\n 181│    Terminal,\n 182│    /// A transient failure released the claim; eligible again at `next_at`.\n    │...\n 185│\n*186│/// Bounded retry budget per stream per dispatcher lifetime — transient setup\n 187│/// failures recover, a persistently-failing stream goes terminal loud.\n*188│const MAX_DISPATCH_ATTEMPTS: u32 = 3;\n 189│\n 190│/// Backoff base for a released claim (doubles per failed attempt).\n*191│const DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\n 192│\n 193│/// The backoff before retry number `attempts` (1-based) runs.\n 194│fn retry_backoff(attempts: u32) -> Duration {\n## drivehub.rs\n   5│//! channel\" — the opaque control surface). An owner writes one drive frame for a\n  *6│//! shell; the shell binary drains it with an ephemeral `api drive-poll --link`.\n   7│//! Unlike the durable command channel (spooled on the shell perch), a drive\n   8│//! frame is held in a **single in-memory slot per shell** and overwritten on\n  *9│//! every write — a second write before the poll clobbers the first.\n  10│//!\n  11│//! **Where the slot lives (broker, not relay; broker, not brain).** The slot is\n  12│//! held by the always-up BROKER process (alongside [`crate::digesthub::DigestHub`]),\n    │...\n  22│//! stamps each frame with the **writing link token**; [`DriveHub::take`] serves\n *23│//! it only when the polling shell presents that same token. A link-break retires\n  24│//! the token and a relink mints a fresh one ([`crate::shellhost::close_shell`]\n  25│//! removes `LINK_TOKEN_FILE`; relaunch mints anew), so a frame stamped under the\n  26│//! pre-break generation can never match the relinked shell's fresh token — the\n    │...\n  78│\n *79│/// `drive_take` request payload: the slot key plus the polling shell's link\n  80│/// token (the serve gate).\n  81│#[derive(Debug, Clone, Serialize, Deserialize)]\n  82│pub struct DriveTakeReq {\n    │...\n  84│    pub shell_id: String,\n *85│    /// The polling shell's current link token — must match the slot stamp.\n  86│    pub token: String,\n  87│}\n  88│\n    │...\n 310│\n*311│    // [unit->REQ-SHELL-3] latest-wins: a second write before the poll clobbers\n 312│    // the first; the take serves the latest frame.\n 313│    #[test]\n 314│    fn write_is_latest_wins() {\n    │...\n 324│\n*325│    // [unit->REQ-SHELL-3] take-and-clear is exactly-once: a second poll after a\n 326│    // single write returns empty (the slot was cleared on the first take).\n 327│    #[test]\n 328│    fn take_is_exactly_once() {\n    │...\n 343│    // [unit->REQ-SHELL-3] no-replay-across-relink: a frame written under one link\n*344│    // token is NEVER served to a poll presenting a different (relinked) token —\n*345│    // and the dead frame is evicted by that very poll. This is the crash-proof\n 346│    // guarantee that does not depend on the explicit clear-on-close running.\n 347│    #[test]\n 348│    fn dead_generation_frame_is_never_served() {\n    │...\n 350│        hub.write(\"doyle\", \"mock-shell-0\", \"old-token\", \"stale-frame\");\n*351│        // Relink minted \"new-token\"; the shell polls with it.\n 352│        assert_eq!(\n 353│            hub.take(\"doyle\", \"mock-shell-0\", \"new-token\"),\n 354│            None,\n    │...\n 359│            !hub.has_slot(\"doyle\", \"mock-shell-0\"),\n*360│            \"the dead frame is cleared by the mismatching poll\"\n 361│        );\n 362│    }\n 363│\n## effect.rs\n    7│//! kills it. Effects it drives cross the broker↔brain boundary — a PTY write, a\n   *8│//! spool row, a registry update. A brain that crashes *around* one of those\n    9│//! effects must, on restart, neither duplicate it (a re-injected keystroke, a\n   10│//! double-written row) nor drop it (a lost delivery).\n   11│//!\n     │...\n   75│/// Which boundary an effect crosses. Tagged in the journal so the one anchor\n  *76│/// covers all three named side-effect crossings (spool / PTY / registry) — the\n   77│/// hazard requires exactly-once at *every* crossing, not just the PTY write.\n   78│#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n   79│pub enum EffectKind {\n     │...\n   83│    Spool,\n  *84│    /// A registry / `info.json` mutation.\n  *85│    Registry,\n   86│    /// A side-effectful network op the broker performs for the brain (D4): a\n   87│    /// QUIC dial. Net ops cross the same broker↔brain boundary as a PTY write,\n   88│    /// so they ride the same anchor (M4-D4-PLAN: exactly-once discipline\n     │...\n  103│            EffectKind::Spool => \"spool\",\n *104│            EffectKind::Registry => \"registry\",\n  105│            EffectKind::NetDial => \"net-dial\",\n  106│            EffectKind::NetSend => \"net-send\",\n  107│        }\n     │...\n  118│    /// broker surviving the brain IS the dedup anchor for the M3b hazard). The\n *119│    /// durable kinds (spool / registry / net) keep their fsync'd markers.\n  120│    // [impl->REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE]\n  121│    pub fn is_durable(self) -> bool {\n  122│        !matches!(self, EffectKind::PtyWrite)\n     │...\n  139│    Cli,\n *140│    Pump,\n  141│    Rc,\n  142│    Shell,\n  143│    Wake,\n     │...\n  156│            Minter::Cli => \"cli\",\n *157│            Minter::Pump => \"pump\",\n  158│            Minter::Rc => \"rc\",\n  159│            Minter::Shell => \"shell\",\n  160│            Minter::Wake => \"wake\",\n     │...\n  171│            \"cli\" => Minter::Cli,\n *172│            \"pump\" => Minter::Pump,\n  173│            \"rc\" => Minter::Rc,\n  174│            \"shell\" => Minter::Shell,\n  175│            \"wake\" => Minter::Wake,\n     │...\n  370│    /// poison the mutex permanently — and every subsequent journaled op\n *371│    /// (`dispatch_net_stream_open` → `apply_once`) would then panic its per-conn\n  372│    /// reply thread, so attaches silently deadline (`spt rc` → \"brain IPC read\n  373│    /// deadline elapsed\") while non-journaled ops keep working. Recovering via\n  374│    /// `PoisonError::into_inner` keeps the broker serving. The protected state stays\n     │...\n  395│    /// not-draining ConPTY/forkpty) parked the lock forever → the single-threaded\n *396│    /// dispatch could open no attaches (`spt rc` → \"brain IPC read deadline\"), and\n  397│    /// every keystroke paid two fsyncs serialized (the stutter). Now: reserve the\n  398│    /// key (fsync `PENDING` for DURABLE kinds) under the lock, RELEASE, run the\n  399│    /// effect OFF the lock, then re-acquire to finalize (fsync `DONE` for durable,\n     │...\n  733│            let j = EffectJournal::open(&path).unwrap();\n *734│            j.apply_once(key, EffectKind::Registry, || Ok(())).unwrap();\n  735│        }\n  736│        // Fresh open == a broker restart re-reading its own journal.\n  737│        let j2 = EffectJournal::open(&path).unwrap();\n     │...\n  743│        let o = j2\n *744│            .apply_once(key, EffectKind::Registry, || {\n  745│                *runs.borrow_mut() += 1;\n  746│                Ok(())\n  747│            })\n     │...\n  761│    // Both must yield exactly-once across the whole gauntlet. We cover all three\n *762│    // EffectKinds (spool / PTY / registry) by cycling the kind per op, so every\n  763│    // named boundary is value-set verified.\n  764│\n  765│    #[derive(Clone, Copy, PartialEq)]\n     │...\n  774│            1 => EffectKind::Spool,\n *775│            _ => EffectKind::Registry,\n  776│        }\n  777│    }\n  778│\n     │...\n  813│    // keystroke, another attach's journaled input) wedges, and the single-\n *814│    // threaded dispatch can no longer service `spt rc` attaches. Both units below\n  815│    // FAIL against the current (unfixed) code = the RED repro. They COMPILE\n  816│    // against current APIs (no use of the not-yet-existing `is_durable()`).\n  817│\n     │...\n  849│        entered_rx\n *850│            .recv_timeout(Duration::from_secs(2))\n  851│            .expect(\"blocked effect should enter its closure\");\n  852│\n  853│        // Thread 2: a DIFFERENT key. Under a correct (lock-released-across-effect)\n     │...\n  865│        // Watchdog: a wedge surfaces as a timeout (failure), not a hang.\n *866│        let progressed = done_rx.recv_timeout(Duration::from_secs(2)).is_ok();\n  867│\n  868│        // Let thread 1 finish regardless, so we never leak a blocked thread.\n  869│        let _ = release_tx.send(());\n     │...\n 1003│            Minter::Cli,\n*1004│            Minter::Pump,\n 1005│            Minter::Rc,\n 1006│            Minter::Shell,\n 1007│            Minter::Wake,\n     │...\n 1109│            Minter::Cli,\n*1110│            Minter::Pump,\n 1111│            Minter::Rc,\n 1112│            Minter::Shell,\n 1113│            Minter::Wake,\n## endpoint.rs\n   9│//! daemon computes the **same** names as the client that started it — that\n *10│//! shared derivation is the whole of the rendezvous (no registry lookup).\n  11│// [impl->REQ-DAEMON-3]\n  12│\n  13│use std::hash::{Hash, Hasher};\n    │...\n  47│/// The drive-control listener name (M11-W2): the channel `spt shell drive` (owner\n *48│/// write) and `api drive-poll --link` (shell take-and-clear) connect to for the\n  49│/// per-shell ephemeral drive slot (REQ-SHELL-3). Broker-served like the digest\n  50│/// channel; the slot is in-memory and dies with the daemon.\n  51│// [impl->REQ-SHELL-3]\n    │...\n  57│/// duplex) and the shell binary's `api tunnel` connect to for the per-shell opaque\n *58│/// byte tunnel registry (REQ-SHELL-4). Broker-served like the drive channel; the\n *59│/// registry holds only held stream ids + the link-token stamp and dies with the\n  60│/// daemon.\n  61│// [impl->REQ-SHELL-4]\n  62│pub fn tunnel_socket_name() -> String {\n    │...\n  76│/// supervised child process (ADR-0018 Q2/Q3 — the two-process restoration); the\n *77│/// child writes this once it has connected to the broker socket, and refreshes\n  78│/// it while attached. A test (or a future readiness-gated rollback, ADR-0018\n  79│/// Q7) reads it to confirm the brain came up and — on a pid change — that it\n  80│/// respawned. Best-effort like the daemon pid breadcrumb; liveness of the\n    │...\n  86│\n *87│/// Where the peer pump records its last-tick heartbeat (epoch ms, M8\n *88│/// decision 23 / REQ-DAEMON-5): written each pump tick (D4), read by\n *89│/// `spt daemon status` so a half-dead daemon (pump stalled, dispatcher\n  90│/// alive — the 2026-06-07 hfenduleam shape) renders honestly.\n *91│pub fn pump_heartbeat_path() -> PathBuf {\n *92│    spt_home().join(\"identity\").join(\"pump-heartbeat.json\")\n  93│}\n  94│\n *95│/// Read the pump's last-tick heartbeat (epoch ms). `None` = never written\n *96│/// (a pre-M8 daemon, or one that has not completed a first tick).\n  97│// [impl->REQ-CLI-2]\n *98│pub fn read_pump_heartbeat() -> Option<u64> {\n *99│    let s = std::fs::read_to_string(pump_heartbeat_path()).ok()?;\n 100│    serde_json::from_str::<u64>(s.trim()).ok()\n 101│}\n 102│\n*103│/// Read the pump's reachability health snapshot (`identity/pump-health.json`,\n*104│/// ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH). `None` = no pump has ever\n 105│/// written one on this home (an older daemon, or none ran yet).\n*106│// [impl->REQ-PUMP-STAGE-TRUTH]\n*107│pub fn read_pump_health() -> Option<crate::pump::health::PumpHealth> {\n*108│    let path = crate::pump::health::PumpHealth::path_beside(&pump_heartbeat_path());\n 109│    std::fs::metadata(&path).ok()?;\n*110│    Some(crate::pump::health::PumpHealth::load_from(&path))\n 111│}","missingPaths":["crates/spt-core/src"],"truncation":{"content":"# crates/spt-daemon/src/\n## access.rs\n 4|//! order: subnet *visibility* (is the endpoint routable here at all? —\n*5|//! `spt_store::visibility`, applied inside registry resolution) → the\n 6|//! **endpoint access whitelist** (may *your node* remotely reach it? — THIS\n 7|//! module) → *capability grants* (may this agent do this high-risk thing? —\n 8|//! [`crate::consent`], default-deny). The whitelist is the outer gate before\n## adapter_update.rs\n 7|//! its manifest `[update]` block ([`Update`]); this module turns that directive\n*8|//! into a per-adapter [`AdapterUpdateOutcome`], dispatched by avenue:\n 9|//!\n 10|//! - **`file_pull`** — spt-core controls the bytes, so it *verifies* them: the\n 11|//!   pulled payload is checked against the adapter's **own** Ed25519 key (declared\n...\n 163|/// is complete here. Soft-deregistered adapters are excluded by\n*164|/// [`spt_runtime::registry::registered`].\n 165|// [impl->REQ-INSTALL-4]\n 166|pub fn ripple_registered(adapters_dir: &std::path::Path) -> Vec<(String, AdapterUpdateOutcome)> {\n*167|    let mut set = spt_runtime::registry::registered(adapters_dir);\n 168|    set.sort_by_key(|(r, _)| r.registered_at_ms);\n 169|    set.iter()\n 170|        .map(|(r, m)| {\n...\n 408|        // Register out of name order to prove registration-time ordering.\n*409|        spt_runtime::registry::register(&adapters_dir, &updatable, 100).unwrap();\n*410|        spt_runtime::registry::register(&adapters_dir, &plain, 200).unwrap();\n*411|        spt_runtime::registry::register(&adapters_dir, &gone, 300).unwrap();\n*412|        spt_runtime::registry::deregister(&adapters_dir, \"gone\").unwrap();\n 413|\n 414|        let out = ripple_registered(&adapters_dir);\n 415|        assert_eq!(\n## applyhost.rs\n 11|//!\n*12|//! [`apply_staged`] drives the whole chain against what the peer pump left\n 13|//! behind (REQ-UPD-4: staged + consent-notified, never auto-applied):\n 14|//!\n 15|//! 1. **Re-verify at rest** (`plan_verified` under the production\n...\n 167|    // disk. Fail-closed on an unprovisioned key file (same posture as the\n*168|    // pump's pull leg).\n 169|    let policy = VerifyPolicy::load_from(release_keys, 0, now_ms());\n 170|    if policy.trusted_keys.is_empty() {\n 171|        return Ok(Prepared::Done(ApplyStagedOutcome::Rejected(\n...\n 352|/// Cycle the brain of a RUNNING daemon with NO binary swap and NO staging\n*353|/// preconditions (REQ-DAEMON-REFRESH, `spt daemon refresh`): connect to the\n 354|/// broker and raise the same supervisor brain-restart signal the post-swap\n 355|/// apply rides ([`Brain::request_brain_restart`], ADR-0018 D3-3) — brain stop →\n 356|/// respawn → readiness trial → promote, broker + every hosted PTY untouched by\n...\n 362|/// (accepted, not acted on).\n*363|// [impl->REQ-DAEMON-REFRESH]\n*364|pub fn refresh_brain(broker_name: &str) -> Result<bool, String> {\n 365|    let mut brain = connect_retry(broker_name).map_err(|e| format!(\"broker connect: {e}\"))?;\n 366|    brain\n 367|        .request_brain_restart()\n...\n 461|        }\n*462|        std::thread::sleep(Duration::from_millis(10));\n 463|    }\n 464|    Err(last)\n 465|}\n...\n 560|            }\n*561|            std::thread::sleep(Duration::from_millis(10));\n 562|        }\n 563|        panic!(\"brain cold-start could not connect\");\n 564|    }\n...\n 567|    // COMPILED image version over IPC: a Brain connected to a live broker gets back\n*568|    // Some(the broker's own CARGO_PKG_VERSION) — the KIND_BROKER_IMAGE dispatch +\n 569|    // reply round-trip end to end (the new-broker leg; the old-broker→None leg rides\n 570|    // the router's `unknown command kind` default, caught client-side as None).\n 571|    #[test]\n...\n 760|        //    registered platform that is not this host — derived from the\n*761|        //    SUPPORTED_PLATFORMS registry (not a hardcoded win/linux pair), so a\n 762|        //    third platform (musl) is covered with no edit here.\n 763|        let other = crate::release::SUPPORTED_PLATFORMS\n 764|            .iter()\n...\n 766|            .find(|&t| t != current_platform())\n*767|            .expect(\"registry must have a platform other than the current host\");\n 768|        cache\n 769|            .stage_single_with_platform(&signed, b\"CROSS-OS BYTES\", other)\n 770|            .unwrap();\n...\n 822|\n*823|    // [unit->REQ-DAEMON-REFRESH] `refresh_brain` routes the SAME supervisor\n 824|    // brain-cycle signal as the post-swap apply — against a bare broker with NO\n 825|    // staged release, NO release cache, NO binary swap. The verb has no staging\n 826|    // preconditions: the signal raises and `honored` reports the supervisor\n...\n 828|    #[test]\n*829|    fn refresh_brain_cycles_without_staging_or_swap_preconditions() {\n 830|        let name = unique_name();\n 831|        let broker = served_broker(&name);\n 832|\n*833|        // No supervisor wired: the refresh round-trips and reports not-honored.\n 834|        assert!(\n*835|            !refresh_brain(&name).expect(\"refresh round-trips on a bare broker\"),\n 836|            \"no supervisor wired must report honored=false\"\n 837|        );\n 838|\n*839|        // Supervisor wired: refresh raises the same planned-restart signal the\n 840|        // apply path rides — with nothing staged anywhere.\n 841|        let signal = Arc::new(crate::brainproc::BrainRestart::new());\n 842|        assert!(broker.set_brain_restart(Arc::clone(&signal)), \"first wire wins\");\n 843|        assert!(\n*844|            refresh_brain(&name).expect(\"refresh round-trips\"),\n 845|            \"a wired supervisor must report honored=true\"\n 846|        );\n 847|        assert!(\n 848|            signal.take(),\n*849|            \"refresh must raise the planned-restart signal the supervisor consumes\"\n 850|        );\n 851|    }\n 852|\n## attach.rs\n 4|//! The operator's daemon opened a bidi QUIC stream to this node (D4) and sent\n*5|//! [`AttachRecord::Request`]; this module is the target-side pump between that\n 6|//! stream and the local broker-hosted session:\n 7|//!\n 8|//! - session `Output` chunks → [`AttachRecord::Output`] lines onto the wire\n...\n 18|//! journaled [`Brain::net_stream_send`] blocks reading events until its ack\n*19|//! and *discards* everything interleaved — inside a full-duplex pump loop that\n 20|//! eats the operator's `Input` records (both sides starve; found the hard way\n 21|//! in `tests/attach.rs`). Idempotency holds without it because each direction\n 22|//! dedups at its **effect**: the PTY write is journaled by the operator-minted\n...\n 99|/// each re-subscribe; without spacing that is an evict→resubscribe CPU spin. With\n*100|/// it, the operator sees an intermittent LIVE burst each interval (forward\n 101|/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.\n*102|const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);\n 103|\n 104|/// The CONTROLLER fell behind the live ring further than the ring holds — the\n 105|/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an\n...\n 206|/// `session_id` it could not have. `None` ⇒ no live session under that endpoint\n*207|/// (a stale registry row routed us an attach for something gone → the caller\n 208|/// refuses cleanly, D6).\n 209|// [impl->REQ-RC-CROSS-NODE-ATTACH]\n 210|pub(crate) fn resolve_local_session(brain: &mut Brain, endpoint: &str) -> Option<u64> {\n...\n 220|/// One attach `Request` — the SINGLE handling path for both a wire-arriving\n*221|/// record and the dispatcher's durable-opener seed (ADR-0038 B; one\n 222|/// implementation so the two entries cannot drift):\n 223|///\n 224|/// - Unsolicited-inbound gate (ADR-0009) under the transport-proven origin;\n...\n 226|///   denial finishes our send side and ends the serve (`Some(Refused)`).\n*227|/// - Cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH): the dispatcher-resolved\n 228|///   session id wins (the owning node is authoritative for its own table);\n 229|///   the LOCAL path uses the wire `session_id` unchanged.\n 230|/// - Role-aware subscribe (REQ-RCVIEW-1): the broker resolves controller /\n...\n 279|/// the replayed `Request`/`Input` records re-gate and dedup at the PTY\n*280|/// journal, and re-pumped output dedups at the operator's render cursor).\n 281|///\n 282|/// `remote_session` is `Some(sid)` ONLY on the cross-node leg (#4,\n*283|/// REQ-RC-CROSS-NODE-ATTACH): the dispatcher has ALREADY resolved endpoint→our\n 284|/// session id ([`resolve_local_session`]) BEFORE this serve loop subscribed, so\n 285|/// the wire's placeholder `session_id` (0) is overridden here with the resolved\n 286|/// id. It is passed down — never re-queried mid-loop — because a `sessions()`\n...\n 293|/// record — a reconstruction that waited for one would idle forever. The\n*294|/// dispatcher hands the durable opener here and it is handled EXACTLY like a\n 295|/// wire-arriving Request (same gate, same subscribe); a Request that then\n 296|/// replays from the ring anyway re-runs the same-identity re-take, which is\n 297|/// silent and idempotent (the successor-re-take parity the fix must keep).\n...\n 359|\n*360|    // Durable-opener seed (ADR-0038 B): process the dispatcher-pinned Request\n 361|    // BEFORE the event loop, through the exact wire-Request path — a rolled\n 362|    // ring can no longer replay it. Non-Request seeds are ignored (the opener\n 363|    // of an attach stream is always its Request).\n...\n 442|                            intent: req_intent,\n*443|                            // The dispatcher already resolved endpoint_id→session\n 444|                            // (passed as remote_session) BEFORE this loop; ignore\n 445|                            // the wire copy here (a mid-loop re-resolve would swallow\n 446|                            // interleaved attach records — see remote_session docs).\n...\n 561|            // the attach down: DISTINCT from a session-exit EOF. Rate-limited\n*562|            // (RESUBSCRIBE_INTERVAL) so a hopelessly-behind viewer under sustained\n 563|            // flood sees intermittent LIVE bursts, never an evict→resubscribe CPU\n 564|            // spin. The next live Output carries a forward seq jump; the operator's\n 565|            // render cursor snaps to it (tail -f reconnect). VIEWER-only → B2-safe.\n...\n 571|                    let since = prev.elapsed();\n*572|                    if since < RESUBSCRIBE_INTERVAL {\n*573|                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n 574|                    }\n 575|                }\n 576|                brain.attach_skip_to_live(sid, Some(origin_node))?;\n## autostart.rs\n 14|//! restore-what-was-up was rejected): the adapter option re-resolves against\n*15|//! the live registry, the session id is freshly minted, and home rides the\n 16|//! endpoint's existing perch (durable — REQ-INST-15), so no `--subnet` is\n 17|//! recorded or needed.\n 18|\n...\n 49|        let (record, manifest) =\n*50|            match spt_runtime::registry::resolve_option(&adapters_dir, &entry.adapter) {\n 51|                Ok((r, m)) if m.adapter.kind == spt_runtime::manifest::AdapterKind::Harness => {\n 52|                    (r, m)\n 53|                }\n...\n 104|                    if attempt < LAUNCH_ATTEMPTS {\n*105|                        std::thread::sleep(LAUNCH_RETRY_DELAY);\n 106|                    }\n 107|                }\n 108|            }\n...\n 137|        });\n*138|        rx.recv_timeout(budget).expect(\n 139|            \"replay_startup_endpoints must return promptly on the pre-launch paths \\\n 140|             (empty list / unresolved adapter loud-skip), never hang the boot thread\",\n 141|        );\n## brain.rs\n 159|    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n*160|    /// (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — the bare ack for\n 161|    /// [`Brain::submit_dial`]. The dial's real outcome rides the presence stream\n 162|    /// ([`Self::NetPresence`]), not this frame.\n 163|    NetDialSubmitted,\n...\n 208|/// The brain's IPC carrier — either the ordinary whole [`Stream`] (every\n*209|/// non-pump client: blocking, unbounded reads, correct everywhere) or a\n*210|/// **split** carrier for the peer pump.\n 211|///\n*212|/// **Why the split exists (REQ-HAZARD-PUMP-IPC-DEADLINE).** The pump is\n 213|/// single-threaded; a brain-IPC read that blocks forever on a black-holed peer\n 214|/// wedges the whole loop (the 2.2h hfenduleam stall). The deadline must be\n 215|/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n*216|/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n 217|/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n*218|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 219|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 220|/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n*221|/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n*222|/// channel supplies the deadline. On a timeout the pump bubbles out to a\n 223|/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n 224|/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n 225|/// old conn's drop eventually errors its read and the thread exits).\n 226|enum BrainConn {\n*227|    /// The ordinary blocking carrier — every non-pump brain.\n 228|    Whole(Stream),\n*229|    /// The pump carrier: writes go out [`SendHalf`]; framed reads arrive over\n*230|    /// `frames` from the reader thread (`_reader`, named `pump-ipc-reader`).\n 231|    Split {\n 232|        send: SendHalf,\n 233|        frames: Receiver<io::Result<Envelope>>,\n...\n 242|impl BrainConn {\n*243|    /// Split a connected+handshaked stream into the pump carrier: spawn the\n*244|    /// `pump-ipc-reader` thread (blocking [`read_frame`] → channel) and keep the\n 245|    /// [`SendHalf`] for writes. The reader logs spawn/exit so a leaked (parked)\n 246|    /// reader is diagnosable in the field (KH 7.6).\n*247|    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n 248|    fn split_with_reader(stream: Stream) -> BrainConn {\n 249|        let (mut recv, send) = stream.split();\n 250|        let (tx, frames) = mpsc::channel();\n 251|        let reader = thread::Builder::new()\n*252|            .name(\"pump-ipc-reader\".to_string())\n 253|            .spawn(move || {\n*254|                eprintln!(\"PUMP_IPC_READER: spawned\");\n 255|                loop {\n 256|                    let framed = read_frame(&mut recv);\n 257|                    let was_err = framed.is_err();\n...\n 268|                }\n*269|                eprintln!(\"PUMP_IPC_READER: exited\");\n 270|            })\n*271|            .expect(\"spawn pump-ipc-reader thread\");\n 272|        BrainConn::Split {\n 273|            send,\n 274|            frames,\n...\n 311|    /// When `Some`, every reply read is bounded by this per-call deadline budget\n*312|    /// — set only by [`Brain::cold_start_pump`], which also splits the carrier\n 313|    /// into the reader-thread form so the deadline can be honored over a channel\n*314|    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 315|    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n## brainproc.rs\n 11|//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n*12|//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n 13|//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n 14|//! verb. The digest hub serve + seed-control stay broker-side continuity\n 15|//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche\n...\n 36|\n*37|/// Supervisor backoff floor after a brain death (mirrors the peer-pump\n 38|/// supervisor, M8 decision 23): a healthy run resets to this; a fast death\n 39|/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`].\n 40|const SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(2);\n...\n 55|const TRIAL_PREREADY_BUDGET: u32 = 3;\n*56|/// Poll/sleep slice so a `stop` request (and a child exit) land promptly.\n*57|const TICK: Duration = Duration::from_millis(200);\n 58|\n 59|/// How long the brain child retries connecting to the broker socket before\n 60|/// giving up (the broker may still be binding — the child is freshly spawned).\n 61|const BRAIN_CONNECT_TRIES: u32 = 300;\n*62|/// Cadence the idle brain refreshes its ready breadcrumb + probes the broker.\n 63|const BRAIN_HEARTBEAT: Duration = Duration::from_millis(500);\n 64|\n 65|/// Why the broker spawned this brain — the Q4 update-vs-crash discriminator the\n...\n 107|/// broker's `KIND_BRAIN_RESTART` handler raises it; the supervisor consumes it on\n*108|/// its next wait tick, kills the current brain child, and respawns it with\n 109|/// `start-reason=update` onto the (freshly-swapped) binary. Shared (`Arc`)\n 110|/// between the broker serve path and the supervisor — both run in the broker\n 111|/// process. This is the seam that makes a routine `apply` actually run new code,\n...\n 144|///\n*145|/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\n*146|/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\n 147|/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\n 148|/// broker — a brain respawn re-spawns them from the swapped binary. They are\n 149|/// meaningful only once the broker-owned NetHost is up, so we gate on the\n...\n 238|    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n*239|    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240|    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241|    // shell waker). Online-only is staged behind the interim `api listen`\n 242|    // (status-absent perches are skipped — no double-host) until W0.2 makes the\n...\n 259|    loop {\n*260|        thread::sleep(BRAIN_HEARTBEAT);\n 261|        // `net-status` is both the net-capability probe and the broker-liveness\n 262|        // probe: an `Err` is the broker gone (or a future planned\n 263|        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n...\n 275|            eprintln!(\n*276|                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n 277|            );\n 278|        }\n 279|        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\n*280|        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\n 281|        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\n 282|        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\n 283|        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\n*284|        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\n 285|        // window, so without this the wedge never drains: the promotion DRAINED gate\n 286|        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\n 287|        // drives the evict) stays false for the full trial → \"alive but never ready\"\n...\n 303|/// them. Pure for the unit table — the spawn-exactly-once + net-gating\n*304|/// semantics that keep a single dispatcher/peer-pump set running.\n 305|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 306|fn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\n 307|    net_enabled && !already_started\n...\n 309|\n*310|/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\n 311|/// (D9-1) — against the broker's socket. **Relocated from the broker process to\n 312|/// the brain child (restoration D2-1):** both are standalone IPC clients\n 313|/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\n*314|/// restartable brain. Each mints its own registry + stop flag and connects\n 315|/// independently; when the brain process exits these in-process threads die with\n 316|/// it, and the respawned brain re-spawns them from the current binary. Mirrors\n 317|/// the wiring the broker boot used to do, `node_hex` now sourced from the\n...\n 321|fn spawn_net_consumers(node_hex: &str) {\n*322|    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323|    let stop = Arc::new(AtomicBool::new(false));\n*324|    let _ = crate::dispatch::spawn_dispatcher(\n 325|        broker_socket_name(),\n*326|        Arc::clone(&registry),\n 327|        Arc::clone(&stop),\n 328|    );\n 329|    let cfg = crate::config::DaemonConfig::load();\n*330|    if cfg.peer_pump {\n## broker.rs\n 5|//! the spawned child (both via [`spt_term::PtySession`]), and the accepted\n*6|//! client / listening sockets. It runs **no logic** — no routing, registry,\n 7|//! manifest parse, or lifecycle. It is a relay: spawn a child under a PTY,\n 8|//! forward its output to the brain, inject the brain's input, report exit.\n 9|//!\n...\n 150|/// BOUNDS the wedge: a backed-up controller falls behind for at most this long before\n*151|/// eviction — never forever (the v0.12.x root) — and the drain NEVER blocks or sleeps\n 152|/// (a single off-lock `try_send` per chunk; see [`OutputLog::append`]). A live but\n 153|/// merely slow operator lands a frame before this elapses (resetting `last_ok`) and is\n 154|/// untouched.\n...\n 198|const WAKE_DEDUP_WAIT: Duration = Duration::from_secs(2);\n*199|/// Poll slice while waiting on a racing wake's session to appear.\n*200|const WAKE_DEDUP_POLL: Duration = Duration::from_millis(50);\n 201|\n 202|/// RAII release of a single-flight wake claim (W4, REQ-SPAWN-COLLISION-GUARD-LIVE-DUP):\n 203|/// the broker holds an endpoint id in [`Broker::wake_inflight`] for the duration of a\n...\n 394|/// shared with the inject worker and RESET to 0 on a healthy `{commit}`, so a\n*395|/// respawned binary that recovers refreshes the whole budget (the C3(b) give-up-\n 396|/// budget shape: consecutive-failures bounded, healthy-run resets). Mirrors the\n 397|/// psyche crash-loop backoff's bounded give-up.\n 398|const TRANSLATE_RESPAWN_BUDGET: u32 = 3;\n...\n 426|/// inject after startup, the pre-settle window; re-drives settle again). An echoing PTY\n*427|/// returns in a tick or two, well under this.\n 428|const INJECT_SETTLE_DEADLINE: Duration = Duration::from_millis(400);\n*429|/// Poll/probe cadence within the settle-gate and the echo-verify wait.\n*430|const INJECT_SETTLE_POLL: Duration = Duration::from_millis(40);\n 431|/// The benign readiness probe: a DSR cursor-position query (`ESC[6n`). Invisible to\n 432|/// a TUI input line and never a submit; a live terminal/child answers or re-renders,\n 433|/// producing output — the POSITIVE signal that the input reader is attached.\n...\n 569|    /// writer channel (b4, REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE).\n*570|    /// The drain does a SINGLE non-blocking `try_send` per chunk and NEVER sleeps;\n 571|    /// a channel that stays Full for [`CONTROLLER_WRITE_DEADLINE`] PAST this stamp\n 572|    /// evicts the stalled controller (bounded wedge preserved), while a slow-but-\n 573|    /// alive controller just drops the chunk + falls behind the ring (resume-from-\n...\n 687|/// Returns `(control_write_needed, viewer_write_needed)` — the divergence gate that\n*688|/// keeps the per-poll re-assert from writing (fsync) when nothing changed.\n 689|// [impl->REQ-HAZARD-CONTROL-STAMP-CONVERGENCE]\n 690|fn stamp_divergence(\n 691|    rec_driven_by: Option<&str>,\n...\n 704|/// REQ-CONTROL-STAMP-CONVERGENCE): the generation counter a definitive\n*705|/// no-session truth (the exit-waiter reap) BUMPS, and a poll-derived stamp\n 706|/// write VALIDATES against — so a `KIND_SESSIONS` snapshot taken PRE-reap can\n 707|/// never relatch `controlled=true` after the reap cleared it (the session is\n*708|/// gone; no later poll would ever heal the latch). The `write` mutex\n 709|/// serializes the validate-then-write pair against the bump-then-clear pair —\n*710|/// without it the poll could pass validation and still land its stale write\n 711|/// AFTER the reap's clears. Per-ENDPOINT, so stamps to different perches never\n 712|/// serialize (KH 7.12 stays about global locks; the fs writes here are the\n 713|/// same bounded per-perch fsyncs the exit-waiter always did).\n...\n 737|/// `controlled:false` and no later edge re-stamps, so the endpoint reads uncontrolled\n*738|/// forever while driven. This DIVERGENCE-GATED re-assert (on the `KIND_SESSIONS` poll,\n 739|/// bounded by the reconcile cadence) writes ONLY on a real difference — no fsync storm.\n 740|/// Best-effort: an unbound / corrupt / perch-less endpoint has nowhere to converge yet.\n 741|///\n...\n 829|    /// the bounded ring, then FAN OUT to viewers AND the controller — both a SINGLE\n*830|    /// non-blocking `try_send`, so the drain NEVER blocks/sleeps here. Returns\n 831|    /// `Some(epoch)` when the controller must be EVICTED (stalled past the deadline,\n 832|    /// or its writer is gone) so the drain can `mark_controller_gone(epoch)` OFF the\n 833|    /// log lock; `None` otherwise.\n...\n 836|    /// controller SOCKET WRITE off the drain (the `controller_writer` thread) but\n*837|    /// left the HANDOFF as an inline sleep-poll (`ControllerJob::deliver`, up to\n 838|    /// `CONTROLLER_WRITE_DEADLINE`) ON the drain — so a controller draining slower\n*839|    /// than the PTY floods filled its channel, the inline poll throttled the drain,\n 840|    /// and the viewer fan-out below stopped running → a concurrent `rc --view`\n 841|    /// VIEWER starved. Now the controller handoff is ONE non-blocking `try_send`\n 842|    /// exactly like a viewer: the drain runs at full PTY speed regardless of\n...\n 938|        // Controller: the SAME non-blocking discipline as a viewer (b4). One\n*939|        // `try_send`, never a sleep. Ok → record the handoff time. Full → DROP (a\n 940|        // slow controller falls behind the ring) unless it has been Full for the\n 941|        // whole deadline since its last success → EVICT. Disconnected (writer gone)\n 942|        // → EVICT. The drain off-lock turns `Some(epoch)` into `mark_controller_gone`.\n...\n 1083|    /// THREAD has EXITED — the record-vs-truth honesty step, run on the authoritative\n*1084|    /// `KIND_SESSIONS` poll BEFORE `controller_by`/`has_controller` are read. The\n 1085|    /// writer exits when a socket write fails (a severed / keepalive-killed controller\n 1086|    /// conn) or its `tx` drops; while it is parked on `rx.recv()` (a LIVE but idle\n 1087|    /// controller) it is NOT finished, so a live controller is never touched (the\n...\n 1300|            // re-take is for a SUCCESSOR — the SAME Request re-served after a\n*1301|            // dispatcher restart (equal generation) or a NEWER viewport\n 1302|            // (greater). A REPLAYED stale Request (an UNFINISHED backlog row\n 1303|            // whose viewport died raw, no FIN — the shape finished-row\n 1304|            // retirement cannot see) carries an OLDER generation than the\n## config.rs\n 30|/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\n*31|/// — a binary handoff relaunch or a brief stale poll — without delaying a real\n 32|/// teardown for long. Configurable per machine via `crash_grace_ms`.\n 33|pub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\n 34|\n*35|/// Default peer-pump cadences (D9-1): how often the daemon pushes its\n*36|/// registry/notif feeds to trusted peers and pulls context syncs from them.\n 37|/// Conservative defaults — every loop is a thin call over an idempotent\n*38|/// driver, so a missed tick costs only latency, never correctness.\n*39|pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n*40|pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n 41|pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n 42|pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n 43|\n*44|/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n 45|/// authored by a node not heard within this window are evicted on the next\n*46|/// registry pump tick. Sized to ~10 default pump cadences — generous against\n 47|/// transient drops (a peer re-advertises every cadence, so one admitted feed\n 48|/// inside the window keeps its rows), short enough that a dead node identity\n 49|/// stops poisoning bare-id resolution within minutes.\n*50|pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\n 51|\n 52|/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\n 53|/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\n...\n 102|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*103|    peer_pump: Option<bool>,\n 104|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*105|    registry_pump_period_ms: Option<u64>,\n 106|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*107|    registry_evict_after_ms: Option<u64>,\n 108|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*109|    notif_pump_period_ms: Option<u64>,\n 110|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 111|    sync_pull_period_ms: Option<u64>,\n 112|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n...\n 149|    pub relay: RelayChoice,\n*150|    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\n 151|    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n*152|    pub peer_pump: bool,\n*153|    /// Registry feed push cadence (D9-1).\n*154|    pub registry_pump_period: Duration,\n*155|    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n*156|    /// node not heard within this window are evicted on the next registry\n*157|    /// pump tick — a dead node identity must not poison bare-id resolution\n## conn.rs\n 7|//! ACROSS a blocking [`write_frame`]. On Windows, `interprocess 2.4.2` routes\n*8|//! that send to `WriteFileEx` + `SleepEx(INFINITE, alertable)` — a local-socket\n 9|//! path with **no supported write timeout** (`set_timeout` → `Unsupported`).\n 10|//! A connected consumer that stops reading (an `rc --take` whose process\n 11|//! wedged; a suspended brain) therefore blocks the write INDEFINITELY, and the\n...\n 32|//! connection and aborts the in-flight I/O (`CancelIoEx` on Windows — the\n*33|//! completion APC makes the wedged `SleepEx` loop return with\n 34|//! `ERROR_OPERATION_ABORTED`; `shutdown(SHUT_RDWR)` on Unix — the blocked\n 35|//! write returns `EPIPE`). A gate-waiter that exhausts its own deadline fires\n 36|//! the same abort (the stuck op it waited behind is the wedge).\n...\n 307|        }\n*308|        // Wake gate-waiters so they observe the poison instead of sleeping\n 309|        // out their full deadline, and the watchdog so it re-evaluates.\n 310|        self.gate_cv.notify_all();\n 311|        self.dog_cv.notify_all();\n...\n 337|\n*338|    /// The watchdog body: park until a write is in flight, then sleep to its\n 339|    /// absolute deadline. If the op is still in flight at the deadline,\n 340|    /// poison + cancel, re-canceling periodically until the op reports\n 341|    /// completion (the writer clears `inflight` the instant `write_frame`\n...\n 358|            };\n*359|            // Sleep toward the deadline while THIS op stays in flight.\n 360|            let fired = loop {\n 361|                if d.shutdown {\n 362|                    return;\n## consent.rs\n 12|//!   orchestrator should prompt.\n*13|//! - [`most_recently_active`] — resolve that target over the **v1 registry**\n 14|//!   (live perches + their `last_active_ms` recency stamp). This is the\n*15|//!   registry-resolution precursor CONTEXT names; the deferred PresenceChannel\n 16|//!   later generalizes it.\n 17|//!\n 18|//! What C2 deliberately does **not** build: the interactive prompt UX itself.\n...\n 71|///\n*72|/// This is the **v1 registry resolution** the consent flow rides — live perches +\n 73|/// their recency stamp, not the deferred PresenceChannel. The resolver core is\n 74|/// shared with the notif engine ([`crate::notif::most_recently_active_where`],\n 75|/// D8b — the subnet-scoped form); consent is the degenerate (unscoped) call.\n## crc_swap.rs\n 549|        #[cfg(target_os = \"linux\")]\n*550|        let image = std::path::PathBuf::from(\"/bin/sleep\");\n 551|        if !image.exists() {\n 552|            return; // no reference image on this host — inconclusive, not a fail\n 553|        }\n...\n 566|        // Give the OS a beat to map the image.\n*567|        std::thread::sleep(std::time::Duration::from_millis(150));\n 568|\n 569|        let plan = plan_crc_swap(s, i).unwrap();\n 570|        let result = apply_crc_swap(&plan);\n## daemon.rs\n 31|use crate::nethost::{NetConfig, NetHost};\n*32|use crate::seedmap::{self, SeedRegistry};\n 33|\n 34|/// How long auto-start waits for a freshly-spawned daemon to bind its channel.\n 35|const START_TIMEOUT: Duration = Duration::from_secs(5);\n*36|/// Poll cadence while waiting for the spawned daemon to come up.\n*37|const START_POLL: Duration = Duration::from_millis(25);\n 38|\n 39|/// The per-machine broker/brain daemon process.\n 40|pub struct Daemon;\n...\n 120|\n*121|        let reg = Arc::new(SeedRegistry::new());\n 122|\n 123|        // Boot housekeeping (KNOWN-HAZARDS 1.3): sweep stale `index.lock`\n 124|        // wedges out of the git-touching runtime the daemon hosts — the\n...\n 195|                    });\n*196|                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n 197|                // the BRAIN child (restoration D2-1): they are pure IPC clients,\n 198|                // so they live with the restartable brain and respawn with it.\n 199|                // The broker keeps only the NetHost bring-up and the boot-race\n*200|                // self-heal that binds it; the brain polls `net-status` and\n 201|                // starts the consumers once net reports enabled.\n 202|                // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 203|                    if !net_up && node_hex.is_some() {\n...\n 272|        // nothing — the slot is ephemeral control, a restart correctly drops it).\n*273|        // `spt shell drive` writes it, `api drive-poll --link` takes-and-clears it.\n 274|        // [impl->REQ-SHELL-3]\n 275|        let drive_hub = Arc::new(crate::drivehub::DriveHub::new());\n 276|        {\n...\n 282|\n*283|        // The per-shell shell-TUNNEL registry (M11-W3, REQ-SHELL-4) — the opaque\n 284|        // reliable-ordered byte stream's identifier map. Broker-held like the drive\n 285|        // hub (daemon-lifetime CLI-reachable anchor; in-memory so a restart correctly\n 286|        // drops a dead link generation's stream ids). `spt shell tunnel` (owner) and\n...\n 442|    loop {\n*443|        thread::sleep(backoff);\n 444|        if let Some(host) = try_start_net() {\n 445|            if broker.attach_net(host) {\n 446|                eprintln!(\"NET_ATTACHED: net endpoint bound on retry — brain starts the consumers\");\n...\n 486|        }\n*487|        thread::sleep(START_POLL);\n*488|        waited += START_POLL;\n 489|    }\n 490|    Err(io::Error::new(\n 491|        io::ErrorKind::TimedOut,\n...\n 929|/// the real per-rung launchers and log which rung won. The caller still confirms\n*930|/// readiness via the existing `brain.ready` poll — the returned pid is for\n 931|/// logging/return, not readiness (WMI/schtasks pids are the launcher's view).\n 932|// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n 933|#[cfg(windows)]\n...\n 1185|/// is recoverable from schtasks → returns a sentinel; readiness is the caller's\n*1186|/// `brain.ready` poll. This is the FALLBACK rung (WMI is primary); its `/tr`\n 1187|/// quoting is best-effort.\n 1188|// [impl->REQ-HAZARD-VIEWER-CLOSE-DETACH]\n 1189|#[cfg(windows)]\n...\n 1225|    }\n*1226|    // No pid from schtasks; sentinel — readiness is the brain.ready poll.\n 1227|    Ok(0)\n 1228|}\n 1229|\n...\n 1267|    use super::*;\n*1268|    use crate::seedmap::{serve_seed_control, SeedRegistry};\n 1269|    use crate::test_home::with_home;\n 1270|\n 1271|    // [unit->REQ-HAZARD-DETACHED-DAEMON-STDIO] the detached-in-fact decision is EXACTLY\n...\n 1299|    // and caps at NET_RETRY_CAP — so a long boot-race wait settles to a steady\n*1300|    // 30s poll, never an ever-growing or zero-length spin.\n 1301|    #[test]\n 1302|    fn net_retry_backoff_doubles_then_caps() {\n 1303|        assert_eq!(net_retry_backoff(NET_RETRY_FIRST), Duration::from_secs(2));\n...\n 1533|            std::fs::write(&pidfile, gc.to_string()).expect(\"launcher: write gc pid\");\n*1534|            std::thread::sleep(Duration::from_secs(300));\n 1535|            std::process::exit(0);\n 1536|        }\n 1537|\n...\n 1614|                }\n*1615|                std::thread::sleep(Duration::from_millis(20));\n 1616|            }\n 1617|            found.expect(\"launcher reports its grandchild pid\")\n 1618|        };\n...\n 1625|        for _ in 0..25 {\n*1626|            std::thread::sleep(Duration::from_millis(40));\n 1627|            if !is_process_alive(gc) {\n 1628|                still_alive = false;\n 1629|                break;\n...\n 1700|\n*1701|            let reg = Arc::new(SeedRegistry::new());\n 1702|            let name = seed_socket_name();\n 1703|            let srv = Arc::clone(&reg);\n 1704|            let serve_name = name.clone();\n## deadline.rs\n 10|//!\n*11|//! - [`DeadlineAnchor`] — a **periodic** `(anchor, interval)` grid. Persisted\n 12|//!   ONCE per fresh/crash start; every fire is derived functionally\n 13|//!   ([`DeadlineAnchor::next_fire`]) with **no per-fire write**. An\n 14|//!   [`StartReason::Update`] restart keeps the anchor (phase preserved, lands\n...\n 29|//!\n*30|//! **[V4] Only phase-significant loops convert.** The idempotent pump cadences\n*31|//! (`pump`) need none — they already stagger from everything-due-now,\n 32|//! catch-up/idempotent/restart-safe; converting them would re-add the per-loop\n 33|//! writes Q4 minimizes.\n 34|\n...\n 53|/// On-disk shape of a periodic deadline anchor (`<spt_home>/deadline-<key>.json`).\n*54|/// `interval_ms > 0` is an invariant the constructor enforces, so the pure derive\n 55|/// never divides by zero.\n 56|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 57|#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]\n 58|pub struct DeadlineAnchor {\n*59|    /// Epoch-ms grid origin. Periodic fires land at `anchor_ms + k·interval_ms`.\n 60|    pub anchor_ms: u64,\n 61|    /// Grid spacing in ms. Always `> 0` (the constructor degrades a zero value).\n*62|    pub interval_ms: u64,\n 63|}\n 64|\n 65|impl DeadlineAnchor {\n*66|    /// Resolve a non-zero interval (doyle minor — ONE degrade rule, unit-tested):\n*67|    /// a zero `interval_ms` degrades to the config default pulse period (a `const`\n 68|    /// that is always `> 0`), so the derive can never divide by zero. The `else\n 69|    /// 1ms` floor is belt-and-braces should that default ever be made zero.\n*70|    fn effective_interval(interval_ms: u64) -> u64 {\n*71|        if interval_ms > 0 {\n*72|            return interval_ms;\n 73|        }\n 74|        let default_ms = DEFAULT_PULSE_PERIOD.as_millis() as u64;\n 75|        default_ms.max(1)\n...\n 81|    /// - [`StartReason::Update`] → **keep** the existing anchor (phase preserved);\n*82|    ///   only the interval refreshes from live config. If no file exists (updating\n 83|    ///   *from* a pre-D5 binary that never wrote one), fall back to a fresh anchor\n 84|    ///   — never fail an update on a missing file.\n 85|    /// - [`StartReason::Crash`] / [`StartReason::Cold`] → write a **fresh** anchor\n...\n 88|    /// A corrupt file is treated as absent (degrade-to-fresh), matching\n*89|    /// `DaemonConfig::load_from` / `EffectJournal::open`. `interval_ms` is always\n 90|    /// (re)written from the caller's live config value, so a per-machine period\n 91|    /// change takes effect on the next start.\n 92|    pub fn open(\n 93|        key: &str,\n*94|        interval_ms: u64,\n 95|        reason: StartReason,\n 96|        now_ms: u64,\n 97|    ) -> std::io::Result<Self> {\n 98|        let path = anchor_path(key);\n*99|        let interval_ms = Self::effective_interval(interval_ms);\n 100|        let anchor = match (reason, Self::load(&path)) {\n*101|            // Update keeps the persisted phase; the interval refreshes to config.\n 102|            (StartReason::Update, Some(prev)) => DeadlineAnchor {\n 103|                anchor_ms: prev.anchor_ms,\n*104|                interval_ms,\n 105|            },\n 106|            // Update-with-no-file falls back to fresh; crash/cold are always fresh.\n 107|            _ => DeadlineAnchor {\n 108|                anchor_ms: now_ms,\n*109|                interval_ms,\n 110|            },\n 111|        };\n 112|        anchor.save(&path)?;\n...\n 133|    /// The next fire at or after `now_ms`, derived functionally — **NO write**:\n*134|    /// `anchor + interval · ⌈max(0, now − anchor) / interval⌉`.\n 135|    ///\n 136|    /// On an exact grid instant this returns `now` (fire-now); a long jump\n*137|    /// (`now ≫ anchor`) snaps to the next grid point, collapsing missed ticks to\n 138|    /// one (idempotent catch-up, no fire-storm). Saturating throughout (the\n## digest.rs\n 117|/// `from` points at the changed tail (a minimal delta); a window slide evicts the\n*118|/// oldest turn → the heads differ from index 0 → `from == 0` (a full refresh).\n 119|pub fn common_prefix_len(a: &[Turn], b: &[Turn]) -> usize {\n 120|    a.iter().zip(b.iter()).take_while(|(x, y)| x == y).count()\n 121|}\n...\n 148|        .and_then(|adapter| {\n*149|            spt_runtime::registry::resolve_option(&perch::adapters_dir(), adapter).ok()\n 150|        });\n 151|    let install_dir = resolved\n 152|        .as_ref()\n...\n 531|    // [unit->REQ-TERM-4] the diff base: a shared head yields its length (a tail\n*532|    // delta); a divergent front yields 0 (a full refresh).\n 533|    #[test]\n 534|    fn common_prefix_len_finds_the_unchanged_head() {\n 535|        let a = vec![turn(\"a\"), turn(\"b\")];\n...\n 801|            std::fs::write(asrc.join(\"manifest.toml\"), manifest).unwrap();\n*802|            spt_runtime::registry::register(&perch::adapters_dir(), &asrc, 1).unwrap();\n 803|\n 804|            // The endpoint records the adapter; the ledger holds both sessions.\n 805|            let perch = perch::resolve_perch_path(\"span\", ParentHint::Infer);\n## digesthub.rs\n 89|\n*90|/// The daemon's per-endpoint live-digest registry. The brain publishes; the\n 91|/// control channel reads + subscribes. Holds only the projected digest state —\n 92|/// the same ephemeral-projection category as the broker's accepted-socket\n*93|/// bookkeeping, not routing/registry/parse logic (the parse already happened in\n 94|/// the brain's engine).\n 95|#[derive(Default)]\n 96|pub struct DigestHub {\n...\n 121|        // The changed turns begin past the equal-by-value head; a window slide\n*122|        // (front eviction) diverges at 0 → a full refresh.\n 123|        let from = common_prefix_len(&st.snapshot.turns, &new.turns);\n 124|        st.version += 1;\n 125|        let update = DigestUpdate {\n...\n 463|    // [unit->REQ-TERM-4] the delta a publish fans out: an active-turn growth is a\n*464|    // tail delta (from past the unchanged head); a window slide refreshes from 0.\n 465|    #[test]\n*466|    fn publish_delta_is_tail_then_full_refresh() {\n 467|        let hub = DigestHub::new();\n 468|        let (_b, _v, rx) = hub.subscribe(\"doyle\");\n 469|        hub.project_and_publish(\"doyle\", digest(vec![turn(\"a\"), turn(\"b\")]));\n...\n 477|        assert_eq!(up.turns[0].input.as_deref(), Some(\"c\"));\n*478|        // A front eviction (window slide) diverges at 0 → full refresh.\n 479|        hub.project_and_publish(\"doyle\", digest(vec![turn(\"b\"), turn(\"c\"), turn(\"d\")]));\n 480|        let up = rx.recv().unwrap();\n 481|        assert_eq!(up.from, 0, \"front eviction resends from 0\");\n## dispatch.rs\n*1|//! Inbound net-stream dispatch (D9-1) — the daemon-side acceptor that turns\n 2|//! the hand-wired serve loops of D5–D8 into production behavior.\n 3|//!\n 4|//! Every E2E test so far drove the serve half manually (a probe brain calling\n...\n 13|//!\n*14|//! The stream table holds locally-opened outbound streams too. The dispatcher\n 15|//! claims only rows with `initiated_locally == false` — serving our own\n 16|//! requester stream would deadlock the requester against ourselves. The flag\n 17|//! is broker-recorded at registration (`open_stream` vs the accept loop),\n...\n 36|//! | untagged + `target`+`op_id` | WAN message feed ([`crate::wan::receive_wan`]) |\n*37|//! | untagged + `subnet`+`instance` | registry feed (D9-1-2) |\n 38|//! | anything else | unknown — dropped, loud |\n 39|//!\n 40|//! A family whose production wiring lands in a later slice is still\n 41|//! classified here (the table is complete) but routed to a typed\n*42|//! [`Unwired`](DispatchOutcome::Unwired) drop — loud, never silent.\n 43|//!\n 44|//! ## Worker model\n 45|//!\n...\n 66|use spt_net::net::replicate::{\n*67|    FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,\n 68|};\n 69|use spt_net::net::wanmsg::{WanDecoder, WanReply};\n 70|use spt_store::contextstore::ContextStore;\n...\n 78|use crate::propagate::serve_update;\n*79|use crate::registryhost::{RegistryGatePolicy, RegistryHost};\n 80|use crate::relcache::ReleaseCache;\n 81|use crate::sync::{serve_sync, SyncPolicy};\n 82|use crate::wan::receive_wan;\n...\n 84|\n*85|/// Poll cadence for the stream-table watch (the dispatcher's only busy-wait;\n 86|/// workers block on their stream's event feed).\n*87|pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n 88|\n 89|/// What protocol a peer-initiated stream speaks, by its first record's shape.\n 90|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n...\n 99|    WanMsg,\n*100|    /// A registry replication feed (untagged `RegistryUpdate` lines).\n*101|    Registry,\n 102|    /// A remote-drive attach (`AttachRecord::Request`).\n 103|    Attach,\n 104|    /// A file transfer (`XferRecord::Fetch`/`Push`).\n...\n 141|            } else if line.get(\"subnet\").is_some() && line.get(\"instance\").is_some() {\n*142|                StreamFamily::Registry\n 143|            } else if line.get(\"subnet\").is_some()\n 144|                && line.get(\"node\").is_some()\n 145|                && line.get(\"label\").is_some()\n...\n 149|                // first line is a NodeLabelUpdate. Same serve arm, same gate.\n*150|                StreamFamily::Registry\n 151|            } else {\n 152|                StreamFamily::Unknown\n 153|            }\n...\n 157|\n*158|/// Why a dispatched stream's worker ended — loud + typed, never silent.\n 159|#[derive(Debug)]\n*160|pub enum DispatchOutcome {\n 161|    /// The family's serve loop ran to its own outcome (rendered for the log).\n 162|    Served(String),\n 163|    /// The first line never arrived / didn't parse — dropped.\n...\n 168|\n*169|/// A claimed stream's dispatch lifecycle (ADR-0038 C,\n*170|/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\n 171|/// insert performed BEFORE worker spawn and never cleared — one transient\n 172|/// worker-setup failure permanently abandoned the stream. Claims now\n 173|/// distinguish in-flight vs terminal vs retryable, and a transient failure\n...\n 178|    InFlight { attempts: u32 },\n*179|    /// Done for this dispatcher's lifetime: served, unclassifiable, or\n 180|    /// retries exhausted. Terminal outcomes never re-enter the queue.\n 181|    Terminal,\n 182|    /// A transient failure released the claim; eligible again at `next_at`.\n...\n 185|\n*186|/// Bounded retry budget per stream per dispatcher lifetime — transient setup\n 187|/// failures recover, a persistently-failing stream goes terminal loud.\n*188|const MAX_DISPATCH_ATTEMPTS: u32 = 3;\n 189|\n 190|/// Backoff base for a released claim (doubles per failed attempt).\n*191|const DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\n 192|\n 193|/// The backoff before retry number `attempts` (1-based) runs.\n 194|fn retry_backoff(attempts: u32) -> Duration {\n## drivehub.rs\n 5|//! channel\" — the opaque control surface). An owner writes one drive frame for a\n*6|//! shell; the shell binary drains it with an ephemeral `api drive-poll --link`.\n 7|//! Unlike the durable command channel (spooled on the shell perch), a drive\n 8|//! frame is held in a **single in-memory slot per shell** and overwritten on\n*9|//! every write — a second write before the poll clobbers the first.\n 10|//!\n 11|//! **Where the slot lives (broker, not relay; broker, not brain).** The slot is\n 12|//! held by the always-up BROKER process (alongside [`crate::digesthub::DigestHub`]),\n...\n 22|//! stamps each frame with the **writing link token**; [`DriveHub::take`] serves\n*23|//! it only when the polling shell presents that same token. A link-break retires\n 24|//! the token and a relink mints a fresh one ([`crate::shellhost::close_shell`]\n 25|//! removes `LINK_TOKEN_FILE`; relaunch mints anew), so a frame stamped under the\n 26|//! pre-break generation can never match the relinked shell's fresh token — the\n...\n 78|\n*79|/// `drive_take` request payload: the slot key plus the polling shell's link\n 80|/// token (the serve gate).\n 81|#[derive(Debug, Clone, Serialize, Deserialize)]\n 82|pub struct DriveTakeReq {\n...\n 84|    pub shell_id: String,\n*85|    /// The polling shell's current link token — must match the slot stamp.\n 86|    pub token: String,\n 87|}\n 88|\n...\n 310|\n*311|    // [unit->REQ-SHELL-3] latest-wins: a second write before the poll clobbers\n 312|    // the first; the take serves the latest frame.\n 313|    #[test]\n 314|    fn write_is_latest_wins() {\n...\n 324|\n*325|    // [unit->REQ-SHELL-3] take-and-clear is exactly-once: a second poll after a\n 326|    // single write returns empty (the slot was cleared on the first take).\n 327|    #[test]\n 328|    fn take_is_exactly_once() {\n...\n 343|    // [unit->REQ-SHELL-3] no-replay-across-relink: a frame written under one link\n*344|    // token is NEVER served to a poll presenting a different (relinked) token —\n*345|    // and the dead frame is evicted by that very poll. This is the crash-proof\n 346|    // guarantee that does not depend on the explicit clear-on-close running.\n 347|    #[test]\n 348|    fn dead_generation_frame_is_never_served() {\n...\n 350|        hub.write(\"doyle\", \"mock-shell-0\", \"old-token\", \"stale-frame\");\n*351|        // Relink minted \"new-token\"; the shell polls with it.\n 352|        assert_eq!(\n 353|            hub.take(\"doyle\", \"mock-shell-0\", \"new-token\"),\n 354|            None,\n...\n 359|            !hub.has_slot(\"doyle\", \"mock-shell-0\"),\n*360|            \"the dead frame is cleared by the mismatching poll\"\n 361|        );\n 362|    }\n 363|\n## effect.rs\n 7|//! kills it. Effects it drives cross the broker↔brain boundary — a PTY write, a\n*8|//! spool row, a registry update. A brain that crashes *around* one of those\n 9|//! effects must, on restart, neither duplicate it (a re-injected keystroke, a\n 10|//! double-written row) nor drop it (a lost delivery).\n 11|//!\n...","truncated":true,"truncatedBy":"bytes","totalLines":1129,"totalBytes":58676,"outputLines":965,"outputBytes":51196,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":1129,"totalBytes":58676,"outputLines":965,"outputBytes":51196,"shownRange":{"start":1,"end":965},"nextOffset":966}}},"isError":false,"timestamp":1784292920068}}
{"type":"message","id":"bbb6abcb","parentId":"8b3c4f83","timestamp":"2026-07-17T12:55:24.985Z","message":{"role":"toolResult","toolCallId":"call_beHarAIGKna0Li70DrhjP1l7|fc_0148993141920bab016a5a2637e7e48195b08e116af72b53d8","toolName":"glob","content":[{"type":"text","text":"No files found matching pattern\nglob timed out after 5s; returning 0 partial matches — narrow the pattern instead of retrying blindly\nSkipped missing paths: C:/Users/decid/.spt/**/*.log"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/**/spt*.log, C:/Users/decid/AppData/Roaming/**/spt*.log, C:/Users/decid/.local/**/*.log","fileCount":0,"files":[],"truncated":true,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","missingPaths":["C:/Users/decid/.spt/**/*.log"]},"isError":false,"useless":true,"timestamp":1784292924985}}
{"type":"message","id":"679b3a3b","parentId":"bbb6abcb","timestamp":"2026-07-17T12:55:37.845Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning environment variable and path inspection**\n\n**Reviewing default SPT_HOME location**"},{"type":"toolCall","id":"call_YPDnP0RjZ4Dyk6WExvDJwlPq|fc_0148993141920bab016a5a2649c4b08195b1dffb1d7ac88f62","name":"grep","arguments":{"i":"Locating runtime home paths","pattern":"SPT_HOME|stderrlog|logs_dir|\\.log|brain-.*log|daemon.*log","path":"crates/spt-daemon/src;crates/spt-runtime/src;crates/spt/src","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_grkE6NhlQWBRqV1Fr06UaRCl|fc_0148993141920bab016a5a2649c4c081959c386c6fd8be6faf","name":"glob","arguments":{"i":"Mapping periodic modules","path":"crates/spt-daemon/src/{pump,dispatch,registryhost,livehost,projwriter,shellwake}*.rs","hidden":false,"gitignore":true,"limit":100}},{"type":"toolCall","id":"call_90YGeZCjwWNaKYzdG13s0ZkO|fc_0148993141920bab016a5a2649c4c88195b22292189c901a67","name":"read","arguments":{"i":"Reading dispatcher loop","path":"crates/spt-daemon/src/dispatch.rs","selector":"160-360"}},{"type":"toolCall","id":"call_6JfPt3OORhJjYbRWp0fpHbcQ|fc_0148993141920bab016a5a2649c4d08195af9b08d897ac09a6","name":"read","arguments":{"i":"Reading net consumer wiring","path":"crates/spt-daemon/src/brainproc.rs","selector":"303-380"}},{"type":"toolCall","id":"call_DVuYtykngpoCLN0XlbHl2Zo6|fc_0148993141920bab016a5a2649c4d8819580d4ae3836ed0141","name":"read","arguments":{"i":"Reading pump configuration","path":"crates/spt-daemon/src/config.rs","selector":"35-190"}},{"type":"toolCall","id":"call_zAQE3MZarKK7OwS8TZdZKCKD|fc_0148993141920bab016a5a2649c4e08195a07845dfcf5ada1b","name":"grep","arguments":{"i":"Finding pump functions","pattern":"spawn_peer|peer_pump|pump_once|registry_pump|run_pump|PumpSchedule|next_due","path":"crates/spt-daemon/src","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":26710,"output":529,"cacheRead":16896,"cacheWrite":0,"totalTokens":44135,"reasoningTokens":196,"cost":{"input":0.13355,"output":0.01587,"cacheRead":0.008447999999999999,"cacheWrite":0,"total":0.157868}},"stopReason":"toolUse","timestamp":1784292925033,"responseId":"resp_0148993141920bab016a5a263d4fbc8195838b80e4ec3f6d4e","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a263ebdc481958cae2e1bf8926911","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiZJtrP0qxEWtRAOKBl-MBGKuDNQTkyhADzVux7NKNM1G9uvYHcbOaCo7VDHWqZKvPIOEXT6NiREnXTUbLwUN5uXdTIHt8dRqyu3fhbEAWkm7YZDYWKyagCaFhNo3COk6p1Dwt3CbL1hTV3PcJyjVplII5MDe9gvm43RSX_VM0FRHIQ-uucKvbpKkxtLcK6xRmQRy670A697H7eYtqHSHXywnv3WBtfeAoZ4Xy1EThayRgBoJJQSHhEY7Ylf7umdBadaK9JovZFBMpT0ehNYVVvQpdZP2XnotNF2r8RxIbdVnZT3xqiXYcFNqHNQuZb9xE2ZRBY-BcCvtsn4_isuFI3oLaP8YJkkmrQGQPVdoU78DzHsnBFXC0nM4MF_Nwt1qbtlnLvL5I8cZLRR9hCI0_gjxhLoapE4L_Vy2s5pdKCW8oplTFPvvUuR4XnwNxQy2Thp9P53IDiB3Sq04gCFkIEWCsg38FAGpZjO8OSDScQM8LFomVk1IraHTWI0hXvkfmrJGT2le0SMn0RZmaQfW_Ru-QY5jnOc_JgyjLigWWZf-XwDd9z1mFTaiOR49gN_1ycTe3o_cMS5PJtXbvI-xPQ__k1_baYV-tGuQ98QlnyaxDxqMjIVL39h7lz7Y0_Ruj82mfDj3Q3ymd6PG1hVxoSePFcwDrR6n4ZEQGAk93kvIXVXbwVWDQcFVCSrvzCsVksOZpwDLVLrytE0cbMk5uDqn-OmYQGwV81dhykhywlg-UnI4_yew-izRwy8awqxqY9PTuE7LUoxmJTgS_vfsj_BaiWONISzLIO0T3lReKRFQlvManlsrgB0vRIqKiJjkmjerAh88aOMrSAF7klsy5lLDvgdUh-fjRE9nuXxa5jlFYDRTyJAB2xmBJwz24at43vrtiDDbS19npyDnlNY3erhkqhHGAOmv4xqPCdgx1BzMDJu6yzxqfoTNhsvM-Tx-UZ2IPi-DniWeeKfXq9LIpB5LWQ6SViuXr_RR_ClL171kA1-BM-awNOdfXIszlfkZjCGOhpCFW_CEajcgkvawUCt6oc7w7MwOgf8NEREVp9hL0FdwSoehj3NztTHskGadkSPPnFzac3iRyxfId9AN6SyZPAF_TmMiW1TBuKKmYx2YG40MUNS4O3l3jXjqEu07tubBLhOOg7TmP-HjX99QGmcnW9cDS14vVICp91yz7XielxhLtZOQRnKUa1jDoJspsXBcpTxws3rPzyLB4cY6x4yk3xpsaeEPRp20lHst5hGIYtxX54435LTVa9mgHqxmWsNFmoesPT1pOUnqZMHkMQknAabILGahj3u2wm7BPzY7XFxmnM_qKUjqpGr2SDTUF_9PRtbEsQhwUD6ngxRYCzFuP2SN55Xy9DwXcxy-7ETXjHY47ivzU8zSKu49zi0PLnUu4iw69zAwBR414OV5JucWmRnjbzA_DZqvGHvyPMkNOPgewT10_KifHNZt6Ew1vYJfHJWPOxyczTBSo0SXGqkAz6qxatoSCOKIwQaUVhpQuNB0bPBpcOCZCM9KhWgZ9t7MwzS6izbu2S4LlVuGjDDfoCG06Kwz-nYyCGhNeh45wzCiVdvB1QCIB_frBA9jdaIHv1HI14F2mUE7p7gkad8cIkoKxIIy1H6ksl3wi5qeK4UaW8vF2WuQUVskMqiCWJCzWxGuwAilUGX0H98V1fQYU-18w734DNuHWGWJ_Rv5zyhmqAnNzZKrwx9YkKiI5R-asVnyUVu6nBlBQ8PjNY-hUD0b3yUVrbWrjf6ci1RV5UIWKvuz6M-Az3AC5sn-CSev3VpzmGQWh-mW3xe6afyy9ZmDQ2iCKr5NNnYoiBuxsa5zoYIMIWs5NRiUQtyqU7_3k_QmiTlwri251YVROrPwpoLNygCunDleqqQlx8qoevMgAHoHvnjvtG4nUJNA0IlcblTx7ij_qwXe9JT-IiQ5hgdK0rRKabCPzbc6wLO0XpimnI6DJk_anaT0kFws8cueDj90WMiU34_Am9PqdacWs2Ko2SpTquc34qMvrdwl8lX1DAjEArbRMeNh-fXqWL1XzAcil0iPYa3FTo2gBCq3rBJ73NwXId3Z0qY3ULrrpalF4_Bxu_hhwvs6YDHR-gM9k-kIamCxwUp2pBL-rH-0pmRIMu_xm959cRT51AJ5Fo=","summary":[{"type":"summary_text","text":"**Planning environment variable and path inspection**"},{"type":"summary_text","text":"**Reviewing default SPT_HOME location**"}]},{"id":"fc_0148993141920bab016a5a2649c4b08195b1dffb1d7ac88f62","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating runtime home paths\",\"pattern\":\"SPT_HOME|stderrlog|logs_dir|\\\\.log|brain-.*log|daemon.*log\",\"path\":\"crates/spt-daemon/src;crates/spt-runtime/src;crates/spt/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_YPDnP0RjZ4Dyk6WExvDJwlPq","name":"grep"},{"id":"fc_0148993141920bab016a5a2649c4c081959c386c6fd8be6faf","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping periodic modules\",\"path\":\"crates/spt-daemon/src/{pump,dispatch,registryhost,livehost,projwriter,shellwake}*.rs\",\"hidden\":false,\"gitignore\":true,\"limit\":100}","call_id":"call_grkE6NhlQWBRqV1Fr06UaRCl","name":"glob"},{"id":"fc_0148993141920bab016a5a2649c4c88195b22292189c901a67","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher loop\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"160-360\"}","call_id":"call_90YGeZCjwWNaKYzdG13s0ZkO","name":"read"},{"id":"fc_0148993141920bab016a5a2649c4d08195af9b08d897ac09a6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading net consumer wiring\",\"path\":\"crates/spt-daemon/src/brainproc.rs\",\"selector\":\"303-380\"}","call_id":"call_6JfPt3OORhJjYbRWp0fpHbcQ","name":"read"},{"id":"fc_0148993141920bab016a5a2649c4d8819580d4ae3836ed0141","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump configuration\",\"path\":\"crates/spt-daemon/src/config.rs\",\"selector\":\"35-190\"}","call_id":"call_DVuYtykngpoCLN0XlbHl2Zo6","name":"read"},{"id":"fc_0148993141920bab016a5a2649c4e08195a07845dfcf5ada1b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding pump functions\",\"pattern\":\"spawn_peer|peer_pump|pump_once|registry_pump|run_pump|PumpSchedule|next_due\",\"path\":\"crates/spt-daemon/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_zAQE3MZarKK7OwS8TZdZKCKD","name":"grep"}]},"duration":12810.94280000031,"ttft":1723.8836999982595,"contextSnapshot":{"promptTokens":43606,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_YPDnP0RjZ4Dyk6WExvDJwlPq|fc_0148993141920bab016a5a2649c4b08195b1dffb1d7ac88f62","toolName":"grep","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src;crates/spt-runtime/src;crates/spt/src"},"intent":"Locating runtime home paths"},"id":"951c8885","parentId":"679b3a3b","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_grkE6NhlQWBRqV1Fr06UaRCl|fc_0148993141920bab016a5a2649c4c081959c386c6fd8be6faf","toolName":"glob","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src/{pump,dispatch,registryhost,livehost,projwriter,shellwake}*.rs"},"intent":"Mapping periodic modules"},"id":"fd84943c","parentId":"951c8885","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_90YGeZCjwWNaKYzdG13s0ZkO|fc_0148993141920bab016a5a2649c4c88195b22292189c901a67","toolName":"read","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher loop"},"id":"fa461835","parentId":"fd84943c","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6JfPt3OORhJjYbRWp0fpHbcQ|fc_0148993141920bab016a5a2649c4d08195af9b08d897ac09a6","toolName":"read","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src/brainproc.rs"},"intent":"Reading net consumer wiring"},"id":"c9134830","parentId":"fa461835","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_DVuYtykngpoCLN0XlbHl2Zo6|fc_0148993141920bab016a5a2649c4d8819580d4ae3836ed0141","toolName":"read","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src/config.rs"},"intent":"Reading pump configuration"},"id":"3a669ecf","parentId":"c9134830","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zAQE3MZarKK7OwS8TZdZKCKD|fc_0148993141920bab016a5a2649c4e08195a07845dfcf5ada1b","toolName":"grep","startedAt":"2026-07-17T12:55:37.845Z","args":{"path":"crates/spt-daemon/src"},"intent":"Finding pump functions"},"id":"47392d6d","parentId":"3a669ecf","timestamp":"2026-07-17T12:55:37.845Z"}
{"type":"message","id":"36405139","parentId":"47392d6d","timestamp":"2026-07-17T12:55:37.858Z","message":{"role":"toolResult","toolCallId":"call_DVuYtykngpoCLN0XlbHl2Zo6|fc_0148993141920bab016a5a2649c4d8819580d4ae3836ed0141","toolName":"read","content":[{"type":"text","text":"\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\n/// Conservative defaults — every loop is a thin call over an idempotent\n/// driver, so a missed tick costs only latency, never correctness.\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n/// authored by a node not heard within this window are evicted on the next\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\n/// inside the window keeps its rows), short enough that a dead node identity\n/// stops poisoning bare-id resolution within minutes.\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\n\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\n/// `Daemon::run`; kept as a local enum so the config layer stays transport-free.\n/// The self-hosted variant (`RelayPolicy::SelfHosted`) needs a relay-map URL\n/// list and gets its config plumbing when a self-host consumer exists.\n// [impl->REQ-NET-2]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum RelayChoice {\n    /// n0's public relays — the zero-config default (`\"relay\": \"n0\"`).\n    N0,\n    /// No relays: direct/LAN only (`\"relay\": \"disabled\"`).\n    Disabled,\n}\n\n/// One saved `endpoint run --save` startup default (F-038 W5,\n/// REQ-ENDPOINT-AUTOSTART): the daemon REPLAYS these at start — the endpoint\n/// analog of the shipped `subnet attach/detach --save` precedent. Minimal by\n/// design: the adapter option is re-resolved fresh at each replay (an adapter\n/// update between restarts is honored, an uninstalled one loud-skips), and the\n/// endpoint's home subnet is NOT recorded (home is durable on the perch —\n/// REQ-INST-15). A replay is always a FRESH session (shape (c)\n/// restore-what-was-up was rejected — this is a startup default, not a\n/// session restore).\n// [impl->REQ-ENDPOINT-AUTOSTART]\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct StartupEndpoint {\n    /// The endpoint id to bring up.\n    pub id: String,\n    /// The adapter option (`<adapter>[:profile]`), resolved at replay time.\n    pub adapter: String,\n    /// The project cwd the harness PTY lands in (captured at `--save`).\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pub cwd: Option<String>,\n}\n\n/// The on-disk shape (`<spt_home>/daemon.json`). Every field is optional so a\n/// partial file still loads (forward/back-compat) — a missing field takes the\n/// default. Stored as plain integers (ms) to keep the file human-editable.\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\nstruct DaemonConfigFile {\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pulse_period_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    protection_window_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    crash_grace_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    full_auto_update: Option<bool>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    relay: Option<String>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    peer_pump: Option<bool>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    registry_pump_period_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    registry_evict_after_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    notif_pump_period_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    sync_pull_period_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    update_check_period_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    auto_suspend_after_ms: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    resources_blurb: Option<String>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    detached_subnets: Option<Vec<String>>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    worker_reap_ttl_secs: Option<u64>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    startup_endpoints: Option<Vec<StartupEndpoint>>,\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    docs_port: Option<u16>,\n}\n\n/// Resolved daemon configuration. The brain's scheduled loops read their cadence\n/// from `pulse_period`; the drop-ingest guard reads `protection_window_ms`.\n/// (No longer `Copy` — `resources_blurb` carries a `String`; callers clone.)\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct DaemonConfig {\n    /// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).\n    pub pulse_period: Duration,\n    /// The drop-file precedence protection window in epoch-ms (6.5).\n    pub protection_window_ms: u64,\n    /// The orphan-watch grace window (B7): the recovery wait before a\n    /// supervised-crash teardown rechecks liveness and signs off (1.1).\n    pub crash_grace: Duration,\n    /// Whether self-update is full-auto (C2, REQ-UPD-4). **Default `false`** — an\n    /// update is gated on user confirmation delivered to the most-recently-active\n    /// live session. Setting this to `true` is the explicit opt-in to the\n    /// seamless, prompt-free path.\n    pub full_auto_update: bool,\n    /// The broker net endpoint's relay stance (D4a, REQ-NET-2). Default\n    /// [`RelayChoice::N0`] — the ADR-0002 zero-config path. An unrecognized\n    /// string degrades to the default (forward-compat: a future value must not\n    /// wedge an older daemon).\n    pub relay: RelayChoice,\n    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\n    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n    pub peer_pump: bool,\n    /// Registry feed push cadence (D9-1).\n    pub registry_pump_period: Duration,\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n    /// node not heard within this window are evicted on the next registry\n    /// pump tick — a dead node identity must not poison bare-id resolution\n    /// forever. Default [`DEFAULT_REGISTRY_EVICT_AFTER`].\n    pub registry_evict_after: Duration,\n    /// Notif feed push cadence (D9-1).\n    pub notif_pump_period: Duration,\n    /// Context sync pull cadence — the anti-entropy loop (D9-1).\n    pub sync_pull_period: Duration,\n    /// Update check cadence (D9-1; the pull rides the same trusted conns).\n    pub update_check_period: Duration,\n    /// The NODE leg of the auto-suspend knob chain (D9-2, REQ-INST-3):\n    /// dormant → suspended after this many ms counted from dormancy onset.\n    /// **`None` = the global default, OFF** — auto-suspend is opt-in\n    /// (CONTEXT §dormant/suspended); a constrained node sets it here, and a\n    /// per-endpoint `info.json` override wins over this value\n    /// ([`crate::resting::effective_auto_suspend`]).\n    pub auto_suspend_after_ms: Option<u64>,\n    /// The node-level resource-advertisement seed (D9-4, REQ-INST-14): the\n    /// default blurb advertised for an endpoint that has not authored its\n    /// own (`info.json` `resources` wins when present — config seeds, the\n    /// agent refines; CONTEXT §resource advertisement). `None` = endpoints\n    /// without their own blurb advertise none.\n    pub resources_blurb: Option<String>,\n    /// Subnets whose serve-state STARTS detached (M8 decision 6,\n    /// REQ-SUBNET-5): the daemon's boot reset seeds the live\n    /// `attachment.json` from this list — `spt subnet detach/attach --save`\n    /// writes it. Default empty = every held subnet starts attached.\n    pub detached_subnets: Vec<String>,\n    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\n    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\n    /// under a live parent with a stale `ready` marker (the `SubagentStop`-never-fired\n    /// leak class). Default [`spt_store::worker_reap::DEFAULT_REAP_TTL_SECS`] (24h),\n    /// clamped at the reap site to a ≥1h floor (a fat-fingered tiny value can never\n    /// mass-kill in-flight workers); `0` disables the TTL leg.\n    pub worker_reap_ttl_secs: u64,\n    /// Endpoints replayed as startup defaults at daemon start (F-038 W5,\n    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\n    /// Default empty = nothing auto-starts. A replay failure logs loud and\n…\n}\n\n[Showing lines 34-193 of 652. Use :194 to continue]"}],"details":{"truncation":{"content":"\r\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\r\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\r\n/// Conservative defaults — every loop is a thin call over an idempotent\r\n/// driver, so a missed tick costs only latency, never correctness.\r\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\r\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\r\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\r\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\r\n\r\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\r\n/// authored by a node not heard within this window are evicted on the next\r\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\r\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\r\n/// inside the window keeps its rows), short enough that a dead node identity\r\n/// stops poisoning bare-id resolution within minutes.\r\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\r\n\r\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\r\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\r\n/// `Daemon::run`; kept as a local enum so the config layer stays transport-free.\r\n/// The self-hosted variant (`RelayPolicy::SelfHosted`) needs a relay-map URL\r\n/// list and gets its config plumbing when a self-host consumer exists.\r\n// [impl->REQ-NET-2]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\npub enum RelayChoice {\r\n    /// n0's public relays — the zero-config default (`\"relay\": \"n0\"`).\r\n    N0,\r\n    /// No relays: direct/LAN only (`\"relay\": \"disabled\"`).\r\n    Disabled,\r\n}\r\n\r\n/// One saved `endpoint run --save` startup default (F-038 W5,\r\n/// REQ-ENDPOINT-AUTOSTART): the daemon REPLAYS these at start — the endpoint\r\n/// analog of the shipped `subnet attach/detach --save` precedent. Minimal by\r\n/// design: the adapter option is re-resolved fresh at each replay (an adapter\r\n/// update between restarts is honored, an uninstalled one loud-skips), and the\r\n/// endpoint's home subnet is NOT recorded (home is durable on the perch —\r\n/// REQ-INST-15). A replay is always a FRESH session (shape (c)\r\n/// restore-what-was-up was rejected — this is a startup default, not a\r\n/// session restore).\r\n// [impl->REQ-ENDPOINT-AUTOSTART]\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\r\npub struct StartupEndpoint {\r\n    /// The endpoint id to bring up.\r\n    pub id: String,\r\n    /// The adapter option (`<adapter>[:profile]`), resolved at replay time.\r\n    pub adapter: String,\r\n    /// The project cwd the harness PTY lands in (captured at `--save`).\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub cwd: Option<String>,\r\n}\r\n\r\n/// The on-disk shape (`<spt_home>/daemon.json`). Every field is optional so a\r\n/// partial file still loads (forward/back-compat) — a missing field takes the\r\n/// default. Stored as plain integers (ms) to keep the file human-editable.\r\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\r\nstruct DaemonConfigFile {\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pulse_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    protection_window_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    crash_grace_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    full_auto_update: Option<bool>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    relay: Option<String>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    peer_pump: Option<bool>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    registry_pump_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    registry_evict_after_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    notif_pump_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    sync_pull_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    update_check_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    auto_suspend_after_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    resources_blurb: Option<String>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    detached_subnets: Option<Vec<String>>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    worker_reap_ttl_secs: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    startup_endpoints: Option<Vec<StartupEndpoint>>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    docs_port: Option<u16>,\r\n}\r\n\r\n/// Resolved daemon configuration. The brain's scheduled loops read their cadence\r\n/// from `pulse_period`; the drop-ingest guard reads `protection_window_ms`.\r\n/// (No longer `Copy` — `resources_blurb` carries a `String`; callers clone.)\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct DaemonConfig {\r\n    /// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).\r\n    pub pulse_period: Duration,\r\n    /// The drop-file precedence protection window in epoch-ms (6.5).\r\n    pub protection_window_ms: u64,\r\n    /// The orphan-watch grace window (B7): the recovery wait before a\r\n    /// supervised-crash teardown rechecks liveness and signs off (1.1).\r\n    pub crash_grace: Duration,\r\n    /// Whether self-update is full-auto (C2, REQ-UPD-4). **Default `false`** — an\r\n    /// update is gated on user confirmation delivered to the most-recently-active\r\n    /// live session. Setting this to `true` is the explicit opt-in to the\r\n    /// seamless, prompt-free path.\r\n    pub full_auto_update: bool,\r\n    /// The broker net endpoint's relay stance (D4a, REQ-NET-2). Default\r\n    /// [`RelayChoice::N0`] — the ADR-0002 zero-config path. An unrecognized\r\n    /// string degrades to the default (forward-compat: a future value must not\r\n    /// wedge an older daemon).\r\n    pub relay: RelayChoice,\r\n    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\r\n    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\r\n    pub peer_pump: bool,\r\n    /// Registry feed push cadence (D9-1).\r\n    pub registry_pump_period: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\r\n    /// node not heard within this window are evicted on the next registry\r\n    /// pump tick — a dead node identity must not poison bare-id resolution\r\n    /// forever. Default [`DEFAULT_REGISTRY_EVICT_AFTER`].\r\n    pub registry_evict_after: Duration,\r\n    /// Notif feed push cadence (D9-1).\r\n    pub notif_pump_period: Duration,\r\n    /// Context sync pull cadence — the anti-entropy loop (D9-1).\r\n    pub sync_pull_period: Duration,\r\n    /// Update check cadence (D9-1; the pull rides the same trusted conns).\r\n    pub update_check_period: Duration,\r\n    /// The NODE leg of the auto-suspend knob chain (D9-2, REQ-INST-3):\r\n    /// dormant → suspended after this many ms counted from dormancy onset.\r\n    /// **`None` = the global default, OFF** — auto-suspend is opt-in\r\n    /// (CONTEXT §dormant/suspended); a constrained node sets it here, and a\r\n    /// per-endpoint `info.json` override wins over this value\r\n    /// ([`crate::resting::effective_auto_suspend`]).\r\n    pub auto_suspend_after_ms: Option<u64>,\r\n    /// The node-level resource-advertisement seed (D9-4, REQ-INST-14): the\r\n    /// default blurb advertised for an endpoint that has not authored its\r\n    /// own (`info.json` `resources` wins when present — config seeds, the\r\n    /// agent refines; CONTEXT §resource advertisement). `None` = endpoints\r\n    /// without their own blurb advertise none.\r\n    pub resources_blurb: Option<String>,\r\n    /// Subnets whose serve-state STARTS detached (M8 decision 6,\r\n    /// REQ-SUBNET-5): the daemon's boot reset seeds the live\r\n    /// `attachment.json` from this list — `spt subnet detach/attach --save`\r\n    /// writes it. Default empty = every held subnet starts attached.\r\n    pub detached_subnets: Vec<String>,\r\n    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\r\n    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\r\n    /// under a live parent with a stale `ready` marker (the `SubagentStop`-never-fired\r\n    /// leak class). Default [`spt_store::worker_reap::DEFAULT_REAP_TTL_SECS`] (24h),\r\n    /// clamped at the reap site to a ≥1h floor (a fat-fingered tiny value can never\r\n    /// mass-kill in-flight workers); `0` disables the TTL leg.\r\n    pub worker_reap_ttl_secs: u64,\r\n    /// Endpoints replayed as startup defaults at daemon start (F-038 W5,\r\n    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\r\n    /// Default empty = nothing auto-starts. A replay failure logs loud and\r","truncated":true,"truncatedBy":"lines","totalLines":619,"totalBytes":9133,"outputLines":160,"outputBytes":9133,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\r\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\r\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\r\n/// Conservative defaults — every loop is a thin call over an idempotent\r\n/// driver, so a missed tick costs only latency, never correctness.\r\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\r\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\r\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\r\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\r\n\r\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\r\n/// authored by a node not heard within this window are evicted on the next\r\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\r\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\r\n/// inside the window keeps its rows), short enough that a dead node identity\r\n/// stops poisoning bare-id resolution within minutes.\r\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\r\n\r\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\r\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\r\n/// `Daemon::run`; kept as a local enum so the config layer stays transport-free.\r\n/// The self-hosted variant (`RelayPolicy::SelfHosted`) needs a relay-map URL\r\n/// list and gets its config plumbing when a self-host consumer exists.\r\n// [impl->REQ-NET-2]\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\npub enum RelayChoice {\r\n    /// n0's public relays — the zero-config default (`\"relay\": \"n0\"`).\r\n    N0,\r\n    /// No relays: direct/LAN only (`\"relay\": \"disabled\"`).\r\n    Disabled,\r\n}\r\n\r\n/// One saved `endpoint run --save` startup default (F-038 W5,\r\n/// REQ-ENDPOINT-AUTOSTART): the daemon REPLAYS these at start — the endpoint\r\n/// analog of the shipped `subnet attach/detach --save` precedent. Minimal by\r\n/// design: the adapter option is re-resolved fresh at each replay (an adapter\r\n/// update between restarts is honored, an uninstalled one loud-skips), and the\r\n/// endpoint's home subnet is NOT recorded (home is durable on the perch —\r\n/// REQ-INST-15). A replay is always a FRESH session (shape (c)\r\n/// restore-what-was-up was rejected — this is a startup default, not a\r\n/// session restore).\r\n// [impl->REQ-ENDPOINT-AUTOSTART]\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\r\npub struct StartupEndpoint {\r\n    /// The endpoint id to bring up.\r\n    pub id: String,\r\n    /// The adapter option (`<adapter>[:profile]`), resolved at replay time.\r\n    pub adapter: String,\r\n    /// The project cwd the harness PTY lands in (captured at `--save`).\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub cwd: Option<String>,\r\n}\r\n\r\n/// The on-disk shape (`<spt_home>/daemon.json`). Every field is optional so a\r\n/// partial file still loads (forward/back-compat) — a missing field takes the\r\n/// default. Stored as plain integers (ms) to keep the file human-editable.\r\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\r\nstruct DaemonConfigFile {\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pulse_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    protection_window_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    crash_grace_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    full_auto_update: Option<bool>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    relay: Option<String>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    peer_pump: Option<bool>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    registry_pump_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    registry_evict_after_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    notif_pump_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    sync_pull_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    update_check_period_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    auto_suspend_after_ms: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    resources_blurb: Option<String>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    detached_subnets: Option<Vec<String>>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    worker_reap_ttl_secs: Option<u64>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    startup_endpoints: Option<Vec<StartupEndpoint>>,\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    docs_port: Option<u16>,\r\n}\r\n\r\n/// Resolved daemon configuration. The brain's scheduled loops read their cadence\r\n/// from `pulse_period`; the drop-ingest guard reads `protection_window_ms`.\r\n/// (No longer `Copy` — `resources_blurb` carries a `String`; callers clone.)\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct DaemonConfig {\r\n    /// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).\r\n    pub pulse_period: Duration,\r\n    /// The drop-file precedence protection window in epoch-ms (6.5).\r\n    pub protection_window_ms: u64,\r\n    /// The orphan-watch grace window (B7): the recovery wait before a\r\n    /// supervised-crash teardown rechecks liveness and signs off (1.1).\r\n    pub crash_grace: Duration,\r\n    /// Whether self-update is full-auto (C2, REQ-UPD-4). **Default `false`** — an\r\n    /// update is gated on user confirmation delivered to the most-recently-active\r\n    /// live session. Setting this to `true` is the explicit opt-in to the\r\n    /// seamless, prompt-free path.\r\n    pub full_auto_update: bool,\r\n    /// The broker net endpoint's relay stance (D4a, REQ-NET-2). Default\r\n    /// [`RelayChoice::N0`] — the ADR-0002 zero-config path. An unrecognized\r\n    /// string degrades to the default (forward-compat: a future value must not\r\n    /// wedge an older daemon).\r\n    pub relay: RelayChoice,\r\n    /// Whether the peer pump runs at all (D9-1). Default `true` — the subnet\r\n    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\r\n    pub peer_pump: bool,\r\n    /// Registry feed push cadence (D9-1).\r\n    pub registry_pump_period: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\r\n    /// node not heard within this window are evicted on the next registry\r\n    /// pump tick — a dead node identity must not poison bare-id resolution\r\n    /// forever. Default [`DEFAULT_REGISTRY_EVICT_AFTER`].\r\n    pub registry_evict_after: Duration,\r\n    /// Notif feed push cadence (D9-1).\r\n    pub notif_pump_period: Duration,\r\n    /// Context sync pull cadence — the anti-entropy loop (D9-1).\r\n    pub sync_pull_period: Duration,\r\n    /// Update check cadence (D9-1; the pull rides the same trusted conns).\r\n    pub update_check_period: Duration,\r\n    /// The NODE leg of the auto-suspend knob chain (D9-2, REQ-INST-3):\r\n    /// dormant → suspended after this many ms counted from dormancy onset.\r\n    /// **`None` = the global default, OFF** — auto-suspend is opt-in\r\n    /// (CONTEXT §dormant/suspended); a constrained node sets it here, and a\r\n    /// per-endpoint `info.json` override wins over this value\r\n    /// ([`crate::resting::effective_auto_suspend`]).\r\n    pub auto_suspend_after_ms: Option<u64>,\r\n    /// The node-level resource-advertisement seed (D9-4, REQ-INST-14): the\r\n    /// default blurb advertised for an endpoint that has not authored its\r\n    /// own (`info.json` `resources` wins when present — config seeds, the\r\n    /// agent refines; CONTEXT §resource advertisement). `None` = endpoints\r\n    /// without their own blurb advertise none.\r\n    pub resources_blurb: Option<String>,\r\n    /// Subnets whose serve-state STARTS detached (M8 decision 6,\r\n    /// REQ-SUBNET-5): the daemon's boot reset seeds the live\r\n    /// `attachment.json` from this list — `spt subnet detach/attach --save`\r\n    /// writes it. Default empty = every held subnet starts attached.\r\n    pub detached_subnets: Vec<String>,\r\n    /// The worker-reap TTL floor (seconds since a worker's `started`), W-3\r\n    /// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even\r\n    /// under a live parent with a stale `ready` marker (the `SubagentStop`-never-fired\r\n    /// leak class). Default [`spt_store::worker_reap::DEFAULT_REAP_TTL_SECS`] (24h),\r\n    /// clamped at the reap site to a ≥1h floor (a fat-fingered tiny value can never\r\n    /// mass-kill in-flight workers); `0` disables the TTL leg.\r\n    pub worker_reap_ttl_secs: u64,\r\n    /// Endpoints replayed as startup defaults at daemon start (F-038 W5,\r\n    /// REQ-ENDPOINT-AUTOSTART) — `spt endpoint run --save` writes this list.\r\n    /// Default empty = nothing auto-starts. A replay failure logs loud and\r\n…\n}","startLine":34,"lineNumbers":[34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,null,200]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\config.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":652,"totalBytes":9133,"outputLines":160,"outputBytes":9133,"shownRange":{"start":34,"end":193},"nextOffset":194}}},"isError":false,"timestamp":1784292937858}}
{"type":"message","id":"e64c435e","parentId":"36405139","timestamp":"2026-07-17T12:55:37.859Z","message":{"role":"toolResult","toolCallId":"call_grkE6NhlQWBRqV1Fr06UaRCl|fc_0148993141920bab016a5a2649c4c081959c386c6fd8be6faf","toolName":"glob","content":[{"type":"text","text":"# crates/spt-daemon/src/\nlivehost.rs\nregistryhost.rs\ndispatch.rs\nprojwriter.rs\nshellwake.rs"}],"details":{"scopePath":"crates/spt-daemon/src","fileCount":5,"files":["crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/shellwake.rs"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784292937859}}
{"type":"message","id":"e0daad38","parentId":"e64c435e","timestamp":"2026-07-17T12:55:37.872Z","message":{"role":"toolResult","toolCallId":"call_90YGeZCjwWNaKYzdG13s0ZkO|fc_0148993141920bab016a5a2649c4c88195b22292189c901a67","toolName":"read","content":[{"type":"text","text":"#[derive(Debug)]\npub enum DispatchOutcome {\n    /// The family's serve loop ran to its own outcome (rendered for the log).\n    Served(String),\n    /// The first line never arrived / didn't parse — dropped.\n    Unknown,\n    /// The worker failed (IO against broker or store).\n    Failed(String),\n}\n\n/// A claimed stream's dispatch lifecycle (ADR-0038 C,\n/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\n/// insert performed BEFORE worker spawn and never cleared — one transient\n/// worker-setup failure permanently abandoned the stream. Claims now\n/// distinguish in-flight vs terminal vs retryable, and a transient failure\n/// requeues bounded (backoff-shaped, never a hot loop).\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum ClaimState {\n    /// A worker owns the stream right now (`attempts` = prior failures).\n    InFlight { attempts: u32 },\n    /// Done for this dispatcher's lifetime: served, unclassifiable, or\n    /// retries exhausted. Terminal outcomes never re-enter the queue.\n    Terminal,\n    /// A transient failure released the claim; eligible again at `next_at`.\n    Retry { attempts: u32, next_at: Instant },\n}\n\n/// Bounded retry budget per stream per dispatcher lifetime — transient setup\n/// failures recover, a persistently-failing stream goes terminal loud.\nconst MAX_DISPATCH_ATTEMPTS: u32 = 3;\n\n/// Backoff base for a released claim (doubles per failed attempt).\nconst DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\n\n/// The backoff before retry number `attempts` (1-based) runs.\nfn retry_backoff(attempts: u32) -> Duration {\n    DISPATCH_RETRY_BASE * 2u32.saturating_pow(attempts.saturating_sub(1))\n}\n\n/// Why a worker failed — the retry CLASSIFICATION (ADR-0038 Amendment fix 5,\n/// REQ-DISPATCH-FALLBACK-CIRCUIT). The two classes retry differently:\n/// a pre-setup transient keeps the bounded ×3 budget (the D3 semantics);\n/// a seat-blocked failure (poisoned replay / prior subscriber still draining)\n/// trips the GLOBAL circuit breaker and requeues WITHOUT burning budget —\n/// the stream must recover once the wedged seat's writer dies (≤ the 15s\n/// bounded-write deadline), and three fast retries would burn to Terminal\n/// before that (the v0.33 abandonment this explicitly must not regress to).\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum FailClass {\n    /// Ordinary transient (broker IPC hiccup, opener not pinned yet, …).\n    Transient,\n    /// The stream's subscriber seat is poisoned or still draining — retrying\n    /// immediately would manufacture another replay victim.\n    SeatBlocked,\n}\n\n/// Classify a worker failure message (the seat-blocked shapes are the two\n/// strings the nethost subscriber discipline emits).\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\nfn classify_failure(msg: &str) -> FailClass {\n    if msg.contains(\"subscriber busy\")\n        || msg.contains(\"replay halted\")\n        || msg.contains(\"lease canceled\")\n    {\n        FailClass::SeatBlocked\n    } else {\n        FailClass::Transient\n    }\n}\n\n/// Whether an opener-query error is the OLD broker's unknown-verb answer —\n/// the ONLY error class that may fall back to the ring peek (ADR-0038\n/// Amendment fix 1). `send_error` on an unknown kind replies exactly\n/// `unknown command kind \"…\"` (broker.rs forward-compat arm), a stable N-1\n/// wire fact. Everything else (transport timeout, EOF, poison) is a\n/// transient — Failed → bounded requeue, never a second replay subscriber.\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\nfn is_unsupported_verb(e: &io::Error) -> bool {\n    e.to_string().contains(\"unknown command kind\")\n}\n\n/// The dispatcher's GLOBAL circuit breaker (ADR-0038 Amendment fix 5): a\n/// seat-blocked failure trips it — claiming pauses dispatcher-wide for a\n/// doubling window (base 2s, cap 30s), so retry machinery cannot hammer a\n/// wedged conn with fresh replay subscribers. Any successful serve resets it.\n/// PURE (instant-in, decision-out) — unit-tested trip/gate/reset.\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n#[derive(Debug, Default)]\nstruct CircuitBreaker {\n    until: Option<Instant>,\n    consecutive: u32,\n}\n\nconst BREAKER_BASE: Duration = Duration::from_secs(2);\nconst BREAKER_CAP: Duration = Duration::from_secs(30);\n\nimpl CircuitBreaker {\n    /// A seat-blocked failure landed: open (or extend) the window.\n    fn trip(&mut self, now: Instant) -> Duration {\n        let window = (BREAKER_BASE * 2u32.saturating_pow(self.consecutive)).min(BREAKER_CAP);\n        self.consecutive = self.consecutive.saturating_add(1);\n        self.until = Some(now + window);\n        window\n    }\n\n    /// Whether claiming is currently paused.\n    fn open(&self, now: Instant) -> bool {\n        self.until.is_some_and(|t| now < t)\n    }\n\n    /// Real progress (a Served outcome): close and reset.\n    fn reset(&mut self) {\n        self.until = None;\n        self.consecutive = 0;\n    }\n}\n\n/// Keyed dispatch telemetry record (ADR-0038 Amendment fix 9,\n/// REQ-DISPATCH-HYGIENE-TELEMETRY): every event names generation, stream,\n/// family (once classified), attempt, and conn — the field-discriminator\n/// surface (poison-window census, per-generation attach counts). PURE\n/// formatting so key completeness is a unit fact.\nfn dispatch_event(\n    gen: u64,\n    stream_id: u64,\n    family: Option<StreamFamily>,\n    attempt: u32,\n    conn_id: u64,\n    event: &str,\n    detail: &str,\n) -> String {\n    format!(\n        \"DISPATCH_EV: gen={gen} stream={stream_id} family={} attempt={attempt} conn={conn_id} event={event} detail={detail}\",\n        family.map_or_else(|| \"unclassified\".to_string(), |f| format!(\"{f:?}\")),\n    )\n}\n\n/// PURE claim decision: may this row be (re)claimed now? `Some(prior\n/// failures)` = claim it; `None` = leave it (in flight, terminal, or backing\n/// off). The unit-tested seam for the no-hot-loop ruling.\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\nfn should_claim(state: Option<&ClaimState>, now: Instant) -> Option<u32> {\n    match state {\n        None => Some(0),\n        Some(ClaimState::Retry { attempts, next_at }) if now >= *next_at => Some(*attempts),\n        _ => None,\n    }\n}\n\n/// Strike budget for a deadline-poisoned ONE-WAY replay (ADR-0040 decision 4,\n/// REQ-REGISTRY-REPLAY-BOUNDED): at budget the row retires TERMINAL — safe by\n/// family semantics (a feed is an idempotent snapshot advertisement; the next\n/// pump round re-advertises, so worst-case loss is one ~30s round, already\n/// the family's freshness unit). Request/reply families are NEVER on this\n/// path — they keep the Amendment breaker's budget-free pacing.\nconst ONEWAY_POISON_STRIKES: u32 = 3;\n\n/// Whether a family is ONE-WAY fire-and-forget snapshot advertisement — the\n/// only class whose poisoned replay may retire terminal at the strike budget\n/// (ADR-0040 decision 4). Registry only: a feed is idempotent and\n/// re-advertised every round. Notif/WanMsg feeds carry durable rows and\n/// replies respectively — dropping one loses real state, so they keep\n/// request/reply semantics here even though their transport is feed-shaped.\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\nfn family_is_one_way(family: Option<StreamFamily>) -> bool {\n    family == Some(StreamFamily::Registry)\n}\n\n/// PURE outcome transition: what a finished worker's claim becomes, plus\n/// whether the row must ALSO retire terminal (the one-way budget path).\n/// Served and Unknown (unclassifiable) are TERMINAL — a terminal\n/// classification never hot-loops. A failure requeues with backoff until the\n/// bounded budget is spent, then goes terminal.\n/// A `SeatBlocked` failure requeues WITHOUT burning the bounded budget —\n/// its pacing comes from the global breaker window (`breaker_window`), and\n/// the stream recovers once the wedged seat clears (T5's not-abandonment\n/// discriminator). A `Transient` keeps the ×3 budget (D3 unchanged).\n///\n/// ONE-WAY exception (ADR-0040 decision 4, REQ-REGISTRY-REPLAY-BOUNDED):\n/// a one-way family's `SeatBlocked` DOES accumulate strikes (in `attempts`)\n/// and retires TERMINAL at [`ONEWAY_POISON_STRIKES`] — a poisoned feed replay\n/// must never remain indefinitely redispatchable (the v0.36 recurring\n/// Registry poisons). Its Transient budget exhaustion retires terminal too —\n/// every terminal-from-failure one-way row leaves the table for good; the\n/// next advertisement round is the recovery. Defense-in-depth behind\n/// REQ-ONEWAY-STREAM-TERMINAL (which removes the population at source).\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\nfn outcome_transition(\n    outcome: &DispatchOutcome,\n    family: Option<StreamFamily>,\n    attempts: u32,\n    now: Instant,\n    breaker_window: Duration,\n) -> (ClaimState, bool) {\n    match outcome {\n        DispatchOutcome::Served(_) | DispatchOutcome::Unknown => (ClaimState::Terminal, false),\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\n            FailClass::SeatBlocked if family_is_one_way(family) => {\n                let attempts = attempts + 1;\n                if attempts >= ONEWAY_POISON_STRIKES {\n                    (ClaimState::Terminal, true)\n                } else {\n                    (\n…\n                    )\n                }\n            }\n…\n        },\n    }\n}\n\n[Showing lines 159-363 of 1920. Use :364 to continue]"}],"details":{"truncation":{"content":"#[derive(Debug)]\r\npub enum DispatchOutcome {\r\n    /// The family's serve loop ran to its own outcome (rendered for the log).\r\n    Served(String),\r\n    /// The first line never arrived / didn't parse — dropped.\r\n    Unknown,\r\n    /// The worker failed (IO against broker or store).\r\n    Failed(String),\r\n}\r\n\r\n/// A claimed stream's dispatch lifecycle (ADR-0038 C,\r\n/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\r\n/// insert performed BEFORE worker spawn and never cleared — one transient\r\n/// worker-setup failure permanently abandoned the stream. Claims now\r\n/// distinguish in-flight vs terminal vs retryable, and a transient failure\r\n/// requeues bounded (backoff-shaped, never a hot loop).\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum ClaimState {\r\n    /// A worker owns the stream right now (`attempts` = prior failures).\r\n    InFlight { attempts: u32 },\r\n    /// Done for this dispatcher's lifetime: served, unclassifiable, or\r\n    /// retries exhausted. Terminal outcomes never re-enter the queue.\r\n    Terminal,\r\n    /// A transient failure released the claim; eligible again at `next_at`.\r\n    Retry { attempts: u32, next_at: Instant },\r\n}\r\n\r\n/// Bounded retry budget per stream per dispatcher lifetime — transient setup\r\n/// failures recover, a persistently-failing stream goes terminal loud.\r\nconst MAX_DISPATCH_ATTEMPTS: u32 = 3;\r\n\r\n/// Backoff base for a released claim (doubles per failed attempt).\r\nconst DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\r\n\r\n/// The backoff before retry number `attempts` (1-based) runs.\r\nfn retry_backoff(attempts: u32) -> Duration {\r\n    DISPATCH_RETRY_BASE * 2u32.saturating_pow(attempts.saturating_sub(1))\r\n}\r\n\r\n/// Why a worker failed — the retry CLASSIFICATION (ADR-0038 Amendment fix 5,\r\n/// REQ-DISPATCH-FALLBACK-CIRCUIT). The two classes retry differently:\r\n/// a pre-setup transient keeps the bounded ×3 budget (the D3 semantics);\r\n/// a seat-blocked failure (poisoned replay / prior subscriber still draining)\r\n/// trips the GLOBAL circuit breaker and requeues WITHOUT burning budget —\r\n/// the stream must recover once the wedged seat's writer dies (≤ the 15s\r\n/// bounded-write deadline), and three fast retries would burn to Terminal\r\n/// before that (the v0.33 abandonment this explicitly must not regress to).\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum FailClass {\r\n    /// Ordinary transient (broker IPC hiccup, opener not pinned yet, …).\r\n    Transient,\r\n    /// The stream's subscriber seat is poisoned or still draining — retrying\r\n    /// immediately would manufacture another replay victim.\r\n    SeatBlocked,\r\n}\r\n\r\n/// Classify a worker failure message (the seat-blocked shapes are the two\r\n/// strings the nethost subscriber discipline emits).\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\nfn classify_failure(msg: &str) -> FailClass {\r\n    if msg.contains(\"subscriber busy\")\r\n        || msg.contains(\"replay halted\")\r\n        || msg.contains(\"lease canceled\")\r\n    {\r\n        FailClass::SeatBlocked\r\n    } else {\r\n        FailClass::Transient\r\n    }\r\n}\r\n\r\n/// Whether an opener-query error is the OLD broker's unknown-verb answer —\r\n/// the ONLY error class that may fall back to the ring peek (ADR-0038\r\n/// Amendment fix 1). `send_error` on an unknown kind replies exactly\r\n/// `unknown command kind \"…\"` (broker.rs forward-compat arm), a stable N-1\r\n/// wire fact. Everything else (transport timeout, EOF, poison) is a\r\n/// transient — Failed → bounded requeue, never a second replay subscriber.\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\nfn is_unsupported_verb(e: &io::Error) -> bool {\r\n    e.to_string().contains(\"unknown command kind\")\r\n}\r\n\r\n/// The dispatcher's GLOBAL circuit breaker (ADR-0038 Amendment fix 5): a\r\n/// seat-blocked failure trips it — claiming pauses dispatcher-wide for a\r\n/// doubling window (base 2s, cap 30s), so retry machinery cannot hammer a\r\n/// wedged conn with fresh replay subscribers. Any successful serve resets it.\r\n/// PURE (instant-in, decision-out) — unit-tested trip/gate/reset.\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n#[derive(Debug, Default)]\r\nstruct CircuitBreaker {\r\n    until: Option<Instant>,\r\n    consecutive: u32,\r\n}\r\n\r\nconst BREAKER_BASE: Duration = Duration::from_secs(2);\r\nconst BREAKER_CAP: Duration = Duration::from_secs(30);\r\n\r\nimpl CircuitBreaker {\r\n    /// A seat-blocked failure landed: open (or extend) the window.\r\n    fn trip(&mut self, now: Instant) -> Duration {\r\n        let window = (BREAKER_BASE * 2u32.saturating_pow(self.consecutive)).min(BREAKER_CAP);\r\n        self.consecutive = self.consecutive.saturating_add(1);\r\n        self.until = Some(now + window);\r\n        window\r\n    }\r\n\r\n    /// Whether claiming is currently paused.\r\n    fn open(&self, now: Instant) -> bool {\r\n        self.until.is_some_and(|t| now < t)\r\n    }\r\n\r\n    /// Real progress (a Served outcome): close and reset.\r\n    fn reset(&mut self) {\r\n        self.until = None;\r\n        self.consecutive = 0;\r\n    }\r\n}\r\n\r\n/// Keyed dispatch telemetry record (ADR-0038 Amendment fix 9,\r\n/// REQ-DISPATCH-HYGIENE-TELEMETRY): every event names generation, stream,\r\n/// family (once classified), attempt, and conn — the field-discriminator\r\n/// surface (poison-window census, per-generation attach counts). PURE\r\n/// formatting so key completeness is a unit fact.\r\nfn dispatch_event(\r\n    gen: u64,\r\n    stream_id: u64,\r\n    family: Option<StreamFamily>,\r\n    attempt: u32,\r\n    conn_id: u64,\r\n    event: &str,\r\n    detail: &str,\r\n) -> String {\r\n    format!(\r\n        \"DISPATCH_EV: gen={gen} stream={stream_id} family={} attempt={attempt} conn={conn_id} event={event} detail={detail}\",\r\n        family.map_or_else(|| \"unclassified\".to_string(), |f| format!(\"{f:?}\")),\r\n    )\r\n}\r\n\r\n/// PURE claim decision: may this row be (re)claimed now? `Some(prior\r\n/// failures)` = claim it; `None` = leave it (in flight, terminal, or backing\r\n/// off). The unit-tested seam for the no-hot-loop ruling.\r\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\r\nfn should_claim(state: Option<&ClaimState>, now: Instant) -> Option<u32> {\r\n    match state {\r\n        None => Some(0),\r\n        Some(ClaimState::Retry { attempts, next_at }) if now >= *next_at => Some(*attempts),\r\n        _ => None,\r\n    }\r\n}\r\n\r\n/// Strike budget for a deadline-poisoned ONE-WAY replay (ADR-0040 decision 4,\r\n/// REQ-REGISTRY-REPLAY-BOUNDED): at budget the row retires TERMINAL — safe by\r\n/// family semantics (a feed is an idempotent snapshot advertisement; the next\r\n/// pump round re-advertises, so worst-case loss is one ~30s round, already\r\n/// the family's freshness unit). Request/reply families are NEVER on this\r\n/// path — they keep the Amendment breaker's budget-free pacing.\r\nconst ONEWAY_POISON_STRIKES: u32 = 3;\r\n\r\n/// Whether a family is ONE-WAY fire-and-forget snapshot advertisement — the\r\n/// only class whose poisoned replay may retire terminal at the strike budget\r\n/// (ADR-0040 decision 4). Registry only: a feed is idempotent and\r\n/// re-advertised every round. Notif/WanMsg feeds carry durable rows and\r\n/// replies respectively — dropping one loses real state, so they keep\r\n/// request/reply semantics here even though their transport is feed-shaped.\r\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\nfn family_is_one_way(family: Option<StreamFamily>) -> bool {\r\n    family == Some(StreamFamily::Registry)\r\n}\r\n\r\n/// PURE outcome transition: what a finished worker's claim becomes, plus\r\n/// whether the row must ALSO retire terminal (the one-way budget path).\r\n/// Served and Unknown (unclassifiable) are TERMINAL — a terminal\r\n/// classification never hot-loops. A failure requeues with backoff until the\r\n/// bounded budget is spent, then goes terminal.\r\n/// A `SeatBlocked` failure requeues WITHOUT burning the bounded budget —\r\n/// its pacing comes from the global breaker window (`breaker_window`), and\r\n/// the stream recovers once the wedged seat clears (T5's not-abandonment\r\n/// discriminator). A `Transient` keeps the ×3 budget (D3 unchanged).\r\n///\r\n/// ONE-WAY exception (ADR-0040 decision 4, REQ-REGISTRY-REPLAY-BOUNDED):\r\n/// a one-way family's `SeatBlocked` DOES accumulate strikes (in `attempts`)\r\n/// and retires TERMINAL at [`ONEWAY_POISON_STRIKES`] — a poisoned feed replay\r\n/// must never remain indefinitely redispatchable (the v0.36 recurring\r\n/// Registry poisons). Its Transient budget exhaustion retires terminal too —\r\n/// every terminal-from-failure one-way row leaves the table for good; the\r\n/// next advertisement round is the recovery. Defense-in-depth behind\r\n/// REQ-ONEWAY-STREAM-TERMINAL (which removes the population at source).\r\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\nfn outcome_transition(\r\n    outcome: &DispatchOutcome,\r\n    family: Option<StreamFamily>,\r\n    attempts: u32,\r\n    now: Instant,\r\n    breaker_window: Duration,\r\n) -> (ClaimState, bool) {\r\n    match outcome {\r\n        DispatchOutcome::Served(_) | DispatchOutcome::Unknown => (ClaimState::Terminal, false),\r\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\r\n            FailClass::SeatBlocked if family_is_one_way(family) => {\r\n                let attempts = attempts + 1;\r\n                if attempts >= ONEWAY_POISON_STRIKES {\r\n                    (ClaimState::Terminal, true)\r\n                } else {\r\n                    (\r","truncated":true,"truncatedBy":"lines","totalLines":1762,"totalBytes":9401,"outputLines":205,"outputBytes":9401,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"#[derive(Debug)]\r\npub enum DispatchOutcome {\r\n    /// The family's serve loop ran to its own outcome (rendered for the log).\r\n    Served(String),\r\n    /// The first line never arrived / didn't parse — dropped.\r\n    Unknown,\r\n    /// The worker failed (IO against broker or store).\r\n    Failed(String),\r\n}\r\n\r\n/// A claimed stream's dispatch lifecycle (ADR-0038 C,\r\n/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`\r\n/// insert performed BEFORE worker spawn and never cleared — one transient\r\n/// worker-setup failure permanently abandoned the stream. Claims now\r\n/// distinguish in-flight vs terminal vs retryable, and a transient failure\r\n/// requeues bounded (backoff-shaped, never a hot loop).\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum ClaimState {\r\n    /// A worker owns the stream right now (`attempts` = prior failures).\r\n    InFlight { attempts: u32 },\r\n    /// Done for this dispatcher's lifetime: served, unclassifiable, or\r\n    /// retries exhausted. Terminal outcomes never re-enter the queue.\r\n    Terminal,\r\n    /// A transient failure released the claim; eligible again at `next_at`.\r\n    Retry { attempts: u32, next_at: Instant },\r\n}\r\n\r\n/// Bounded retry budget per stream per dispatcher lifetime — transient setup\r\n/// failures recover, a persistently-failing stream goes terminal loud.\r\nconst MAX_DISPATCH_ATTEMPTS: u32 = 3;\r\n\r\n/// Backoff base for a released claim (doubles per failed attempt).\r\nconst DISPATCH_RETRY_BASE: Duration = Duration::from_millis(500);\r\n\r\n/// The backoff before retry number `attempts` (1-based) runs.\r\nfn retry_backoff(attempts: u32) -> Duration {\r\n    DISPATCH_RETRY_BASE * 2u32.saturating_pow(attempts.saturating_sub(1))\r\n}\r\n\r\n/// Why a worker failed — the retry CLASSIFICATION (ADR-0038 Amendment fix 5,\r\n/// REQ-DISPATCH-FALLBACK-CIRCUIT). The two classes retry differently:\r\n/// a pre-setup transient keeps the bounded ×3 budget (the D3 semantics);\r\n/// a seat-blocked failure (poisoned replay / prior subscriber still draining)\r\n/// trips the GLOBAL circuit breaker and requeues WITHOUT burning budget —\r\n/// the stream must recover once the wedged seat's writer dies (≤ the 15s\r\n/// bounded-write deadline), and three fast retries would burn to Terminal\r\n/// before that (the v0.33 abandonment this explicitly must not regress to).\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\r\nenum FailClass {\r\n    /// Ordinary transient (broker IPC hiccup, opener not pinned yet, …).\r\n    Transient,\r\n    /// The stream's subscriber seat is poisoned or still draining — retrying\r\n    /// immediately would manufacture another replay victim.\r\n    SeatBlocked,\r\n}\r\n\r\n/// Classify a worker failure message (the seat-blocked shapes are the two\r\n/// strings the nethost subscriber discipline emits).\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\nfn classify_failure(msg: &str) -> FailClass {\r\n    if msg.contains(\"subscriber busy\")\r\n        || msg.contains(\"replay halted\")\r\n        || msg.contains(\"lease canceled\")\r\n    {\r\n        FailClass::SeatBlocked\r\n    } else {\r\n        FailClass::Transient\r\n    }\r\n}\r\n\r\n/// Whether an opener-query error is the OLD broker's unknown-verb answer —\r\n/// the ONLY error class that may fall back to the ring peek (ADR-0038\r\n/// Amendment fix 1). `send_error` on an unknown kind replies exactly\r\n/// `unknown command kind \"…\"` (broker.rs forward-compat arm), a stable N-1\r\n/// wire fact. Everything else (transport timeout, EOF, poison) is a\r\n/// transient — Failed → bounded requeue, never a second replay subscriber.\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\nfn is_unsupported_verb(e: &io::Error) -> bool {\r\n    e.to_string().contains(\"unknown command kind\")\r\n}\r\n\r\n/// The dispatcher's GLOBAL circuit breaker (ADR-0038 Amendment fix 5): a\r\n/// seat-blocked failure trips it — claiming pauses dispatcher-wide for a\r\n/// doubling window (base 2s, cap 30s), so retry machinery cannot hammer a\r\n/// wedged conn with fresh replay subscribers. Any successful serve resets it.\r\n/// PURE (instant-in, decision-out) — unit-tested trip/gate/reset.\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n#[derive(Debug, Default)]\r\nstruct CircuitBreaker {\r\n    until: Option<Instant>,\r\n    consecutive: u32,\r\n}\r\n\r\nconst BREAKER_BASE: Duration = Duration::from_secs(2);\r\nconst BREAKER_CAP: Duration = Duration::from_secs(30);\r\n\r\nimpl CircuitBreaker {\r\n    /// A seat-blocked failure landed: open (or extend) the window.\r\n    fn trip(&mut self, now: Instant) -> Duration {\r\n        let window = (BREAKER_BASE * 2u32.saturating_pow(self.consecutive)).min(BREAKER_CAP);\r\n        self.consecutive = self.consecutive.saturating_add(1);\r\n        self.until = Some(now + window);\r\n        window\r\n    }\r\n\r\n    /// Whether claiming is currently paused.\r\n    fn open(&self, now: Instant) -> bool {\r\n        self.until.is_some_and(|t| now < t)\r\n    }\r\n\r\n    /// Real progress (a Served outcome): close and reset.\r\n    fn reset(&mut self) {\r\n        self.until = None;\r\n        self.consecutive = 0;\r\n    }\r\n}\r\n\r\n/// Keyed dispatch telemetry record (ADR-0038 Amendment fix 9,\r\n/// REQ-DISPATCH-HYGIENE-TELEMETRY): every event names generation, stream,\r\n/// family (once classified), attempt, and conn — the field-discriminator\r\n/// surface (poison-window census, per-generation attach counts). PURE\r\n/// formatting so key completeness is a unit fact.\r\nfn dispatch_event(\r\n    gen: u64,\r\n    stream_id: u64,\r\n    family: Option<StreamFamily>,\r\n    attempt: u32,\r\n    conn_id: u64,\r\n    event: &str,\r\n    detail: &str,\r\n) -> String {\r\n    format!(\r\n        \"DISPATCH_EV: gen={gen} stream={stream_id} family={} attempt={attempt} conn={conn_id} event={event} detail={detail}\",\r\n        family.map_or_else(|| \"unclassified\".to_string(), |f| format!(\"{f:?}\")),\r\n    )\r\n}\r\n\r\n/// PURE claim decision: may this row be (re)claimed now? `Some(prior\r\n/// failures)` = claim it; `None` = leave it (in flight, terminal, or backing\r\n/// off). The unit-tested seam for the no-hot-loop ruling.\r\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\r\nfn should_claim(state: Option<&ClaimState>, now: Instant) -> Option<u32> {\r\n    match state {\r\n        None => Some(0),\r\n        Some(ClaimState::Retry { attempts, next_at }) if now >= *next_at => Some(*attempts),\r\n        _ => None,\r\n    }\r\n}\r\n\r\n/// Strike budget for a deadline-poisoned ONE-WAY replay (ADR-0040 decision 4,\r\n/// REQ-REGISTRY-REPLAY-BOUNDED): at budget the row retires TERMINAL — safe by\r\n/// family semantics (a feed is an idempotent snapshot advertisement; the next\r\n/// pump round re-advertises, so worst-case loss is one ~30s round, already\r\n/// the family's freshness unit). Request/reply families are NEVER on this\r\n/// path — they keep the Amendment breaker's budget-free pacing.\r\nconst ONEWAY_POISON_STRIKES: u32 = 3;\r\n\r\n/// Whether a family is ONE-WAY fire-and-forget snapshot advertisement — the\r\n/// only class whose poisoned replay may retire terminal at the strike budget\r\n/// (ADR-0040 decision 4). Registry only: a feed is idempotent and\r\n/// re-advertised every round. Notif/WanMsg feeds carry durable rows and\r\n/// replies respectively — dropping one loses real state, so they keep\r\n/// request/reply semantics here even though their transport is feed-shaped.\r\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\nfn family_is_one_way(family: Option<StreamFamily>) -> bool {\r\n    family == Some(StreamFamily::Registry)\r\n}\r\n\r\n/// PURE outcome transition: what a finished worker's claim becomes, plus\r\n/// whether the row must ALSO retire terminal (the one-way budget path).\r\n/// Served and Unknown (unclassifiable) are TERMINAL — a terminal\r\n/// classification never hot-loops. A failure requeues with backoff until the\r\n/// bounded budget is spent, then goes terminal.\r\n/// A `SeatBlocked` failure requeues WITHOUT burning the bounded budget —\r\n/// its pacing comes from the global breaker window (`breaker_window`), and\r\n/// the stream recovers once the wedged seat clears (T5's not-abandonment\r\n/// discriminator). A `Transient` keeps the ×3 budget (D3 unchanged).\r\n///\r\n/// ONE-WAY exception (ADR-0040 decision 4, REQ-REGISTRY-REPLAY-BOUNDED):\r\n/// a one-way family's `SeatBlocked` DOES accumulate strikes (in `attempts`)\r\n/// and retires TERMINAL at [`ONEWAY_POISON_STRIKES`] — a poisoned feed replay\r\n/// must never remain indefinitely redispatchable (the v0.36 recurring\r\n/// Registry poisons). Its Transient budget exhaustion retires terminal too —\r\n/// every terminal-from-failure one-way row leaves the table for good; the\r\n/// next advertisement round is the recovery. Defense-in-depth behind\r\n/// REQ-ONEWAY-STREAM-TERMINAL (which removes the population at source).\r\n// [impl->REQ-DISPATCH-CLAIM-RETRY]\r\n// [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n// [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\nfn outcome_transition(\r\n    outcome: &DispatchOutcome,\r\n    family: Option<StreamFamily>,\r\n    attempts: u32,\r\n    now: Instant,\r\n    breaker_window: Duration,\r\n) -> (ClaimState, bool) {\r\n    match outcome {\r\n        DispatchOutcome::Served(_) | DispatchOutcome::Unknown => (ClaimState::Terminal, false),\r\n        DispatchOutcome::Failed(msg) => match classify_failure(msg) {\r\n            FailClass::SeatBlocked if family_is_one_way(family) => {\r\n                let attempts = attempts + 1;\r\n                if attempts >= ONEWAY_POISON_STRIKES {\r\n                    (ClaimState::Terminal, true)\r\n                } else {\r\n                    (\r\n…\n                    )\n                }\n            }\n…\n        },\n    }\n}","startLine":159,"lineNumbers":[159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,null,369,370,371,null,393,394,395]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1920,"totalBytes":9401,"outputLines":205,"outputBytes":9401,"shownRange":{"start":159,"end":363},"nextOffset":364}}},"isError":false,"timestamp":1784292937872}}
{"type":"message","id":"fb1105b3","parentId":"e0daad38","timestamp":"2026-07-17T12:55:37.874Z","message":{"role":"toolResult","toolCallId":"call_zAQE3MZarKK7OwS8TZdZKCKD|fc_0148993141920bab016a5a2649c4e08195a07845dfcf5ada1b","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brainproc.rs\n 329|    let cfg = crate::config::DaemonConfig::load();\n*330|    if cfg.peer_pump {\n*331|        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332|    }\n 333|}\n 334|\n## config.rs\n 38|/// driver, so a missed tick costs only latency, never correctness.\n*39|pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n 40|pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n 41|pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n 42|pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n...\n 102|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*103|    peer_pump: Option<bool>,\n 104|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*105|    registry_pump_period_ms: Option<u64>,\n 106|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 107|    registry_evict_after_ms: Option<u64>,\n 108|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n...\n 151|    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n*152|    pub peer_pump: bool,\n 153|    /// Registry feed push cadence (D9-1).\n*154|    pub registry_pump_period: Duration,\n 155|    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n 156|    /// node not heard within this window are evicted on the next registry\n 157|    /// pump tick — a dead node identity must not poison bare-id resolution\n...\n 209|            relay: RelayChoice::N0,  // zero-config default (ADR-0002)\n*210|            peer_pump: true,         // the subnet self-drives (D9-1)\n*211|            registry_pump_period: DEFAULT_REGISTRY_PUMP_PERIOD,\n 212|            registry_evict_after: DEFAULT_REGISTRY_EVICT_AFTER,\n 213|            notif_pump_period: DEFAULT_NOTIF_PUMP_PERIOD,\n 214|            sync_pull_period: DEFAULT_SYNC_PULL_PERIOD,\n...\n 269|            },\n*270|            peer_pump: file.peer_pump.unwrap_or(d.peer_pump),\n*271|            registry_pump_period: file\n*272|                .registry_pump_period_ms\n 273|                .map(Duration::from_millis)\n*274|                .unwrap_or(d.registry_pump_period),\n 275|            registry_evict_after: file\n 276|                .registry_evict_after_ms\n 277|                .map(Duration::from_millis)\n...\n 313|            ),\n*314|            peer_pump: Some(self.peer_pump),\n*315|            registry_pump_period_ms: Some(self.registry_pump_period.as_millis() as u64),\n 316|            registry_evict_after_ms: Some(self.registry_evict_after.as_millis() as u64),\n 317|            notif_pump_period_ms: Some(self.notif_pump_period.as_millis() as u64),\n 318|            sync_pull_period_ms: Some(self.sync_pull_period.as_millis() as u64),\n...\n 399|            relay: RelayChoice::Disabled,\n*400|            peer_pump: false,\n*401|            registry_pump_period: Duration::from_millis(11_000),\n 402|            registry_evict_after: Duration::from_millis(16_000),\n 403|            notif_pump_period: Duration::from_millis(12_000),\n 404|            sync_pull_period: Duration::from_millis(13_000),\n## relay.rs\n 76|    /// poll window) then drain the offline backlog. Holds no state between calls.\n*77|    pub fn pump_once<F: FnMut(&str, &str)>(&self, mut sink: F) {\n 78|        if let Some((from, body)) = self.listener.check_message_blocking() {\n 79|            sink(&from, &body);\n 80|        }\n...\n 91|        while !stop.load(Ordering::Relaxed) {\n*92|            self.pump_once(&mut sink);\n 93|        }\n 94|    }\n 95|}\n\n## pump/\n### mod.rs\n 139|/// Per-peer dial schedule (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): a peer is\n*140|/// dial-eligible when `now >= next_due`. A `DIAL_FAILED` (or a mid-round\n 141|/// `peer_step` failure — Q3) doubles `backoff` (capped [`PEER_BACKOFF_CAP`]) and\n*142|/// pushes `next_due` out; a successful connect drops the entry (reset). Kept in a\n 143|/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n 144|/// supervised restart like `WorkerLasts`.\n 145|#[derive(Clone, Copy, Debug)]\n 146|struct PeerSched {\n*147|    next_due: Instant,\n 148|    backoff: Duration,\n 149|}\n 150|\n...\n 152|/// failure waits [`PEER_BACKOFF_BASE`]; each subsequent failure doubles, capped\n*153|/// at [`PEER_BACKOFF_CAP`]. `next_due = now + backoff`.\n 154|// [impl->REQ-PUMP-PEER-ISOLATION]\n 155|fn next_peer_backoff(prev: Option<PeerSched>, now: Instant) -> PeerSched {\n 156|    let backoff = match prev {\n...\n 160|    PeerSched {\n*161|        next_due: now + backoff,\n 162|        backoff,\n 163|    }\n 164|}\n...\n 167|/// (never failed, or just reset by a success) is always eligible; one in backoff\n*168|/// is eligible only once `next_due` has passed.\n 169|// [impl->REQ-PUMP-PEER-ISOLATION]\n 170|fn peer_eligible(sched: &HashMap<String, PeerSched>, peer_hex: &str, now: Instant) -> bool {\n*171|    sched.get(peer_hex).is_none_or(|s| now >= s.next_due)\n 172|}\n 173|\n 174|/// The outcome of ONE events-carrier drain read (PUMP-TRUTH W2). Pulled out of the\n...\n 308|        PumpCadence {\n*309|            registry: cfg.registry_pump_period,\n 310|            notif: cfg.notif_pump_period,\n 311|            sync: cfg.sync_pull_period,\n 312|            update: cfg.update_check_period,\n...\n 518|/// logic lives here — the shell owns only *when* and *toward whom*.\n*519|pub fn run_peer_pump(\n 520|    broker_name: &str,\n 521|    registry: Arc<RegistryHost>,\n 522|    paths: &PumpPaths,\n...\n 1206|/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n*1207|/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n 1208|/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n 1209|/// self-heals visibly instead of silently halving the daemon for 24 h.\n 1210|/// `base` is the backoff floor (production: [`SUPERVISE_BACKOFF_BASE`];\n...\n 1212|/// stop request lands promptly. Generic over the body for the unit\n*1213|/// harness; production binds [`run_peer_pump`].\n 1214|// [impl->REQ-DAEMON-5]\n 1215|pub fn supervise_pump(stop: &AtomicBool, base: Duration, mut body: impl FnMut() -> io::Result<()>) {\n 1216|    let mut backoff = base;\n...\n 1226|            // without it is a died-loop fact — same restart as an error.\n*1227|            Ok(Ok(())) => eprintln!(\"PEER_PUMP_EXIT: loop returned without stop — restarting\"),\n*1228|            Ok(Err(e)) => eprintln!(\"PEER_PUMP_FAIL: {e}\"),\n 1229|            Err(panic) => {\n 1230|                let msg = panic\n 1231|                    .downcast_ref::<&str>()\n...\n 1234|                    .unwrap_or_else(|| \"<non-string panic>\".to_string());\n*1235|                eprintln!(\"PEER_PUMP_PANIC: {msg}\");\n 1236|            }\n 1237|        }\n 1238|        backoff = next_backoff(backoff, ran_for, base);\n 1239|        eprintln!(\n*1240|            \"PEER_PUMP_RESTART: supervised restart in {}s\",\n 1241|            backoff.as_secs()\n 1242|        );\n 1243|        let mut slept = Duration::ZERO;\n...\n 1255|// [impl->REQ-DAEMON-5]\n*1256|pub fn spawn_peer_pump(\n 1257|    broker_name: String,\n 1258|    registry: Arc<RegistryHost>,\n 1259|    cfg: DaemonConfig,\n...\n 1264|        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n*1265|            run_peer_pump(\n 1266|                &broker_name,\n 1267|                Arc::clone(&registry),\n 1268|                &paths,\n...\n 1362|    // scheduler kernels — `compute_due` / `pre_rounds` / `run_due` / `mark_ran`\n*1363|    // / `fan_targets`, the exact fns `run_peer_pump` drives — with scripted\n 1364|    // workers and no real time, no broker, no loopback E2E. The peer-step IO\n 1365|    // (PeerIo → brain) is exercised by `tests/pump.rs`; here `run_due` takes a\n 1366|    // recording closure so the ordering/abort choreography is a unit fact.\n...\n 1594|            !peer_eligible(&sched, \"bb\", now),\n*1595|            \"and backs the peer off (not eligible until next_due)\"\n 1596|        );\n 1597|\n 1598|        // A connect-then-silent reply-read TimedOut, reclassified OUT of TimedOut\n...\n 1615|    // failure waits the floor, each subsequent one doubles, saturating at the cap;\n*1616|    // eligibility respects next_due; a reset (success removes the entry) returns to\n 1617|    // the floor. A dead peer backs off; a live peer never languishes.\n 1618|    #[test]\n 1619|    fn per_peer_backoff_doubles_caps_and_eligibility() {"}],"details":{"scopePath":"crates/spt-daemon/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":39,"fileCount":4,"files":["crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/relay.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brainproc.rs","count":2},{"path":"crates/spt-daemon/src/config.rs","count":15},{"path":"crates/spt-daemon/src/pump/mod.rs","count":20},{"path":"crates/spt-daemon/src/relay.rs","count":2}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## brainproc.rs\n 329│    let cfg = crate::config::DaemonConfig::load();\n*330│    if cfg.peer_pump {\n*331│        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332│    }\n 333│}\n 334│\n## config.rs\n  38│/// driver, so a missed tick costs only latency, never correctness.\n *39│pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n  40│pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n  41│pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n  42│pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n    │...\n 102│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*103│    peer_pump: Option<bool>,\n 104│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*105│    registry_pump_period_ms: Option<u64>,\n 106│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 107│    registry_evict_after_ms: Option<u64>,\n 108│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    │...\n 151│    /// self-drives; `false` is the kill switch for debugging/hermetic setups.\n*152│    pub peer_pump: bool,\n 153│    /// Registry feed push cadence (D9-1).\n*154│    pub registry_pump_period: Duration,\n 155│    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows from a\n 156│    /// node not heard within this window are evicted on the next registry\n 157│    /// pump tick — a dead node identity must not poison bare-id resolution\n    │...\n 209│            relay: RelayChoice::N0,  // zero-config default (ADR-0002)\n*210│            peer_pump: true,         // the subnet self-drives (D9-1)\n*211│            registry_pump_period: DEFAULT_REGISTRY_PUMP_PERIOD,\n 212│            registry_evict_after: DEFAULT_REGISTRY_EVICT_AFTER,\n 213│            notif_pump_period: DEFAULT_NOTIF_PUMP_PERIOD,\n 214│            sync_pull_period: DEFAULT_SYNC_PULL_PERIOD,\n    │...\n 269│            },\n*270│            peer_pump: file.peer_pump.unwrap_or(d.peer_pump),\n*271│            registry_pump_period: file\n*272│                .registry_pump_period_ms\n 273│                .map(Duration::from_millis)\n*274│                .unwrap_or(d.registry_pump_period),\n 275│            registry_evict_after: file\n 276│                .registry_evict_after_ms\n 277│                .map(Duration::from_millis)\n    │...\n 313│            ),\n*314│            peer_pump: Some(self.peer_pump),\n*315│            registry_pump_period_ms: Some(self.registry_pump_period.as_millis() as u64),\n 316│            registry_evict_after_ms: Some(self.registry_evict_after.as_millis() as u64),\n 317│            notif_pump_period_ms: Some(self.notif_pump_period.as_millis() as u64),\n 318│            sync_pull_period_ms: Some(self.sync_pull_period.as_millis() as u64),\n    │...\n 399│            relay: RelayChoice::Disabled,\n*400│            peer_pump: false,\n*401│            registry_pump_period: Duration::from_millis(11_000),\n 402│            registry_evict_after: Duration::from_millis(16_000),\n 403│            notif_pump_period: Duration::from_millis(12_000),\n 404│            sync_pull_period: Duration::from_millis(13_000),\n## relay.rs\n 76│    /// poll window) then drain the offline backlog. Holds no state between calls.\n*77│    pub fn pump_once<F: FnMut(&str, &str)>(&self, mut sink: F) {\n 78│        if let Some((from, body)) = self.listener.check_message_blocking() {\n 79│            sink(&from, &body);\n 80│        }\n   │...\n 91│        while !stop.load(Ordering::Relaxed) {\n*92│            self.pump_once(&mut sink);\n 93│        }\n 94│    }\n 95│}\n\n## pump/\n### mod.rs\n  139│/// Per-peer dial schedule (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): a peer is\n *140│/// dial-eligible when `now >= next_due`. A `DIAL_FAILED` (or a mid-round\n  141│/// `peer_step` failure — Q3) doubles `backoff` (capped [`PEER_BACKOFF_CAP`]) and\n *142│/// pushes `next_due` out; a successful connect drops the entry (reset). Kept in a\n  143│/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n  144│/// supervised restart like `WorkerLasts`.\n  145│#[derive(Clone, Copy, Debug)]\n  146│struct PeerSched {\n *147│    next_due: Instant,\n  148│    backoff: Duration,\n  149│}\n  150│\n     │...\n  152│/// failure waits [`PEER_BACKOFF_BASE`]; each subsequent failure doubles, capped\n *153│/// at [`PEER_BACKOFF_CAP`]. `next_due = now + backoff`.\n  154│// [impl->REQ-PUMP-PEER-ISOLATION]\n  155│fn next_peer_backoff(prev: Option<PeerSched>, now: Instant) -> PeerSched {\n  156│    let backoff = match prev {\n     │...\n  160│    PeerSched {\n *161│        next_due: now + backoff,\n  162│        backoff,\n  163│    }\n  164│}\n     │...\n  167│/// (never failed, or just reset by a success) is always eligible; one in backoff\n *168│/// is eligible only once `next_due` has passed.\n  169│// [impl->REQ-PUMP-PEER-ISOLATION]\n  170│fn peer_eligible(sched: &HashMap<String, PeerSched>, peer_hex: &str, now: Instant) -> bool {\n *171│    sched.get(peer_hex).is_none_or(|s| now >= s.next_due)\n  172│}\n  173│\n  174│/// The outcome of ONE events-carrier drain read (PUMP-TRUTH W2). Pulled out of the\n     │...\n  308│        PumpCadence {\n *309│            registry: cfg.registry_pump_period,\n  310│            notif: cfg.notif_pump_period,\n  311│            sync: cfg.sync_pull_period,\n  312│            update: cfg.update_check_period,\n     │...\n  518│/// logic lives here — the shell owns only *when* and *toward whom*.\n *519│pub fn run_peer_pump(\n  520│    broker_name: &str,\n  521│    registry: Arc<RegistryHost>,\n  522│    paths: &PumpPaths,\n     │...\n 1206│/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n*1207│/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n 1208│/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n 1209│/// self-heals visibly instead of silently halving the daemon for 24 h.\n 1210│/// `base` is the backoff floor (production: [`SUPERVISE_BACKOFF_BASE`];\n     │...\n 1212│/// stop request lands promptly. Generic over the body for the unit\n*1213│/// harness; production binds [`run_peer_pump`].\n 1214│// [impl->REQ-DAEMON-5]\n 1215│pub fn supervise_pump(stop: &AtomicBool, base: Duration, mut body: impl FnMut() -> io::Result<()>) {\n 1216│    let mut backoff = base;\n     │...\n 1226│            // without it is a died-loop fact — same restart as an error.\n*1227│            Ok(Ok(())) => eprintln!(\"PEER_PUMP_EXIT: loop returned without stop — restarting\"),\n*1228│            Ok(Err(e)) => eprintln!(\"PEER_PUMP_FAIL: {e}\"),\n 1229│            Err(panic) => {\n 1230│                let msg = panic\n 1231│                    .downcast_ref::<&str>()\n     │...\n 1234│                    .unwrap_or_else(|| \"<non-string panic>\".to_string());\n*1235│                eprintln!(\"PEER_PUMP_PANIC: {msg}\");\n 1236│            }\n 1237│        }\n 1238│        backoff = next_backoff(backoff, ran_for, base);\n 1239│        eprintln!(\n*1240│            \"PEER_PUMP_RESTART: supervised restart in {}s\",\n 1241│            backoff.as_secs()\n 1242│        );\n 1243│        let mut slept = Duration::ZERO;\n     │...\n 1255│// [impl->REQ-DAEMON-5]\n*1256│pub fn spawn_peer_pump(\n 1257│    broker_name: String,\n 1258│    registry: Arc<RegistryHost>,\n 1259│    cfg: DaemonConfig,\n     │...\n 1264│        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n*1265│            run_peer_pump(\n 1266│                &broker_name,\n 1267│                Arc::clone(&registry),\n 1268│                &paths,\n     │...\n 1362│    // scheduler kernels — `compute_due` / `pre_rounds` / `run_due` / `mark_ran`\n*1363│    // / `fan_targets`, the exact fns `run_peer_pump` drives — with scripted\n 1364│    // workers and no real time, no broker, no loopback E2E. The peer-step IO\n 1365│    // (PeerIo → brain) is exercised by `tests/pump.rs`; here `run_due` takes a\n 1366│    // recording closure so the ordering/abort choreography is a unit fact.\n     │...\n 1594│            !peer_eligible(&sched, \"bb\", now),\n*1595│            \"and backs the peer off (not eligible until next_due)\"\n 1596│        );\n 1597│\n 1598│        // A connect-then-silent reply-read TimedOut, reclassified OUT of TimedOut\n     │...\n 1615│    // failure waits the floor, each subsequent one doubles, saturating at the cap;\n*1616│    // eligibility respects next_due; a reset (success removes the entry) returns to\n 1617│    // the floor. A dead peer backs off; a live peer never languishes.\n 1618│    #[test]\n 1619│    fn per_peer_backoff_doubles_caps_and_eligibility() {"},"isError":false,"timestamp":1784292937874}}
{"type":"message","id":"f086f696","parentId":"fb1105b3","timestamp":"2026-07-17T12:55:37.897Z","message":{"role":"toolResult","toolCallId":"call_6JfPt3OORhJjYbRWp0fpHbcQ|fc_0148993141920bab016a5a2649c4d08195af9b08d897ac09a6","toolName":"read","content":[{"type":"text","text":"/// reports a net endpoint up (`net_enabled`) AND we have not already started\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\n/// semantics that keep a single dispatcher/peer-pump set running.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\n    net_enabled && !already_started\n}\n\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\n/// the brain child (restoration D2-1):** both are standalone IPC clients\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\n/// restartable brain. Each mints its own registry + stop flag and connects\n/// independently; when the brain process exits these in-process threads die with\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\n/// `net-status` reply rather than the broker's identity load.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n// [impl->REQ-DAEMON-9]\nfn spawn_net_consumers(node_hex: &str) {\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n    let stop = Arc::new(AtomicBool::new(false));\n    let _ = crate::dispatch::spawn_dispatcher(\n        broker_socket_name(),\n        Arc::clone(&registry),\n        Arc::clone(&stop),\n    );\n    let cfg = crate::config::DaemonConfig::load();\n    if cfg.peer_pump {\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n    }\n}\n\n/// Connect to the broker, retrying briefly while it finishes binding.\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\n    let mut last: Option<io::Error> = None;\n    for _ in 0..tries {\n        match Brain::cold_start(name, now_ms()) {\n            Ok(b) => return Ok(b),\n            Err(e) => {\n                last = Some(e);\n                thread::sleep(Duration::from_millis(10));\n            }\n        }\n    }\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\n}\n\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\n/// flips across a swap; the D7-4 field run asserts it matches the released\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn write_ready(generation: u64) {\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\n    if let Some(hash) = current_exe_hash() {\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n    }\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\n}\n\n/// Lowercase-hex SHA-256 of the running process's own executable file,\n/// captured **exactly once per brain process** (best-effort; a failed\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\n/// running. The once-per-process capture is load-bearing TWICE\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\n\n[Showing lines 302-383 of 2165. Use :384 to continue]"}],"details":{"truncation":{"content":"/// reports a net endpoint up (`net_enabled`) AND we have not already started\r\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\r\n/// semantics that keep a single dispatcher/peer-pump set running.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\r\n    net_enabled && !already_started\r\n}\r\n\r\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\r\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\r\n/// the brain child (restoration D2-1):** both are standalone IPC clients\r\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\r\n/// restartable brain. Each mints its own registry + stop flag and connects\r\n/// independently; when the brain process exits these in-process threads die with\r\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\r\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\r\n/// `net-status` reply rather than the broker's identity load.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n// [impl->REQ-DAEMON-9]\r\nfn spawn_net_consumers(node_hex: &str) {\r\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\r\n    let stop = Arc::new(AtomicBool::new(false));\r\n    let _ = crate::dispatch::spawn_dispatcher(\r\n        broker_socket_name(),\r\n        Arc::clone(&registry),\r\n        Arc::clone(&stop),\r\n    );\r\n    let cfg = crate::config::DaemonConfig::load();\r\n    if cfg.peer_pump {\r\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\r\n    }\r\n}\r\n\r\n/// Connect to the broker, retrying briefly while it finishes binding.\r\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\r\n    let mut last: Option<io::Error> = None;\r\n    for _ in 0..tries {\r\n        match Brain::cold_start(name, now_ms()) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => {\r\n                last = Some(e);\r\n                thread::sleep(Duration::from_millis(10));\r\n            }\r\n        }\r\n    }\r\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\r\n}\r\n\r\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\r\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\r\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\r\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\r\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\r\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\r\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\r\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\r\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\r\n/// flips across a swap; the D7-4 field run asserts it matches the released\r\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\r\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\r\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\r\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn write_ready(generation: u64) {\r\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\r\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\r\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\r\n    if let Some(hash) = current_exe_hash() {\r\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\r\n    }\r\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\r\n}\r\n\r\n/// Lowercase-hex SHA-256 of the running process's own executable file,\r\n/// captured **exactly once per brain process** (best-effort; a failed\r\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\r\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\r\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\r\n/// running. The once-per-process capture is load-bearing TWICE\r\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\r\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\r\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\r","truncated":true,"truncatedBy":"lines","totalLines":1864,"totalBytes":4565,"outputLines":82,"outputBytes":4565,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// reports a net endpoint up (`net_enabled`) AND we have not already started\r\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\r\n/// semantics that keep a single dispatcher/peer-pump set running.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\r\n    net_enabled && !already_started\r\n}\r\n\r\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\r\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\r\n/// the brain child (restoration D2-1):** both are standalone IPC clients\r\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\r\n/// restartable brain. Each mints its own registry + stop flag and connects\r\n/// independently; when the brain process exits these in-process threads die with\r\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\r\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\r\n/// `net-status` reply rather than the broker's identity load.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n// [impl->REQ-DAEMON-9]\r\nfn spawn_net_consumers(node_hex: &str) {\r\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\r\n    let stop = Arc::new(AtomicBool::new(false));\r\n    let _ = crate::dispatch::spawn_dispatcher(\r\n        broker_socket_name(),\r\n        Arc::clone(&registry),\r\n        Arc::clone(&stop),\r\n    );\r\n    let cfg = crate::config::DaemonConfig::load();\r\n    if cfg.peer_pump {\r\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\r\n    }\r\n}\r\n\r\n/// Connect to the broker, retrying briefly while it finishes binding.\r\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\r\n    let mut last: Option<io::Error> = None;\r\n    for _ in 0..tries {\r\n        match Brain::cold_start(name, now_ms()) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => {\r\n                last = Some(e);\r\n                thread::sleep(Duration::from_millis(10));\r\n            }\r\n        }\r\n    }\r\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\r\n}\r\n\r\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\r\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\r\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\r\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\r\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\r\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\r\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\r\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\r\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\r\n/// flips across a swap; the D7-4 field run asserts it matches the released\r\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\r\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\r\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\r\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn write_ready(generation: u64) {\r\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\r\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\r\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\r\n    if let Some(hash) = current_exe_hash() {\r\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\r\n    }\r\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\r\n}\r\n\r\n/// Lowercase-hex SHA-256 of the running process's own executable file,\r\n/// captured **exactly once per brain process** (best-effort; a failed\r\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\r\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\r\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\r\n/// running. The once-per-process capture is load-bearing TWICE\r\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\r\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\r\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\r","startLine":302,"lineNumbers":[302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brainproc.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2165,"totalBytes":4565,"outputLines":82,"outputBytes":4565,"shownRange":{"start":302,"end":383},"nextOffset":384}}},"isError":false,"timestamp":1784292937897}}
{"type":"message","id":"266b4804","parentId":"f086f696","timestamp":"2026-07-17T12:55:37.915Z","message":{"role":"toolResult","toolCallId":"call_YPDnP0RjZ4Dyk6WExvDJwlPq|fc_0148993141920bab016a5a2649c4b08195b1dffb1d7ac88f62","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brainproc.rs\n 9|//! `spt daemon brain` child. The child connects over the existing broker socket\n*10|//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2\n 11|//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n 12|//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n 13|//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n...\n 138|/// The `spt daemon brain` child entry. Connect to the broker over the existing\n*139|/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\n 140|/// holding the connection and probing broker liveness each heartbeat. A dropped\n 141|/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\n 142|/// returns `Err`, exiting the process so the broker-side supervisor respawns it\n...\n 159|pub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\n*160|    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\n 161|    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\n 162|    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\n 163|    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\n 164|    // [impl->REQ-DAEMON-STDERR-PERSIST]\n*165|    let _ = crate::stderrlog::install(\"brain\", generation);\n 166|    let name = broker_socket_name();\n 167|    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\n 168|    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\n...\n 225|    // instance's `wake_command` as a supervised watcher child. Relocated from\n*226|    // the broker process to the brain child: shellwake is brain-owned logic\n 227|    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\n 228|    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\n 229|    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\n...\n 457|/// deterministically with a scripted ready/no-ready + a capturing notif sink,\n*458|/// while production binds the real `spt_home` + relcache + notif sender\n 459|/// ([`ProductionTrialEnv`]). Every method is **best-effort / fail-safe**: a\n 460|/// missing record reads as \"no pending trial\", an absent ready file as\n 461|/// \"not ready\" — the broker's supervisor thread never panics (a panic there\n...\n 532|\n*533|/// Production [`TrialEnv`]: reads/writes the canonical `spt_home` durable files\n 534|/// (the `releases` relcache + the `brain.ready` breadcrumb) and fires the\n 535|/// rollback notif through the real producer front door. Constructed in the\n*536|/// broker process where `spt_home()` is stable.\n 537|///\n 538|/// Holds the live [`crate::broker::Broker`] handle (or `None` on a net-less /\n 539|/// bind-failed daemon) so the DRAINED gate ([`TrialEnv::old_gen_drained`]) reads\n...\n 548|    fn cache(&self) -> ReleaseCache {\n*549|        ReleaseCache::open(&spt_store::perch::spt_home().join(\"releases\"))\n 550|    }\n 551|}\n 552|\n...\n 1016|/// (non-detached) managed child, so it inherits the broker's environment —\n*1017|/// including `SPT_HOME` — and dies with no orphaning. NOT `spawn_detached`\n*1018|/// (that path rebuilds the Windows env block and would drop `SPT_HOME`). The\n 1019|/// broker stamps `{generation, start-reason}` onto the argv (ADR-0018 V2).\n 1020|///\n 1021|/// `binary` is the **record-driven selection** (D6-2): `None` spawns the\n...\n 1063|    // spawns the daemon); CREATE_NO_WINDOW suppresses it without detaching, so\n*1064|    // the plain-child SPT_HOME inheritance (above) is preserved.\n 1065|    #[cfg(windows)]\n 1066|    {\n 1067|        use std::os::windows::process::CommandExt;\n## broker.rs\n 2651|/// A REAL fault WITH the perch stamp: mark the session degraded, surface the fault\n*2652|/// on the perch record (not only the F-019 unread daemon-stderr channel), log it,\n 2653|/// and reap the child. Unlike ADR-0022's original design this is NOT permanent\n 2654|/// death — the dispatch path bounded-respawns a faulted binary\n 2655|/// (REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH).\n...\n 2814|    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n*2815|    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n 2816|    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n 2817|        Self::bind_in(name, default_journal_path())\n 2818|    }\n...\n 2974|            match sessions.get(&id) {\n*2975|                Some(h) => Arc::clone(&h.log),\n 2976|                None => return false,\n 2977|            }\n 2978|        };\n...\n 3028|    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n*3029|    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n 3030|    /// `#[doc(hidden)]` — test support, not a product surface.\n 3031|    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n 3032|    #[doc(hidden)]\n...\n 3036|            match sessions.get(&id) {\n*3037|                Some(h) => Arc::clone(&h.log),\n 3038|                None => return None,\n 3039|            }\n 3040|        };\n...\n 3113|        sessions.values().any(|h| {\n*3114|            match h.log.lock() {\n 3115|                Ok(log) => log.local_controller_wedged(now, deadline),\n 3116|                // A poisoned log lock cannot be honestly read — treat as NOT wedged\n 3117|                // (fail toward promotion, never a permanent gate that strands apply).\n...\n 3145|            .get(&id)\n*3146|            .map(|h| recover_log(&h.log).next_seq)\n 3147|    }\n 3148|\n 3149|    /// Drive one brain connection: handshake, then dispatch its command frames\n...\n 3338|                                    h.endpoint.clone(),\n*3339|                                    Arc::clone(&h.log),\n 3340|                                    h.session.process_id(),\n 3341|                                    h.adapter.clone(),\n 3342|                                    h.spawned_at.elapsed().as_millis() as u64,\n...\n 3473|                .iter()\n*3474|                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n 3475|                .collect()\n 3476|        };\n 3477|        for log in &logs {\n...\n 3639|                                    if let Some(h) = removed {\n*3640|                                        recover_log(&h.log).stamp_reaped();\n 3641|                                        eprintln!(\n 3642|                                            \"SPAWN_ZOMBIE_FORCE_DETABLE:{}: exit-waiter never \\\n 3643|                                             reaped dead session {sid} — de-tabled directly\",\n...\n 3721|            id,\n*3722|            self.log_cap_chunks,\n 3723|            req.endpoint.clone(),\n 3724|            (req.rows, req.cols),\n 3725|        )));\n...\n 3873|                .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*3874|            Arc::clone(&h.log)\n 3875|        };\n 3876|        let outcome = recover_log(&log).resolve_subscribe(\n 3877|            Arc::clone(send),\n...\n 3898|            match sessions.get(&req.session_id) {\n*3899|                Some(h) => Arc::clone(&h.log),\n 3900|                None => {\n 3901|                    eprintln!(\"DBG unsubscribe: no session {}\", req.session_id);\n 3902|                    return Ok(());\n...\n 4029|                Arc::clone(&h.translation_respawns),\n*4030|                Arc::clone(&h.log),\n 4031|            )\n 4032|        };\n 4033|        // Bounded give-up: stop respawning once the budget is spent. The binary then\n...\n 4207|                .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*4208|            (Arc::clone(&h.session), Arc::clone(&h.log))\n 4209|        };\n 4210|        if !recover_log(&log).is_controller(send) {\n 4211|            return Err(\n...\n 4940|                map.get(id)\n*4941|                    .map(|s| (Arc::clone(&s.input), Arc::clone(&s.log)))\n 4942|            };\n 4943|            let Some((input, log)) = snapshot else {\n 4944|                continue; // session exited mid-apply — nothing to restart\n...\n 4975|\n*4976|/// The default broker-owned effect-journal path: `<spt_home>/daemon-effects.log`.\n 4977|pub(crate) fn default_journal_path() -> std::path::PathBuf {\n*4978|    spt_store::perch::spt_home().join(\"daemon-effects.log\")\n 4979|}\n 4980|\n 4981|/// Write a frame to the brain, ignoring failures (brain gone / conn poisoned).\n...\n 5979|        let dir = tempfile::tempdir().unwrap();\n*5980|        let journal = EffectJournal::open(dir.path().join(\"effects.log\")).unwrap();\n 5981|        let (w, rx) = test_input_writer(16);\n 5982|        let key = EffectKey {\n 5983|            class: 1,\n## config.rs\n 7|//! period is **durable and configurable**, sourced from a small JSON file under\n*8|//! the spt home (`<spt_home>/daemon.json`) and falling back to the default when\n 9|//! absent. Kept deliberately tiny — one struct, JSON via the crate's existing\n 10|//! `serde_json` dep (no new TOML edge) — so the brain's loop reads its cadence\n 11|//! from config, never a constant.\n...\n 86|\n*87|/// The on-disk shape (`<spt_home>/daemon.json`). Every field is optional so a\n 88|/// partial file still loads (forward/back-compat) — a missing field takes the\n 89|/// default. Stored as plain integers (ms) to keep the file human-editable.\n 90|#[derive(Debug, Clone, Default, Serialize, Deserialize)]\n...\n 226|impl DaemonConfig {\n*227|    /// The canonical config path: `<spt_home>/daemon.json`.\n 228|    pub fn default_path() -> PathBuf {\n*229|        spt_store::perch::spt_home().join(\"daemon.json\")\n 230|    }\n 231|\n 232|    /// Load the daemon config from the canonical path, falling back to the\n...\n 588|    // [unit->REQ-ENDPOINT-AUTOSTART] upsert semantics on the CANONICAL path\n*589|    // (`<spt_home>/daemon.json`): a new id APPENDS (returns false), the same id\n 590|    // REPLACES in place (returns true, latest run wins), and the surrounding\n 591|    // knobs the daemon owns survive the load→mutate→save round-trip untouched.\n*592|    // Serialized against every other SPT_HOME test in this binary via `with_home`.\n 593|    #[test]\n 594|    fn upsert_startup_endpoint_appends_then_replaces_preserving_other_knobs() {\n 595|        crate::test_home::with_home(|_home| {\n## daemon.rs\n 233|                        );\n*234|                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\n 235|                        match crate::docshost::start(docs_root, port) {\n 236|                            Ok(bound) => eprintln!(\n 237|                                \"DOCS_SERVER_UP: {}\",\n...\n 305|        // online/offline exclusivity — now run in the BRAIN child (restoration\n*306|        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\n 307|        // disk-reconciler whose boot sweep re-reconciles the watcher children on\n 308|        // every brain start. The broker no longer hosts it; see\n 309|        // [`crate::brainproc::run_brain`].\n...\n 609|/// Spawn `spt daemon` as a detached background process. Inherits the environment\n*610|/// — so the child resolves the **same** `SPT_HOME`, hence the same canonical\n 611|/// socket names — but drops the std handles so it outlives the launching CLI\n 612|/// call. The child is independent (not killed when the parent exits): on unix it\n 613|/// is reparented to init when the launcher exits; on Windows a child is not in\n...\n 1016|/// undrained PIPE\": a pipe nobody drains is the whole hazard — its write BLOCKS the\n*1017|/// daemon once full. Every OTHER sink is safe and MUST survive: a FILE (`2>run.log`,\n*1018|/// AND every int test's `Stdio::from(file)` brain-log capture) is a disk handle that\n 1019|/// never blocks; a CONSOLE scrolls; a NULL/absent handle (the DETACHED_PROCESS rungs)\n 1020|/// already discards. So we DELIBERATELY do NOT gate on \"no console\" (`GetConsoleWindow`):\n 1021|/// a CREATE_NO_WINDOW daemon has no console window yet a perfectly-drained FILE stderr\n*1022|/// — nulling it would blank the capture (the test-harness brain-log assertions) for\n 1023|/// ZERO safety gain, since a file never blocks. `stderr_file_type` is the raw\n 1024|/// `GetFileType(stderr)`. Pure so both CI legs unit-test it. // [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\n 1025|pub fn should_null_std_handles(stderr_file_type: u32) -> bool {\n...\n 1039|/// pipe-tee ergonomics. The SANCTIONED foreground-capture form is a FILE redirect\n*1040|/// (`spt daemon run 2>run.log`): a disk handle is not a pipe, so it survives (this is\n*1041|/// exactly why the int-test brain-log capture is safe). Called unconditionally at\n 1042|/// `daemon run` startup. // [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\n 1043|#[cfg(windows)]\n 1044|pub fn null_std_handles_if_detached_in_fact() {\n...\n 1070|/// the user-profile environment block, so transient shell vars (most importantly\n*1071|/// `SPT_HOME`, which selects the daemon's entire universe of sockets/perches)\n*1072|/// are LOST. Verified empirically (a WMI child saw `%SPT_HOME%` unexpanded).\n 1073|/// We therefore forward every `SPT_*` var explicitly via `cmd /c set …`, then\n 1074|/// `start \"\" /b` so the launching `cmd` returns immediately and the daemon\n 1075|/// continues — job-neutral, since `cmd` is the creator's child (outside any\n...\n 1271|    // [unit->REQ-HAZARD-DETACHED-DAEMON-STDIO] the detached-in-fact decision is EXACTLY\n*1272|    // \"is stderr a PIPE\" — the only sink that blocks when it fills. A FILE (2>run.log,\n*1273|    // and every int test's Stdio::from(file) brain-log capture), a CONSOLE, and a\n 1274|    // NULL/absent handle (DETACHED_PROCESS rungs) all SURVIVE — nulling them is\n 1275|    // wrong (blanks a drained capture) and pointless (they never block). RED-FIRST:\n 1276|    // returning `true` unconditionally makes the non-pipe cases go red — which is\n*1277|    // exactly the mass int-test brain-log-blanking regression the file-type gate avoids.\n 1278|    #[test]\n 1279|    fn null_std_handles_only_on_a_pipe_stderr() {\n 1280|        const FILE_TYPE_UNKNOWN: u32 = 0x0000;\n...\n 1285|            !should_null_std_handles(FILE_TYPE_DISK),\n*1286|            \"a FILE redirect (2>run.log / the int-test brain-log) is disk ⇒ survives\"\n 1287|        );\n 1288|        assert!(\n 1289|            !should_null_std_handles(FILE_TYPE_CHAR),\n...\n 1565|            .env(\"SPT_BREAKAWAY_PIDFILE\", &pidfile)\n*1566|            .env(\"SPT_BREAKAWAY_DIAG\", std::env::temp_dir().join(format!(\"spt_breakaway_diag_{}.log\", std::process::id())))\n 1567|            // CREATE_BREAKAWAY_FROM_JOB: escape the test-runner's OWN ancestor job\n 1568|            // (cargo/CI run the test harness inside a job), so MY job below becomes\n 1569|            // the launcher's ONLY job — otherwise the grandchild's breakaway lands\n...\n 1640|        let _ = std::fs::remove_file(&pidfile);\n*1641|        let diagpath = std::env::temp_dir().join(format!(\"spt_breakaway_diag_{}.log\", std::process::id()));\n 1642|        let diag = std::fs::read_to_string(&diagpath).unwrap_or_default();\n 1643|        let _ = std::fs::remove_file(&diagpath);\n 1644|\n## deadline.rs\n 41|\n*42|/// The canonical anchor path for a loop key: `<spt_home>/deadline-<key>.json`.\n 43|///\n 44|/// Keyed, not a singleton (ADR-0018 D5 amendment 6): a singleton would\n 45|/// cross-clobber the moment the live-agent adapter's **per-agent** pulse drivers\n...\n 49|pub fn anchor_path(key: &str) -> PathBuf {\n*50|    spt_store::perch::spt_home().join(format!(\"deadline-{key}.json\"))\n 51|}\n 52|\n*53|/// On-disk shape of a periodic deadline anchor (`<spt_home>/deadline-<key>.json`).\n 54|/// `interval_ms > 0` is an invariant the constructor enforces, so the pure derive\n 55|/// never divides by zero.\n 56|// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n...\n 298|\n*299|    // ---- rehydration rule + persistence (need an isolated SPT_HOME) ---------\n 300|\n 301|    #[test] // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 302|    fn cold_and_crash_write_fresh_anchor_at_now() {\n## deelevate.rs\n 73|///\n*74|/// This is the seam that keeps an explicit `SPT_HOME` (the universe\n*75|/// relocation knob — `spt_store::perch::spt_home`) alive across the Windows\n 76|/// de-elevation respawn. `CreateEnvironmentBlock` rebuilds the desktop\n 77|/// user's variables from scratch (to fix `%LOCALAPPDATA%` when UAC elevated\n 78|/// through a different admin account), which would otherwise DROP the\n*79|/// invoker's `SPT_HOME` — landing the de-elevated daemon in the default home\n 80|/// and binding a different seed-control socket, so a later `spt daemon stop`\n*81|/// (still carrying `SPT_HOME`) sees no daemon and prints `DAEMON_NOT_RUNNING`\n 82|/// while the orphaned daemon serves the wrong home.\n 83|// [impl->REQ-HAZARD-ELEVATED-DAEMON-SPAWN]\n 84|pub fn apply_env_overrides(block: &[u16], overrides: &[(String, String)]) -> Vec<u16> {\n...\n 132|        /// The invoker's home dir (passwd lookup), for `HOME` — the state\n*133|        /// universe anchor (`spt_home` resolves through `$HOME`).\n 134|        pub home: Option<PathBuf>,\n 135|    }\n 136|\n...\n 695|    /// The invoker's explicit universe overrides that must survive the\n*696|    /// de-elevation respawn. `SPT_HOME` is the relocation knob\n*697|    /// (`spt_store::perch::spt_home`): when set, it selects the daemon's home\n 698|    /// (and therefore its seed-control socket) over `%LOCALAPPDATA%`, so it\n 699|    /// must ride through the rebuilt desktop-user environment block. Empty in\n 700|    /// the common case (no override) — the block then passes through untouched.\n 701|    fn deelevation_env_overrides() -> Vec<(String, String)> {\n*702|        match std::env::var(\"SPT_HOME\") {\n*703|            Ok(v) if !v.is_empty() => vec![(\"SPT_HOME\".to_string(), v)],\n 704|            _ => Vec::new(),\n 705|        }\n 706|    }\n...\n 745|        let env_built = unsafe { CreateEnvironmentBlock(&mut env, token, 0) != 0 };\n*746|        // Overlay the invoker's explicit universe overrides (SPT_HOME) onto the\n 747|        // rebuilt desktop-user block so the respawn lands in the home the caller\n 748|        // chose — see `apply_env_overrides`. When the block build failed we pass\n*749|        // null (inherit ours), which already carries SPT_HOME.\n 750|        let overrides = deelevation_env_overrides();\n 751|        let mut overlaid: Vec<u16> = Vec::new();\n 752|        let env_ptr = if env_built && !overrides.is_empty() {\n...\n 854|    // [unit->REQ-HAZARD-ELEVATED-DAEMON-SPAWN] the de-elevation env overlay:\n*855|    // an explicit SPT_HOME REPLACES the rebuilt desktop-user value (so the\n 856|    // respawned daemon binds the invoker's home's seed-control socket, not the\n 857|    // default home's — the DAEMON_NOT_RUNNING acceptance bug), matches the env\n 858|    // name case-insensitively, appends when absent, and leaves the block intact\n...\n 860|    #[test]\n*861|    fn env_overlay_keeps_explicit_spt_home_alive() {\n*862|        // Replace: desktop block already has SPT_HOME (the default home).\n*863|        let b = block(&[\"PATH=C:\\\\win\", \"spt_home=C:\\\\default\"]);\n 864|        let out = apply_env_overrides(\n 865|            &b,\n*866|            &[(\"SPT_HOME\".to_string(), \"C:\\\\accept\".to_string())],\n 867|        );\n 868|        let got = parse(&out);\n 869|        assert!(got.contains(&\"PATH=C:\\\\win\".to_string()));\n*870|        assert!(got.contains(&\"SPT_HOME=C:\\\\accept\".to_string()));\n*871|        // exactly one SPT_HOME entry (the old, case-variant one is gone).\n 872|        assert_eq!(\n 873|            got.iter()\n*874|                .filter(|e| e.to_ascii_uppercase().starts_with(\"SPT_HOME=\"))\n 875|                .count(),\n 876|            1\n 877|        );\n...\n 880|\n*881|        // Append: block has no SPT_HOME.\n 882|        let b = block(&[\"PATH=C:\\\\win\"]);\n 883|        let out = apply_env_overrides(\n 884|            &b,\n## digest.rs\n 21|//! - A **log-less** adapter pushes digest-records directly via `api digest-entry`\n*22|//!   into the perch's `digest.log` → the projection reads that.\n 23|//!\n 24|//! The records carry the published digest-record contract\n 25|//! ([`spt_term::DigestRecord`]); the projection folds them into the structured\n...\n 124|/// two-origin timeline — the adapter's **activity** (the `[digest]` extractor\n*125|/// spanning the last K sessions, REQ-TERM-6; else the log-less `digest.log` push\n 126|/// records) merged by `ts` with spt's own **context-injection** entries\n 127|/// (REQ-TERM-7) — and folds it through [`spt_term::project_timeline`] with the\n 128|/// effective presentation config ([`resolve_config`]: adapter `[digest]` defaults,\n...\n 158|\n*159|    // spt-owned context-injection entries (REQ-TERM-7) always live in digest.log.\n 160|    let context = read_context_items(&perch_path);\n 161|\n 162|    // The read-vars captured at bind (REQ-DIGEST-PROFILE-ENV) — resolved against\n...\n 173|    // The activity backbone: the [digest] extractor spanning the ledger's last K\n*174|    // sessions (with boundary dividers), else the log-less digest.log push sink.\n 175|    let backbone = if let Some(d) = &adapter_digest {\n 176|        let history = manifest.as_ref().and_then(|m| m.history.as_ref());\n 177|        let spanned = activity_spanned(\n...\n 412|/// The activity backbone for a log-less adapter: parse the accumulating\n*413|/// `digest.log` push sink, classifying each line — a context-injection record\n 414|/// (REQ-TERM-7) is skipped here (it is merged in separately by ts), everything\n 415|/// else is an activity record (diagnosed, no silent drop). One log across\n 416|/// sessions, so no per-session split / boundaries.\n 417|fn log_less_activity(id: &str, perch_path: &std::path::Path) -> Vec<TimelineItem> {\n*418|    let Ok(s) = std::fs::read_to_string(perch_path.join(\"digest.log\")) else {\n 419|        return Vec::new();\n 420|    };\n 421|    let mut items = Vec::new();\n...\n 429|            Ok(rec) => {\n*430|                // The append-only digest.log line index is itself the stable seq —\n 431|                // no session split, so no ordinal<<32 (REQ-DIGEST-CURSOR). The raw\n 432|                // file index never shifts as activity/context interleave.\n 433|                // [impl->REQ-DIGEST-CURSOR]\n...\n 459|\n*460|/// spt's context-injection entries from `digest.log` as timeline items\n 461|/// (REQ-TERM-7) — every line carrying the `context_kind` discriminator.\n 462|fn read_context_items(perch_path: &std::path::Path) -> Vec<TimelineItem> {\n*463|    let Ok(s) = std::fs::read_to_string(perch_path.join(\"digest.log\")) else {\n 464|        return Vec::new();\n 465|    };\n 466|    s.lines()\n...\n 593|\n*594|    // [unit->REQ-TERM-4] a log-less endpoint projects from its `digest.log` push\n 595|    // sink (the `api digest-entry` source) — input opens a turn, agent appends,\n 596|    // consecutive tools collapse.\n 597|    #[test]\n...\n 601|            std::fs::create_dir_all(&perch).unwrap();\n*602|            // No adapter recorded ⇒ the digest.log path.\n 603|            let rec =\n 604|                spt_store::info::InfoJson::new(\"solo\", \"0\", std::process::id(), \"sid\", \"live_agent\");\n 605|            spt_store::info::write_info(&perch, &rec).unwrap();\n...\n 778|        crate::test_home::with_home(|_| {\n*779|            let home = perch::spt_home();\n 780|            // Two per-session log files the extractor reads via {session_id}.\n 781|            std::fs::write(\n 782|                home.join(\"sess-A.jsonl\"),\n## dispatch.rs\n 472|\n*473|/// The SPT_HOME-anchored paths the serve arms need. One value, cloned per\n 474|/// worker (policies/stores re-load from the canonical paths per request —\n 475|/// the access-gate stance, config edits take effect without a restart).\n 476|#[derive(Debug, Clone)]\n...\n 486|impl DispatchPaths {\n*487|    /// The production layout under [`perch::spt_home`].\n 488|    pub fn production() -> DispatchPaths {\n*489|        let home = perch::spt_home();\n 490|        DispatchPaths {\n 491|            owlery: perch::owlery_dir(),\n 492|            releases: home.join(\"releases\"),\n## docshost.rs\n 2|//! static file server in the BROKER — docs are up whenever the daemon is —\n*3|//! serving `$SPT_HOME/docs` (the landed release bundle) on **loopback only**,\n 4|//! default `127.0.0.1:5474`.\n 5|//!\n 6|//! This is the canonical docs surface (supersedes the public Pages URL,\n## effect.rs\n 339|        let path = path.into();\n*340|        // Ensure the parent dir exists: the journal lives under `spt_home()`\n 341|        // (`default_journal_path`), which may not have been created yet on a fresh\n 342|        // machine — `OpenOptions::create` makes the file, never its directory, so a\n 343|        // missing parent surfaces as a NotFound at bind (the broker-bind CI failure).\n...\n 601|    fn jpath(dir: &tempfile::TempDir) -> PathBuf {\n*602|        dir.path().join(\"effects.log\")\n 603|    }\n 604|\n 605|    /// Build a key with a representative real minter — the pre-A-4a tests exercise\n...\n 618|    // creates the dir rather than failing at bind — `default_journal_path` lives\n*619|    // under `spt_home()`, absent on a fresh machine (the broker-bind CI failure:\n 620|    // `OpenOptions::create` makes the file, never its directory).\n 621|    #[test]\n 622|    fn open_creates_missing_parent_dirs() {\n...\n 625|        assert!(!nested.exists(), \"precondition: parent dir is absent\");\n*626|        let j = EffectJournal::open(nested.join(\"daemon-effects.log\")).unwrap();\n 627|        assert!(nested.exists(), \"open created the missing parent dir\");\n 628|        // The journal is usable straight away.\n 629|        assert_eq!(\n...\n 1034|        // 1. A hand-written OLD-shape file (pre-A-4a: no minter token).\n*1035|        let old_path = dir.path().join(\"old.log\");\n 1036|        std::fs::write(&old_path, \"PENDING 7 3 net-dial\\nDONE 7 3\\n\").unwrap();\n 1037|        let j_old = EffectJournal::open(&old_path).unwrap();\n 1038|        let legacy_key = EffectKey {\n...\n 1062|        // 2. A hand-written NEW-shape file parses to the tagged key.\n*1063|        let new_path = dir.path().join(\"new.log\");\n 1064|        std::fs::write(&new_path, \"PENDING 7 rc 3 net-dial\\nDONE 7 rc 3\\n\").unwrap();\n 1065|        let j_new = EffectJournal::open(&new_path).unwrap();\n 1066|        let rc_key = EffectKey {\n...\n 1077|        // 3. Old + new lines in ONE file both recover, as distinct keys.\n*1078|        let mixed_path = dir.path().join(\"mixed.log\");\n 1079|        std::fs::write(\n 1080|            &mixed_path,\n 1081|            \"PENDING 7 3 net-dial\\nDONE 7 3\\nPENDING 7 cli 3 net-dial\\nDONE 7 cli 3\\n\",\n## endpoint.rs\n 4|//! and the seed-control channel (B6) — under names derived from the active\n*5|//! `spt_home`. Deriving from `spt_home` keeps each isolated home (a test's\n*6|//! `SPT_HOME` override, a per-user install) on its own daemon, so parallel test\n 7|//! processes never collide on one machine while a real install gets one stable\n*8|//! per-home daemon. The auto-start spawn inherits `SPT_HOME`, so the spawned\n 9|//! daemon computes the **same** names as the client that started it — that\n 10|//! shared derivation is the whole of the rendezvous (no registry lookup).\n 11|// [impl->REQ-DAEMON-3]\n...\n 15|\n*16|use spt_store::perch::spt_home;\n 17|\n 18|/// A deterministic short tag for the active spt home. `DefaultHasher::new()` is\n 19|/// seeded with fixed keys (it is **not** randomized like `RandomState`), so the\n*20|/// tag is stable across processes that share the same `spt_home` — exactly what\n 21|/// the auto-start handshake needs (the spawned daemon must independently derive\n 22|/// the launching client's socket name).\n 23|fn home_tag() -> String {\n 24|    let mut h = std::collections::hash_map::DefaultHasher::new();\n*25|    spt_home().hash(&mut h);\n 26|    format!(\"{:016x}\", h.finish())\n 27|}\n 28|\n...\n 65|\n*66|/// The daemon's pid file: `<spt_home>/daemon.pid`. Best-effort breadcrumb the\n 67|/// running daemon writes on start — discoverable for management/cleanup. Not a\n 68|/// liveness signal (liveness is the seed-control ping); a stale pid here is\n 69|/// harmless because callers probe the socket, never this file.\n 70|pub fn daemon_pid_path() -> PathBuf {\n*71|    spt_home().join(\"daemon.pid\")\n 72|}\n 73|\n*74|/// The brain child's readiness breadcrumb: `<spt_home>/brain.ready` (the brain\n 75|/// child's pid, rewritten each heartbeat). The broker spawns the brain as a\n 76|/// supervised child process (ADR-0018 Q2/Q3 — the two-process restoration); the\n 77|/// child writes this once it has connected to the broker socket, and refreshes\n...\n 83|pub fn brain_ready_path() -> PathBuf {\n*84|    spt_home().join(\"brain.ready\")\n 85|}\n 86|\n 87|/// Where the peer pump records its last-tick heartbeat (epoch ms, M8\n...\n 91|pub fn pump_heartbeat_path() -> PathBuf {\n*92|    spt_home().join(\"identity\").join(\"pump-heartbeat.json\")\n 93|}\n 94|\n 95|/// Read the pump's last-tick heartbeat (epoch ms). `None` = never written\n## lib.rs\n 163|pub mod shellwake;\n*164|pub mod stderrlog;\n 165|pub mod sync;\n 166|pub mod translation;\n 167|pub mod transport;\n## lifecycle.rs\n 251|/// of a recorded endpoint cwd — the gap is NAMED (never silently guessed, never the\n*252|/// daemon cwd). Once per id per daemon run, so a cwd-less perch doesn't spam the log.\n 253|fn warn_no_cwd_once(id: &str, raw: &Path) {\n 254|    warn_once(\n 255|        format!(\"ingest:{id}\"),\n## linkhost.rs\n 730|        };\n*731|        let src = perch::spt_home().join(\"srcs\").join(name);\n 732|        std::fs::create_dir_all(&src).unwrap();\n 733|        std::fs::write(\n 734|            src.join(\"manifest.toml\"),\n...\n 883|        let p = if persistent { \"persistent = true\\n\" } else { \"\" };\n*884|        let src = perch::spt_home().join(\"srcs\").join(name);\n 885|        std::fs::create_dir_all(&src).unwrap();\n 886|        std::fs::write(\n 887|            src.join(\"manifest.toml\"),\n...\n 1074|            // Register a shell whose `note` op is gated remembered.\n*1075|            let src = perch::spt_home().join(\"srcs\").join(\"Gated\");\n 1076|            std::fs::create_dir_all(&src).unwrap();\n 1077|            #[cfg(windows)]\n 1078|            let spawn = \"cmd /C exit 0\";\n## livehost.rs\n 1139|        );\n*1140|        let src = perch::spt_home().join(\"srcs\").join(name);\n 1141|        std::fs::create_dir_all(&src).unwrap();\n 1142|        std::fs::write(src.join(\"manifest.toml\"), toml).unwrap();\n 1143|        spt_runtime::registry::register(&perch::adapters_dir(), &src, 1000).unwrap();\n...\n 1459|        with_home(|_| {\n*1460|            let drops = perch::spt_home().join(\"drops\");\n 1461|            std::fs::create_dir_all(&drops).unwrap();\n 1462|            register_live_adapter(\"mock\", &drops);\n 1463|\n...\n 1736|        with_home(|_| {\n*1737|            let drops = perch::spt_home().join(\"drops\");\n 1738|            std::fs::create_dir_all(&drops).unwrap();\n 1739|            register_live_adapter(\"mock\", &drops);\n 1740|            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n...\n 1772|        with_home(|_| {\n*1773|            let drops = perch::spt_home().join(\"drops\");\n 1774|            std::fs::create_dir_all(&drops).unwrap();\n 1775|            register_live_adapter(\"mock\", &drops);\n 1776|            seed_live_perch(\"doyle\", \"mock\", spt_store::liveness::STATUS_OFFLINE);\n...\n 1795|        with_home(|_| {\n*1796|            let drops = perch::spt_home().join(\"drops\");\n 1797|            std::fs::create_dir_all(&drops).unwrap();\n 1798|            register_live_adapter(\"mock\", &drops);\n 1799|            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n...\n 1826|        with_home(|_| {\n*1827|            let drops = perch::spt_home().join(\"drops\");\n 1828|            std::fs::create_dir_all(&drops).unwrap();\n 1829|            register_live_adapter(\"mock\", &drops);\n 1830|            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n...\n 1873|        with_home(|_| {\n*1874|            let drops = perch::spt_home().join(\"drops\");\n 1875|            std::fs::create_dir_all(&drops).unwrap();\n 1876|            register_live_adapter(\"mock\", &drops);\n 1877|            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n...\n 1917|        with_home(|_| {\n*1918|            let drops = perch::spt_home().join(\"drops\");\n 1919|            std::fs::create_dir_all(&drops).unwrap();\n 1920|            register_live_adapter(\"mock\", &drops);\n 1921|            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n...\n 2245|        with_home(|_| {\n*2246|            let drops = perch::spt_home().join(\"drops\");\n 2247|            std::fs::create_dir_all(&drops).unwrap();\n 2248|            register_live_adapter(\"mock\", &drops);\n 2249|            seed_woken_perch(\"cold\", \"mock\", Some(\"mock\"), \"sid-r\");\n## nethost.rs\n 1830|        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*1831|        if entry.log.lock().unwrap().lease.is_canceled() {\n 1832|            return Err(io::Error::other(format!(\n 1833|                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n 1834|            )));\n...\n 1858|            .get(&stream_id)\n*1859|            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n 1860|    }\n 1861|\n 1862|    /// Every held stream's info — the query a re-attaching brain uses to find\n...\n 1890|            .map(|(id, e)| {\n*1891|                let log = e.log.lock().unwrap();\n 1892|                NetStreamInfo {\n 1893|                    stream_id: *id,\n 1894|                    conn_id: e.conn_id,\n...\n 1916|            .values()\n*1917|            .filter(|e| e.log.lock().unwrap().subscriber.is_some())\n 1918|            .count() as u64;\n 1919|        (rows, seats)\n 1920|    }\n...\n 1956|            let seat = {\n*1957|                let mut log = entry.log.lock().unwrap();\n 1958|                log.ring.clear();\n 1959|                log.subscriber.take()\n 1960|            };\n...\n 1991|        // protect (contrast the unsubscribe verb's take_seat_if).\n*1992|        let seat = entry.log.lock().unwrap().subscriber.take();\n 1993|        if let Some(seat) = seat {\n 1994|            seat.dismiss();\n 1995|        }\n...\n 2010|        }\n*2011|        let line = entry.log.lock().unwrap().opener_line();\n 2012|        Some(line)\n 2013|    }\n 2014|\n...\n 2022|        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n*2023|            e.log.lock().unwrap().set_retentive(cap);\n 2024|        }\n 2025|    }\n 2026|\n...\n 2034|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*2035|        let drained = entry.log.lock().unwrap().drain();\n 2036|        // The drain freed ring room — wake a pump that was backpressure-parked.\n 2037|        entry.room.notify_one();\n 2038|        Some(drained)\n...\n 2049|            .get(&stream_id)\n*2050|            .map(|e| e.log.lock().unwrap().ring.len())\n 2051|    }\n 2052|\n 2053|    /// Inbound (peer-initiated) stream rows currently held on `conn_id` — the\n...\n 2104|            })?;\n*2105|            Arc::clone(&e.log)\n 2106|        };\n 2107|        // Install the seat WITH its replay snapshot in one atomic critical\n 2108|        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\n...\n 2130|            let streams = self.shared.streams.lock().unwrap();\n*2131|            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n 2132|        };\n 2133|        let Some(log) = log else {\n 2134|            return false;\n...\n 2151|            let streams = self.shared.streams.lock().unwrap();\n*2152|            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n 2153|        };\n 2154|        if let Some(log) = log {\n 2155|            log.lock().unwrap().detach_if(sub);\n## notif.rs\n 1100|    fn register_adapter(name: &str, manifest: &str) {\n*1101|        let src = perch::spt_home().join(\"srcs\").join(name);\n 1102|        std::fs::create_dir_all(&src).unwrap();\n 1103|        std::fs::write(src.join(\"manifest.toml\"), manifest).unwrap();\n 1104|        spt_runtime::registry::register(&perch::adapters_dir(), &src, 1).unwrap();\n## pairhost.rs\n 571|/// The deep per-probe SUCCESS-path trace (\"what took so long\" on a slow-but-ok\n*572|/// join) is DEFERRED: there is no daemon tracing facility (SPT_LOG) to hang it on\n 573|/// yet, and a per-probe frame protocol isn't worth it for v1 (doyle 2026-06-28).\n 574|// [impl->REQ-JOIN-DIAGNOSTICS] [impl->REQ-JOIN-VERBOSE-CLOCK]\n 575|pub fn meet_failure_detail(\n## projwriter.rs\n 4|//! The daemon (brain) is the SOLE, SINGLE-FLIGHT writer of\n*5|//! `$SPT_HOME/index/project-index.json` (format + read path owned by\n 6|//! `spt_store::projindex`, W1). One brain-hosted thread:\n 7|//!\n 8|//! - loads the persisted index at start and is READY WITHOUT WARM — the boot\n...\n 78|\n*79|/// The observability sidecar (`$SPT_HOME/index/project-index-stats.json`) —\n 80|/// written atomically by the writer after every cycle; read by\n 81|/// `spt daemon status` and by the int gates. Additive serde-default shape\n 82|/// (derived + regenerable, like the index itself).\n...\n 157|impl WriterPaths {\n*158|    /// The production layout under the live `$SPT_HOME`.\n 159|    pub fn production() -> WriterPaths {\n 160|        WriterPaths {\n 161|            owlery: perch::owlery_dir(),\n...\n 695|\n*696|    /// A self-contained home-shaped fixture tree (NO env, NO real $SPT_HOME):\n 697|    /// owlery + tracked context store + index paths, all under one TempDir.\n 698|    struct Fixture {\n 699|        _tmp: TempDir,\n...\n 1056|    // branch-enumeration census proves the burst did not fan out into N\n*1057|    // cycles). Uses the real spawn loop over an isolated $SPT_HOME.\n 1058|    // [unit->REQ-PROJECT-INDEX-WRITER]\n 1059|    #[test]\n 1060|    fn writer_thread_debounces_burst_into_one_cycle() {\n...\n 1120|    // is contract) — proven against an oracle that reconstructs the retired\n*1121|    // picker wiring verbatim: sessions.log (reversed) ∪ info.cwd origin ∪\n 1122|    // p-* branches by recency, derived through the REAL git\n 1123|    // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo\n 1124|    // WITH a remote (slug ≠ folder name — the display-parity hard case), a\n\n## pump/\n### mod.rs\n 219|/// Where this node's pump-side stores live. Production = the canonical\n*220|/// SPT_HOME layout; the loopback E2E gives its in-process \"node\" distinct\n 221|/// roots so two nodes can share one test process.\n 222|pub struct PumpPaths {\n 223|    /// The perch tree (registry advertisement scan).\n...\n 269|impl PumpPaths {\n*270|    /// The canonical SPT_HOME layout.\n 271|    pub fn production() -> PumpPaths {\n*272|        let home = perch::spt_home();\n 273|        let identity = perch::identity_dir();\n 274|        PumpPaths {\n 275|            owlery: perch::owlery_dir(),\n...\n 1205|/// Supervise repeated runs of a pump body until `stop` is raised (M8\n*1206|/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n 1207|/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n 1208|/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n 1209|/// self-heals visibly instead of silently halving the daemon for 24 h.\n...\n 1389|        fn pre_round(&mut self, _ctx: &RoundCtx) {\n*1390|            self.log.borrow_mut().push(format!(\"pre:{}\", self.tag));\n 1391|        }\n 1392|        fn peer_step(\n 1393|            &mut self,\n...\n 2020|        let name = format!(\"spt-pump-pushfeed-{}.sock\", std::process::id());\n*2021|        let broker = Broker::bind_in_with_net(&name, dir.path().join(\"effects.log\"), Some(host))\n 2022|            .expect(\"bind broker\");\n 2023|        let serve = std::sync::Arc::clone(&broker);\n 2024|        std::thread::spawn(move || {\n\nShowing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-runtime/src, crates/spt/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":152,"fileCount":20,"files":["crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/deadline.rs","crates/spt-daemon/src/deelevate.rs","crates/spt-daemon/src/digest.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/docshost.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/endpoint.rs","crates/spt-daemon/src/lib.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/linkhost.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/src/pairhost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brainproc.rs","count":12},{"path":"crates/spt-daemon/src/broker.rs","count":19},{"path":"crates/spt-daemon/src/config.rs","count":6},{"path":"crates/spt-daemon/src/daemon.rs","count":16},{"path":"crates/spt-daemon/src/deadline.rs","count":4},{"path":"crates/spt-daemon/src/deelevate.rs","count":20},{"path":"crates/spt-daemon/src/digest.rs","count":12},{"path":"crates/spt-daemon/src/dispatch.rs","count":3},{"path":"crates/spt-daemon/src/docshost.rs","count":1},{"path":"crates/spt-daemon/src/effect.rs","count":7},{"path":"crates/spt-daemon/src/endpoint.rs","count":11},{"path":"crates/spt-daemon/src/lib.rs","count":1},{"path":"crates/spt-daemon/src/lifecycle.rs","count":1},{"path":"crates/spt-daemon/src/linkhost.rs","count":3},{"path":"crates/spt-daemon/src/livehost.rs","count":9},{"path":"crates/spt-daemon/src/nethost.rs","count":13},{"path":"crates/spt-daemon/src/notif.rs","count":1},{"path":"crates/spt-daemon/src/pairhost.rs","count":1},{"path":"crates/spt-daemon/src/projwriter.rs","count":6},{"path":"crates/spt-daemon/src/pump/mod.rs","count":6}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## brainproc.rs\n    9│//! `spt daemon brain` child. The child connects over the existing broker socket\n  *10│//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2\n   11│//! migrates the broker-resident loops here one per commit; **D2-1 moved the net\n   12│//! consumers** (inbound dispatcher + outbound peer pump — pure IPC clients, no\n   13│//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`\n     │...\n  138│/// The `spt daemon brain` child entry. Connect to the broker over the existing\n *139│/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\n  140│/// holding the connection and probing broker liveness each heartbeat. A dropped\n  141│/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\n  142│/// returns `Err`, exiting the process so the broker-side supervisor respawns it\n     │...\n  159│pub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\n *160│    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\n  161│    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\n  162│    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\n  163│    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\n  164│    // [impl->REQ-DAEMON-STDERR-PERSIST]\n *165│    let _ = crate::stderrlog::install(\"brain\", generation);\n  166│    let name = broker_socket_name();\n  167│    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\n  168│    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\n     │...\n  225│    // instance's `wake_command` as a supervised watcher child. Relocated from\n *226│    // the broker process to the brain child: shellwake is brain-owned logic\n  227│    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\n  228│    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\n  229│    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\n     │...\n  457│/// deterministically with a scripted ready/no-ready + a capturing notif sink,\n *458│/// while production binds the real `spt_home` + relcache + notif sender\n  459│/// ([`ProductionTrialEnv`]). Every method is **best-effort / fail-safe**: a\n  460│/// missing record reads as \"no pending trial\", an absent ready file as\n  461│/// \"not ready\" — the broker's supervisor thread never panics (a panic there\n     │...\n  532│\n *533│/// Production [`TrialEnv`]: reads/writes the canonical `spt_home` durable files\n  534│/// (the `releases` relcache + the `brain.ready` breadcrumb) and fires the\n  535│/// rollback notif through the real producer front door. Constructed in the\n *536│/// broker process where `spt_home()` is stable.\n  537│///\n  538│/// Holds the live [`crate::broker::Broker`] handle (or `None` on a net-less /\n  539│/// bind-failed daemon) so the DRAINED gate ([`TrialEnv::old_gen_drained`]) reads\n     │...\n  548│    fn cache(&self) -> ReleaseCache {\n *549│        ReleaseCache::open(&spt_store::perch::spt_home().join(\"releases\"))\n  550│    }\n  551│}\n  552│\n     │...\n 1016│/// (non-detached) managed child, so it inherits the broker's environment —\n*1017│/// including `SPT_HOME` — and dies with no orphaning. NOT `spawn_detached`\n*1018│/// (that path rebuilds the Windows env block and would drop `SPT_HOME`). The\n 1019│/// broker stamps `{generation, start-reason}` onto the argv (ADR-0018 V2).\n 1020│///\n 1021│/// `binary` is the **record-driven selection** (D6-2): `None` spawns the\n     │...\n 1063│    // spawns the daemon); CREATE_NO_WINDOW suppresses it without detaching, so\n*1064│    // the plain-child SPT_HOME inheritance (above) is preserved.\n 1065│    #[cfg(windows)]\n 1066│    {\n 1067│        use std::os::windows::process::CommandExt;\n## broker.rs\n 2651│/// A REAL fault WITH the perch stamp: mark the session degraded, surface the fault\n*2652│/// on the perch record (not only the F-019 unread daemon-stderr channel), log it,\n 2653│/// and reap the child. Unlike ADR-0022's original design this is NOT permanent\n 2654│/// death — the dispatch path bounded-respawns a faulted binary\n 2655│/// (REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH).\n     │...\n 2814│    /// Bind the broker's listening endpoint at the namespaced `name`, with the\n*2815│    /// effect journal at the default path (`<spt_home>/daemon-effects.log`).\n 2816│    pub fn bind(name: &str) -> io::Result<Arc<Self>> {\n 2817│        Self::bind_in(name, default_journal_path())\n 2818│    }\n     │...\n 2974│            match sessions.get(&id) {\n*2975│                Some(h) => Arc::clone(&h.log),\n 2976│                None => return false,\n 2977│            }\n 2978│        };\n     │...\n 3028│    /// [`Self::test_seed_wedged_local_controller`] (`recover(&self.sessions)` →\n*3029│    /// `get(&id)` → `Arc::clone(&h.log)` → `recover_log`).\n 3030│    /// `#[doc(hidden)]` — test support, not a product surface.\n 3031│    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n 3032│    #[doc(hidden)]\n     │...\n 3036│            match sessions.get(&id) {\n*3037│                Some(h) => Arc::clone(&h.log),\n 3038│                None => return None,\n 3039│            }\n 3040│        };\n     │...\n 3113│        sessions.values().any(|h| {\n*3114│            match h.log.lock() {\n 3115│                Ok(log) => log.local_controller_wedged(now, deadline),\n 3116│                // A poisoned log lock cannot be honestly read — treat as NOT wedged\n 3117│                // (fail toward promotion, never a permanent gate that strands apply).\n     │...\n 3145│            .get(&id)\n*3146│            .map(|h| recover_log(&h.log).next_seq)\n 3147│    }\n 3148│\n 3149│    /// Drive one brain connection: handshake, then dispatch its command frames\n     │...\n 3338│                                    h.endpoint.clone(),\n*3339│                                    Arc::clone(&h.log),\n 3340│                                    h.session.process_id(),\n 3341│                                    h.adapter.clone(),\n 3342│                                    h.spawned_at.elapsed().as_millis() as u64,\n     │...\n 3473│                .iter()\n*3474│                .filter_map(|id| sessions.get(id).map(|h| Arc::clone(&h.log)))\n 3475│                .collect()\n 3476│        };\n 3477│        for log in &logs {\n     │...\n 3639│                                    if let Some(h) = removed {\n*3640│                                        recover_log(&h.log).stamp_reaped();\n 3641│                                        eprintln!(\n 3642│                                            \"SPAWN_ZOMBIE_FORCE_DETABLE:{}: exit-waiter never \\\n 3643│                                             reaped dead session {sid} — de-tabled directly\",\n     │...\n 3721│            id,\n*3722│            self.log_cap_chunks,\n 3723│            req.endpoint.clone(),\n 3724│            (req.rows, req.cols),\n 3725│        )));\n     │...\n 3873│                .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*3874│            Arc::clone(&h.log)\n 3875│        };\n 3876│        let outcome = recover_log(&log).resolve_subscribe(\n 3877│            Arc::clone(send),\n     │...\n 3898│            match sessions.get(&req.session_id) {\n*3899│                Some(h) => Arc::clone(&h.log),\n 3900│                None => {\n 3901│                    eprintln!(\"DBG unsubscribe: no session {}\", req.session_id);\n 3902│                    return Ok(());\n     │...\n 4029│                Arc::clone(&h.translation_respawns),\n*4030│                Arc::clone(&h.log),\n 4031│            )\n 4032│        };\n 4033│        // Bounded give-up: stop respawning once the budget is spent. The binary then\n     │...\n 4207│                .ok_or_else(|| format!(\"no such session {}\", req.session_id))?;\n*4208│            (Arc::clone(&h.session), Arc::clone(&h.log))\n 4209│        };\n 4210│        if !recover_log(&log).is_controller(send) {\n 4211│            return Err(\n     │...\n 4940│                map.get(id)\n*4941│                    .map(|s| (Arc::clone(&s.input), Arc::clone(&s.log)))\n 4942│            };\n 4943│            let Some((input, log)) = snapshot else {\n 4944│                continue; // session exited mid-apply — nothing to restart\n     │...\n 4975│\n*4976│/// The default broker-owned effect-journal path: `<spt_home>/daemon-effects.log`.\n 4977│pub(crate) fn default_journal_path() -> std::path::PathBuf {\n*4978│    spt_store::perch::spt_home().join(\"daemon-effects.log\")\n 4979│}\n 4980│\n 4981│/// Write a frame to the brain, ignoring failures (brain gone / conn poisoned).\n     │...\n 5979│        let dir = tempfile::tempdir().unwrap();\n*5980│        let journal = EffectJournal::open(dir.path().join(\"effects.log\")).unwrap();\n 5981│        let (w, rx) = test_input_writer(16);\n 5982│        let key = EffectKey {\n 5983│            class: 1,\n## config.rs\n   7│//! period is **durable and configurable**, sourced from a small JSON file under\n  *8│//! the spt home (`<spt_home>/daemon.json`) and falling back to the default when\n   9│//! absent. Kept deliberately tiny — one struct, JSON via the crate's existing\n  10│//! `serde_json` dep (no new TOML edge) — so the brain's loop reads its cadence\n  11│//! from config, never a constant.\n    │...\n  86│\n *87│/// The on-disk shape (`<spt_home>/daemon.json`). Every field is optional so a\n  88│/// partial file still loads (forward/back-compat) — a missing field takes the\n  89│/// default. Stored as plain integers (ms) to keep the file human-editable.\n  90│#[derive(Debug, Clone, Default, Serialize, Deserialize)]\n    │...\n 226│impl DaemonConfig {\n*227│    /// The canonical config path: `<spt_home>/daemon.json`.\n 228│    pub fn default_path() -> PathBuf {\n*229│        spt_store::perch::spt_home().join(\"daemon.json\")\n 230│    }\n 231│\n 232│    /// Load the daemon config from the canonical path, falling back to the\n    │...\n 588│    // [unit->REQ-ENDPOINT-AUTOSTART] upsert semantics on the CANONICAL path\n*589│    // (`<spt_home>/daemon.json`): a new id APPENDS (returns false), the same id\n 590│    // REPLACES in place (returns true, latest run wins), and the surrounding\n 591│    // knobs the daemon owns survive the load→mutate→save round-trip untouched.\n*592│    // Serialized against every other SPT_HOME test in this binary via `with_home`.\n 593│    #[test]\n 594│    fn upsert_startup_endpoint_appends_then_replaces_preserving_other_knobs() {\n 595│        crate::test_home::with_home(|_home| {\n## daemon.rs\n  233│                        );\n *234│                        let docs_root = spt_store::perch::spt_home().join(\"docs\");\n  235│                        match crate::docshost::start(docs_root, port) {\n  236│                            Ok(bound) => eprintln!(\n  237│                                \"DOCS_SERVER_UP: {}\",\n     │...\n  305│        // online/offline exclusivity — now run in the BRAIN child (restoration\n *306│        // D2-2): shellwake is brain-owned logic (ADR-0018 Q5 exception), a pure\n  307│        // disk-reconciler whose boot sweep re-reconciles the watcher children on\n  308│        // every brain start. The broker no longer hosts it; see\n  309│        // [`crate::brainproc::run_brain`].\n     │...\n  609│/// Spawn `spt daemon` as a detached background process. Inherits the environment\n *610│/// — so the child resolves the **same** `SPT_HOME`, hence the same canonical\n  611│/// socket names — but drops the std handles so it outlives the launching CLI\n  612│/// call. The child is independent (not killed when the parent exits): on unix it\n  613│/// is reparented to init when the launcher exits; on Windows a child is not in\n     │...\n 1016│/// undrained PIPE\": a pipe nobody drains is the whole hazard — its write BLOCKS the\n*1017│/// daemon once full. Every OTHER sink is safe and MUST survive: a FILE (`2>run.log`,\n*1018│/// AND every int test's `Stdio::from(file)` brain-log capture) is a disk handle that\n 1019│/// never blocks; a CONSOLE scrolls; a NULL/absent handle (the DETACHED_PROCESS rungs)\n 1020│/// already discards. So we DELIBERATELY do NOT gate on \"no console\" (`GetConsoleWindow`):\n 1021│/// a CREATE_NO_WINDOW daemon has no console window yet a perfectly-drained FILE stderr\n*1022│/// — nulling it would blank the capture (the test-harness brain-log assertions) for\n 1023│/// ZERO safety gain, since a file never blocks. `stderr_file_type` is the raw\n 1024│/// `GetFileType(stderr)`. Pure so both CI legs unit-test it. // [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\n 1025│pub fn should_null_std_handles(stderr_file_type: u32) -> bool {\n     │...\n 1039│/// pipe-tee ergonomics. The SANCTIONED foreground-capture form is a FILE redirect\n*1040│/// (`spt daemon run 2>run.log`): a disk handle is not a pipe, so it survives (this is\n*1041│/// exactly why the int-test brain-log capture is safe). Called unconditionally at\n 1042│/// `daemon run` startup. // [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\n 1043│#[cfg(windows)]\n 1044│pub fn null_std_handles_if_detached_in_fact() {\n     │...\n 1070│/// the user-profile environment block, so transient shell vars (most importantly\n*1071│/// `SPT_HOME`, which selects the daemon's entire universe of sockets/perches)\n*1072│/// are LOST. Verified empirically (a WMI child saw `%SPT_HOME%` unexpanded).\n 1073│/// We therefore forward every `SPT_*` var explicitly via `cmd /c set …`, then\n 1074│/// `start \"\" /b` so the launching `cmd` returns immediately and the daemon\n 1075│/// continues — job-neutral, since `cmd` is the creator's child (outside any\n     │...\n 1271│    // [unit->REQ-HAZARD-DETACHED-DAEMON-STDIO] the detached-in-fact decision is EXACTLY\n*1272│    // \"is stderr a PIPE\" — the only sink that blocks when it fills. A FILE (2>run.log,\n*1273│    // and every int test's Stdio::from(file) brain-log capture), a CONSOLE, and a\n 1274│    // NULL/absent handle (DETACHED_PROCESS rungs) all SURVIVE — nulling them is\n 1275│    // wrong (blanks a drained capture) and pointless (they never block). RED-FIRST:\n 1276│    // returning `true` unconditionally makes the non-pipe cases go red — which is\n*1277│    // exactly the mass int-test brain-log-blanking regression the file-type gate avoids.\n 1278│    #[test]\n 1279│    fn null_std_handles_only_on_a_pipe_stderr() {\n 1280│        const FILE_TYPE_UNKNOWN: u32 = 0x0000;\n     │...\n 1285│            !should_null_std_handles(FILE_TYPE_DISK),\n*1286│            \"a FILE redirect (2>run.log / the int-test brain-log) is disk ⇒ survives\"\n 1287│        );\n 1288│        assert!(\n 1289│            !should_null_std_handles(FILE_TYPE_CHAR),\n     │...\n 1565│            .env(\"SPT_BREAKAWAY_PIDFILE\", &pidfile)\n*1566│            .env(\"SPT_BREAKAWAY_DIAG\", std::env::temp_dir().join(format!(\"spt_breakaway_diag_{}.log\", std::process::id())))\n 1567│            // CREATE_BREAKAWAY_FROM_JOB: escape the test-runner's OWN ancestor job\n 1568│            // (cargo/CI run the test harness inside a job), so MY job below becomes\n 1569│            // the launcher's ONLY job — otherwise the grandchild's breakaway lands\n     │...\n 1640│        let _ = std::fs::remove_file(&pidfile);\n*1641│        let diagpath = std::env::temp_dir().join(format!(\"spt_breakaway_diag_{}.log\", std::process::id()));\n 1642│        let diag = std::fs::read_to_string(&diagpath).unwrap_or_default();\n 1643│        let _ = std::fs::remove_file(&diagpath);\n 1644│\n## deadline.rs\n  41│\n *42│/// The canonical anchor path for a loop key: `<spt_home>/deadline-<key>.json`.\n  43│///\n  44│/// Keyed, not a singleton (ADR-0018 D5 amendment 6): a singleton would\n  45│/// cross-clobber the moment the live-agent adapter's **per-agent** pulse drivers\n    │...\n  49│pub fn anchor_path(key: &str) -> PathBuf {\n *50│    spt_store::perch::spt_home().join(format!(\"deadline-{key}.json\"))\n  51│}\n  52│\n *53│/// On-disk shape of a periodic deadline anchor (`<spt_home>/deadline-<key>.json`).\n  54│/// `interval_ms > 0` is an invariant the constructor enforces, so the pure derive\n  55│/// never divides by zero.\n  56│// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    │...\n 298│\n*299│    // ---- rehydration rule + persistence (need an isolated SPT_HOME) ---------\n 300│\n 301│    #[test] // [unit->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n 302│    fn cold_and_crash_write_fresh_anchor_at_now() {\n## deelevate.rs\n  73│///\n *74│/// This is the seam that keeps an explicit `SPT_HOME` (the universe\n *75│/// relocation knob — `spt_store::perch::spt_home`) alive across the Windows\n  76│/// de-elevation respawn. `CreateEnvironmentBlock` rebuilds the desktop\n  77│/// user's variables from scratch (to fix `%LOCALAPPDATA%` when UAC elevated\n  78│/// through a different admin account), which would otherwise DROP the\n *79│/// invoker's `SPT_HOME` — landing the de-elevated daemon in the default home\n  80│/// and binding a different seed-control socket, so a later `spt daemon stop`\n *81│/// (still carrying `SPT_HOME`) sees no daemon and prints `DAEMON_NOT_RUNNING`\n  82│/// while the orphaned daemon serves the wrong home.\n  83│// [impl->REQ-HAZARD-ELEVATED-DAEMON-SPAWN]\n  84│pub fn apply_env_overrides(block: &[u16], overrides: &[(String, String)]) -> Vec<u16> {\n    │...\n 132│        /// The invoker's home dir (passwd lookup), for `HOME` — the state\n*133│        /// universe anchor (`spt_home` resolves through `$HOME`).\n 134│        pub home: Option<PathBuf>,\n 135│    }\n 136│\n    │...\n 695│    /// The invoker's explicit universe overrides that must survive the\n*696│    /// de-elevation respawn. `SPT_HOME` is the relocation knob\n*697│    /// (`spt_store::perch::spt_home`): when set, it selects the daemon's home\n 698│    /// (and therefore its seed-control socket) over `%LOCALAPPDATA%`, so it\n 699│    /// must ride through the rebuilt desktop-user environment block. Empty in\n 700│    /// the common case (no override) — the block then passes through untouched.\n 701│    fn deelevation_env_overrides() -> Vec<(String, String)> {\n*702│        match std::env::var(\"SPT_HOME\") {\n*703│            Ok(v) if !v.is_empty() => vec![(\"SPT_HOME\".to_string(), v)],\n 704│            _ => Vec::new(),\n 705│        }\n 706│    }\n    │...\n 745│        let env_built = unsafe { CreateEnvironmentBlock(&mut env, token, 0) != 0 };\n*746│        // Overlay the invoker's explicit universe overrides (SPT_HOME) onto the\n 747│        // rebuilt desktop-user block so the respawn lands in the home the caller\n 748│        // chose — see `apply_env_overrides`. When the block build failed we pass\n*749│        // null (inherit ours), which already carries SPT_HOME.\n 750│        let overrides = deelevation_env_overrides();\n 751│        let mut overlaid: Vec<u16> = Vec::new();\n 752│        let env_ptr = if env_built && !overrides.is_empty() {\n    │...\n 854│    // [unit->REQ-HAZARD-ELEVATED-DAEMON-SPAWN] the de-elevation env overlay:\n*855│    // an explicit SPT_HOME REPLACES the rebuilt desktop-user value (so the\n 856│    // respawned daemon binds the invoker's home's seed-control socket, not the\n 857│    // default home's — the DAEMON_NOT_RUNNING acceptance bug), matches the env\n 858│    // name case-insensitively, appends when absent, and leaves the block intact\n    │...\n 860│    #[test]\n*861│    fn env_overlay_keeps_explicit_spt_home_alive() {\n*862│        // Replace: desktop block already has SPT_HOME (the default home).\n*863│        let b = block(&[\"PATH=C:\\\\win\", \"spt_home=C:\\\\default\"]);\n 864│        let out = apply_env_overrides(\n 865│            &b,\n*866│            &[(\"SPT_HOME\".to_string(), \"C:\\\\accept\".to_string())],\n 867│        );\n 868│        let got = parse(&out);\n 869│        assert!(got.contains(&\"PATH=C:\\\\win\".to_string()));\n*870│        assert!(got.contains(&\"SPT_HOME=C:\\\\accept\".to_string()));\n*871│        // exactly one SPT_HOME entry (the old, case-variant one is gone).\n 872│        assert_eq!(\n 873│            got.iter()\n*874│                .filter(|e| e.to_ascii_uppercase().starts_with(\"SPT_HOME=\"))\n 875│                .count(),\n 876│            1\n 877│        );\n    │...\n 880│\n*881│        // Append: block has no SPT_HOME.\n 882│        let b = block(&[\"PATH=C:\\\\win\"]);\n 883│        let out = apply_env_overrides(\n 884│            &b,\n## digest.rs\n  21│//! - A **log-less** adapter pushes digest-records directly via `api digest-entry`\n *22│//!   into the perch's `digest.log` → the projection reads that.\n  23│//!\n  24│//! The records carry the published digest-record contract\n  25│//! ([`spt_term::DigestRecord`]); the projection folds them into the structured\n    │...\n 124│/// two-origin timeline — the adapter's **activity** (the `[digest]` extractor\n*125│/// spanning the last K sessions, REQ-TERM-6; else the log-less `digest.log` push\n 126│/// records) merged by `ts` with spt's own **context-injection** entries\n 127│/// (REQ-TERM-7) — and folds it through [`spt_term::project_timeline`] with the\n 128│/// effective presentation config ([`resolve_config`]: adapter `[digest]` defaults,\n    │...\n 158│\n*159│    // spt-owned context-injection entries (REQ-TERM-7) always live in digest.log.\n 160│    let context = read_context_items(&perch_path);\n 161│\n 162│    // The read-vars captured at bind (REQ-DIGEST-PROFILE-ENV) — resolved against\n    │...\n 173│    // The activity backbone: the [digest] extractor spanning the ledger's last K\n*174│    // sessions (with boundary dividers), else the log-less digest.log push sink.\n 175│    let backbone = if let Some(d) = &adapter_digest {\n 176│        let history = manifest.as_ref().and_then(|m| m.history.as_ref());\n 177│        let spanned = activity_spanned(\n    │...\n 412│/// The activity backbone for a log-less adapter: parse the accumulating\n*413│/// `digest.log` push sink, classifying each line — a context-injection record\n 414│/// (REQ-TERM-7) is skipped here (it is merged in separately by ts), everything\n 415│/// else is an activity record (diagnosed, no silent drop). One log across\n 416│/// sessions, so no per-session split / boundaries.\n 417│fn log_less_activity(id: &str, perch_path: &std::path::Path) -> Vec<TimelineItem> {\n*418│    let Ok(s) = std::fs::read_to_string(perch_path.join(\"digest.log\")) else {\n 419│        return Vec::new();\n 420│    };\n 421│    let mut items = Vec::new();\n    │...\n 429│            Ok(rec) => {\n*430│                // The append-only digest.log line index is itself the stable seq —\n 431│                // no session split, so no ordinal<<32 (REQ-DIGEST-CURSOR). The raw\n 432│                // file index never shifts as activity/context interleave.\n 433│                // [impl->REQ-DIGEST-CURSOR]\n    │...\n 459│\n*460│/// spt's context-injection entries from `digest.log` as timeline items\n 461│/// (REQ-TERM-7) — every line carrying the `context_kind` discriminator.\n 462│fn read_context_items(perch_path: &std::path::Path) -> Vec<TimelineItem> {\n*463│    let Ok(s) = std::fs::read_to_string(perch_path.join(\"digest.log\")) else {\n 464│        return Vec::new();\n 465│    };\n 466│    s.lines()\n    │...\n 593│\n*594│    // [unit->REQ-TERM-4] a log-less endpoint projects from its `digest.log` push\n 595│    // sink (the `api digest-entry` source) — input opens a turn, agent appends,\n 596│    // consecutive tools collapse.\n 597│    #[test]\n    │...\n 601│            std::fs::create_dir_all(&perch).unwrap();\n*602│            // No adapter recorded ⇒ the digest.log path.\n 603│            let rec =\n 604│                spt_store::info::InfoJson::new(\"solo\", \"0\", std::process::id(), \"sid\", \"live_agent\");\n 605│            spt_store::info::write_info(&perch, &rec).unwrap();\n    │...\n 778│        crate::test_home::with_home(|_| {\n*779│            let home = perch::spt_home();\n 780│            // Two per-session log files the extractor reads via {session_id}.\n 781│            std::fs::write(\n 782│                home.join(\"sess-A.jsonl\"),\n## dispatch.rs\n 472│\n*473│/// The SPT_HOME-anchored paths the serve arms need. One value, cloned per\n 474│/// worker (policies/stores re-load from the canonical paths per request —\n 475│/// the access-gate stance, config edits take effect without a restart).\n 476│#[derive(Debug, Clone)]\n    │...\n 486│impl DispatchPaths {\n*487│    /// The production layout under [`perch::spt_home`].\n 488│    pub fn production() -> DispatchPaths {\n*489│        let home = perch::spt_home();\n 490│        DispatchPaths {\n 491│            owlery: perch::owlery_dir(),\n 492│            releases: home.join(\"releases\"),\n## docshost.rs\n 2│//! static file server in the BROKER — docs are up whenever the daemon is —\n*3│//! serving `$SPT_HOME/docs` (the landed release bundle) on **loopback only**,\n 4│//! default `127.0.0.1:5474`.\n 5│//!\n 6│//! This is the canonical docs surface (supersedes the public Pages URL,\n## effect.rs\n  339│        let path = path.into();\n *340│        // Ensure the parent dir exists: the journal lives under `spt_home()`\n  341│        // (`default_journal_path`), which may not have been created yet on a fresh\n  342│        // machine — `OpenOptions::create` makes the file, never its directory, so a\n  343│        // missing parent surfaces as a NotFound at bind (the broker-bind CI failure).\n     │...\n  601│    fn jpath(dir: &tempfile::TempDir) -> PathBuf {\n *602│        dir.path().join(\"effects.log\")\n  603│    }\n  604│\n  605│    /// Build a key with a representative real minter — the pre-A-4a tests exercise\n     │...\n  618│    // creates the dir rather than failing at bind — `default_journal_path` lives\n *619│    // under `spt_home()`, absent on a fresh machine (the broker-bind CI failure:\n  620│    // `OpenOptions::create` makes the file, never its directory).\n  621│    #[test]\n  622│    fn open_creates_missing_parent_dirs() {\n     │...\n  625│        assert!(!nested.exists(), \"precondition: parent dir is absent\");\n *626│        let j = EffectJournal::open(nested.join(\"daemon-effects.log\")).unwrap();\n  627│        assert!(nested.exists(), \"open created the missing parent dir\");\n  628│        // The journal is usable straight away.\n  629│        assert_eq!(\n     │...\n 1034│        // 1. A hand-written OLD-shape file (pre-A-4a: no minter token).\n*1035│        let old_path = dir.path().join(\"old.log\");\n 1036│        std::fs::write(&old_path, \"PENDING 7 3 net-dial\\nDONE 7 3\\n\").unwrap();\n 1037│        let j_old = EffectJournal::open(&old_path).unwrap();\n 1038│        let legacy_key = EffectKey {\n     │...\n 1062│        // 2. A hand-written NEW-shape file parses to the tagged key.\n*1063│        let new_path = dir.path().join(\"new.log\");\n 1064│        std::fs::write(&new_path, \"PENDING 7 rc 3 net-dial\\nDONE 7 rc 3\\n\").unwrap();\n 1065│        let j_new = EffectJournal::open(&new_path).unwrap();\n 1066│        let rc_key = EffectKey {\n     │...\n 1077│        // 3. Old + new lines in ONE file both recover, as distinct keys.\n*1078│        let mixed_path = dir.path().join(\"mixed.log\");\n 1079│        std::fs::write(\n 1080│            &mixed_path,\n 1081│            \"PENDING 7 3 net-dial\\nDONE 7 3\\nPENDING 7 cli 3 net-dial\\nDONE 7 cli 3\\n\",\n## endpoint.rs\n  4│//! and the seed-control channel (B6) — under names derived from the active\n *5│//! `spt_home`. Deriving from `spt_home` keeps each isolated home (a test's\n *6│//! `SPT_HOME` override, a per-user install) on its own daemon, so parallel test\n  7│//! processes never collide on one machine while a real install gets one stable\n *8│//! per-home daemon. The auto-start spawn inherits `SPT_HOME`, so the spawned\n  9│//! daemon computes the **same** names as the client that started it — that\n 10│//! shared derivation is the whole of the rendezvous (no registry lookup).\n 11│// [impl->REQ-DAEMON-3]\n   │...\n 15│\n*16│use spt_store::perch::spt_home;\n 17│\n 18│/// A deterministic short tag for the active spt home. `DefaultHasher::new()` is\n 19│/// seeded with fixed keys (it is **not** randomized like `RandomState`), so the\n*20│/// tag is stable across processes that share the same `spt_home` — exactly what\n 21│/// the auto-start handshake needs (the spawned daemon must independently derive\n 22│/// the launching client's socket name).\n 23│fn home_tag() -> String {\n 24│    let mut h = std::collections::hash_map::DefaultHasher::new();\n*25│    spt_home().hash(&mut h);\n 26│    format!(\"{:016x}\", h.finish())\n 27│}\n 28│\n   │...\n 65│\n*66│/// The daemon's pid file: `<spt_home>/daemon.pid`. Best-effort breadcrumb the\n 67│/// running daemon writes on start — discoverable for management/cleanup. Not a\n 68│/// liveness signal (liveness is the seed-control ping); a stale pid here is\n 69│/// harmless because callers probe the socket, never this file.\n 70│pub fn daemon_pid_path() -> PathBuf {\n*71│    spt_home().join(\"daemon.pid\")\n 72│}\n 73│\n*74│/// The brain child's readiness breadcrumb: `<spt_home>/brain.ready` (the brain\n 75│/// child's pid, rewritten each heartbeat). The broker spawns the brain as a\n 76│/// supervised child process (ADR-0018 Q2/Q3 — the two-process restoration); the\n 77│/// child writes this once it has connected to the broker socket, and refreshes\n   │...\n 83│pub fn brain_ready_path() -> PathBuf {\n*84│    spt_home().join(\"brain.ready\")\n 85│}\n 86│\n 87│/// Where the peer pump records its last-tick heartbeat (epoch ms, M8\n   │...\n 91│pub fn pump_heartbeat_path() -> PathBuf {\n*92│    spt_home().join(\"identity\").join(\"pump-heartbeat.json\")\n 93│}\n 94│\n 95│/// Read the pump's last-tick heartbeat (epoch ms). `None` = never written\n## lib.rs\n 163│pub mod shellwake;\n*164│pub mod stderrlog;\n 165│pub mod sync;\n 166│pub mod translation;\n 167│pub mod transport;\n## lifecycle.rs\n 251│/// of a recorded endpoint cwd — the gap is NAMED (never silently guessed, never the\n*252│/// daemon cwd). Once per id per daemon run, so a cwd-less perch doesn't spam the log.\n 253│fn warn_no_cwd_once(id: &str, raw: &Path) {\n 254│    warn_once(\n 255│        format!(\"ingest:{id}\"),\n## linkhost.rs\n  730│        };\n *731│        let src = perch::spt_home().join(\"srcs\").join(name);\n  732│        std::fs::create_dir_all(&src).unwrap();\n  733│        std::fs::write(\n  734│            src.join(\"manifest.toml\"),\n     │...\n  883│        let p = if persistent { \"persistent = true\\n\" } else { \"\" };\n *884│        let src = perch::spt_home().join(\"srcs\").join(name);\n  885│        std::fs::create_dir_all(&src).unwrap();\n  886│        std::fs::write(\n  887│            src.join(\"manifest.toml\"),\n     │...\n 1074│            // Register a shell whose `note` op is gated remembered.\n*1075│            let src = perch::spt_home().join(\"srcs\").join(\"Gated\");\n 1076│            std::fs::create_dir_all(&src).unwrap();\n 1077│            #[cfg(windows)]\n 1078│            let spawn = \"cmd /C exit 0\";\n## livehost.rs\n 1139│        );\n*1140│        let src = perch::spt_home().join(\"srcs\").join(name);\n 1141│        std::fs::create_dir_all(&src).unwrap();\n 1142│        std::fs::write(src.join(\"manifest.toml\"), toml).unwrap();\n 1143│        spt_runtime::registry::register(&perch::adapters_dir(), &src, 1000).unwrap();\n     │...\n 1459│        with_home(|_| {\n*1460│            let drops = perch::spt_home().join(\"drops\");\n 1461│            std::fs::create_dir_all(&drops).unwrap();\n 1462│            register_live_adapter(\"mock\", &drops);\n 1463│\n     │...\n 1736│        with_home(|_| {\n*1737│            let drops = perch::spt_home().join(\"drops\");\n 1738│            std::fs::create_dir_all(&drops).unwrap();\n 1739│            register_live_adapter(\"mock\", &drops);\n 1740│            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n     │...\n 1772│        with_home(|_| {\n*1773│            let drops = perch::spt_home().join(\"drops\");\n 1774│            std::fs::create_dir_all(&drops).unwrap();\n 1775│            register_live_adapter(\"mock\", &drops);\n 1776│            seed_live_perch(\"doyle\", \"mock\", spt_store::liveness::STATUS_OFFLINE);\n     │...\n 1795│        with_home(|_| {\n*1796│            let drops = perch::spt_home().join(\"drops\");\n 1797│            std::fs::create_dir_all(&drops).unwrap();\n 1798│            register_live_adapter(\"mock\", &drops);\n 1799│            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n     │...\n 1826│        with_home(|_| {\n*1827│            let drops = perch::spt_home().join(\"drops\");\n 1828│            std::fs::create_dir_all(&drops).unwrap();\n 1829│            register_live_adapter(\"mock\", &drops);\n 1830│            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n     │...\n 1873│        with_home(|_| {\n*1874│            let drops = perch::spt_home().join(\"drops\");\n 1875│            std::fs::create_dir_all(&drops).unwrap();\n 1876│            register_live_adapter(\"mock\", &drops);\n 1877│            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n     │...\n 1917│        with_home(|_| {\n*1918│            let drops = perch::spt_home().join(\"drops\");\n 1919│            std::fs::create_dir_all(&drops).unwrap();\n 1920│            register_live_adapter(\"mock\", &drops);\n 1921│            seed_live_perch(\"doyle\", \"mock\", STATUS_ONLINE);\n     │...\n 2245│        with_home(|_| {\n*2246│            let drops = perch::spt_home().join(\"drops\");\n 2247│            std::fs::create_dir_all(&drops).unwrap();\n 2248│            register_live_adapter(\"mock\", &drops);\n 2249│            seed_woken_perch(\"cold\", \"mock\", Some(\"mock\"), \"sid-r\");\n## nethost.rs\n 1830│        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n*1831│        if entry.log.lock().unwrap().lease.is_canceled() {\n 1832│            return Err(io::Error::other(format!(\n 1833│                \"stream {stream_id} lease canceled (subscriber poisoned) — serve leg terminated\"\n 1834│            )));\n     │...\n 1858│            .get(&stream_id)\n*1859│            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n 1860│    }\n 1861│\n 1862│    /// Every held stream's info — the query a re-attaching brain uses to find\n     │...\n 1890│            .map(|(id, e)| {\n*1891│                let log = e.log.lock().unwrap();\n 1892│                NetStreamInfo {\n 1893│                    stream_id: *id,\n 1894│                    conn_id: e.conn_id,\n     │...\n 1916│            .values()\n*1917│            .filter(|e| e.log.lock().unwrap().subscriber.is_some())\n 1918│            .count() as u64;\n 1919│        (rows, seats)\n 1920│    }\n     │...\n 1956│            let seat = {\n*1957│                let mut log = entry.log.lock().unwrap();\n 1958│                log.ring.clear();\n 1959│                log.subscriber.take()\n 1960│            };\n     │...\n 1991│        // protect (contrast the unsubscribe verb's take_seat_if).\n*1992│        let seat = entry.log.lock().unwrap().subscriber.take();\n 1993│        if let Some(seat) = seat {\n 1994│            seat.dismiss();\n 1995│        }\n     │...\n 2010│        }\n*2011│        let line = entry.log.lock().unwrap().opener_line();\n 2012│        Some(line)\n 2013│    }\n 2014│\n     │...\n 2022│        if let Some(e) = self.shared.streams.lock().unwrap().get(&stream_id) {\n*2023│            e.log.lock().unwrap().set_retentive(cap);\n 2024│        }\n 2025│    }\n 2026│\n     │...\n 2034│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*2035│        let drained = entry.log.lock().unwrap().drain();\n 2036│        // The drain freed ring room — wake a pump that was backpressure-parked.\n 2037│        entry.room.notify_one();\n 2038│        Some(drained)\n     │...\n 2049│            .get(&stream_id)\n*2050│            .map(|e| e.log.lock().unwrap().ring.len())\n 2051│    }\n 2052│\n 2053│    /// Inbound (peer-initiated) stream rows currently held on `conn_id` — the\n     │...\n 2104│            })?;\n*2105│            Arc::clone(&e.log)\n 2106│        };\n 2107│        // Install the seat WITH its replay snapshot in one atomic critical\n 2108│        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\n     │...\n 2130│            let streams = self.shared.streams.lock().unwrap();\n*2131│            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n 2132│        };\n 2133│        let Some(log) = log else {\n 2134│            return false;\n     │...\n 2151│            let streams = self.shared.streams.lock().unwrap();\n*2152│            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n 2153│        };\n 2154│        if let Some(log) = log {\n 2155│            log.lock().unwrap().detach_if(sub);\n## notif.rs\n 1100│    fn register_adapter(name: &str, manifest: &str) {\n*1101│        let src = perch::spt_home().join(\"srcs\").join(name);\n 1102│        std::fs::create_dir_all(&src).unwrap();\n 1103│        std::fs::write(src.join(\"manifest.toml\"), manifest).unwrap();\n 1104│        spt_runtime::registry::register(&perch::adapters_dir(), &src, 1).unwrap();\n## pairhost.rs\n 571│/// The deep per-probe SUCCESS-path trace (\"what took so long\" on a slow-but-ok\n*572│/// join) is DEFERRED: there is no daemon tracing facility (SPT_LOG) to hang it on\n 573│/// yet, and a per-probe frame protocol isn't worth it for v1 (doyle 2026-06-28).\n 574│// [impl->REQ-JOIN-DIAGNOSTICS] [impl->REQ-JOIN-VERBOSE-CLOCK]\n 575│pub fn meet_failure_detail(\n## projwriter.rs\n    4│//! The daemon (brain) is the SOLE, SINGLE-FLIGHT writer of\n   *5│//! `$SPT_HOME/index/project-index.json` (format + read path owned by\n    6│//! `spt_store::projindex`, W1). One brain-hosted thread:\n    7│//!\n    8│//! - loads the persisted index at start and is READY WITHOUT WARM — the boot\n     │...\n   78│\n  *79│/// The observability sidecar (`$SPT_HOME/index/project-index-stats.json`) —\n   80│/// written atomically by the writer after every cycle; read by\n   81│/// `spt daemon status` and by the int gates. Additive serde-default shape\n   82│/// (derived + regenerable, like the index itself).\n     │...\n  157│impl WriterPaths {\n *158│    /// The production layout under the live `$SPT_HOME`.\n  159│    pub fn production() -> WriterPaths {\n  160│        WriterPaths {\n  161│            owlery: perch::owlery_dir(),\n     │...\n  695│\n *696│    /// A self-contained home-shaped fixture tree (NO env, NO real $SPT_HOME):\n  697│    /// owlery + tracked context store + index paths, all under one TempDir.\n  698│    struct Fixture {\n  699│        _tmp: TempDir,\n     │...\n 1056│    // branch-enumeration census proves the burst did not fan out into N\n*1057│    // cycles). Uses the real spawn loop over an isolated $SPT_HOME.\n 1058│    // [unit->REQ-PROJECT-INDEX-WRITER]\n 1059│    #[test]\n 1060│    fn writer_thread_debounces_burst_into_one_cycle() {\n     │...\n 1120│    // is contract) — proven against an oracle that reconstructs the retired\n*1121│    // picker wiring verbatim: sessions.log (reversed) ∪ info.cwd origin ∪\n 1122│    // p-* branches by recency, derived through the REAL git\n 1123│    // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo\n 1124│    // WITH a remote (slug ≠ folder name — the display-parity hard case), a\n\n## pump/\n### mod.rs\n  219│/// Where this node's pump-side stores live. Production = the canonical\n *220│/// SPT_HOME layout; the loopback E2E gives its in-process \"node\" distinct\n  221│/// roots so two nodes can share one test process.\n  222│pub struct PumpPaths {\n  223│    /// The perch tree (registry advertisement scan).\n     │...\n  269│impl PumpPaths {\n *270│    /// The canonical SPT_HOME layout.\n  271│    pub fn production() -> PumpPaths {\n *272│        let home = perch::spt_home();\n  273│        let identity = perch::identity_dir();\n  274│        PumpPaths {\n  275│            owlery: perch::owlery_dir(),\n     │...\n 1205│/// Supervise repeated runs of a pump body until `stop` is raised (M8\n*1206│/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n 1207│/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n 1208│/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n 1209│/// self-heals visibly instead of silently halving the daemon for 24 h.\n     │...\n 1389│        fn pre_round(&mut self, _ctx: &RoundCtx) {\n*1390│            self.log.borrow_mut().push(format!(\"pre:{}\", self.tag));\n 1391│        }\n 1392│        fn peer_step(\n 1393│            &mut self,\n     │...\n 2020│        let name = format!(\"spt-pump-pushfeed-{}.sock\", std::process::id());\n*2021│        let broker = Broker::bind_in_with_net(&name, dir.path().join(\"effects.log\"), Some(host))\n 2022│            .expect(\"bind broker\");\n 2023│        let serve = std::sync::Arc::clone(&broker);\n 2024│        std::thread::spawn(move || {"},"isError":false,"timestamp":1784292937915}}
{"type":"message","id":"c7501b5b","parentId":"266b4804","timestamp":"2026-07-17T12:55:47.090Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Locating default SPT home implementation**"},{"type":"toolCall","id":"call_hoKO2IuUQLZXQPmCYCBtfWTT|fc_0148993141920bab016a5a265307ec8195a4bc0e81c35a83fd","name":"grep","arguments":{"i":"Finding SPT home resolution","pattern":"pub fn spt_home|fn spt_home|LOCALAPPDATA|\\.spt","path":"crates/spt-store/src","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_OQNvD5iFvDrDLgbASuuv1g4w|fc_0148993141920bab016a5a26530800819593fb77f6be06ecd4","name":"read","arguments":{"i":"Reading pump scheduler loop","path":"crates/spt-daemon/src/pump/mod.rs","selector":"1-220,219-340,500-760"}},{"type":"toolCall","id":"call_KxKISFDTMoo5Xr7uc8FQGzr9|fc_0148993141920bab016a5a2653080c8195a8d18aaa5611e860","name":"read","arguments":{"i":"Reading pump round execution","path":"crates/spt-daemon/src/pump/mod.rs","selector":"760-1040,1180-1280"}},{"type":"toolCall","id":"call_OoEgZohciuCspQkyYjbFOKwD|fc_0148993141920bab016a5a265308108195874d257f37d4aa35","name":"grep","arguments":{"i":"Finding dispatcher main loop","pattern":"pub fn run_dispatcher|fn run_dispatcher|spawn_dispatcher|DEFAULT_DISPATCH_POLL|thread::sleep","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_E5QPPEHSuP6swBsznbjjctbD|fc_0148993141920bab016a5a265308188195886e0bc01126e750","name":"grep","arguments":{"i":"Finding registry scan complexity","pattern":"pub fn|read_dir|walk|owlery|registry|advert|scan|entries|resolve","path":"crates/spt-daemon/src/registryhost.rs","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_wUzDZjJljOMxAWUf6xL3Zwo3|fc_0148993141920bab016a5a2653081c81959c1d5687628033a4","name":"grep","arguments":{"i":"Finding livehost cadence","pattern":"const .*PERIOD|Duration::from|thread::sleep|reconcile_once|spawn_live_host|loop \\{","path":"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/projwriter.rs;crates/spt-daemon/src/shellwake.rs","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":20170,"output":435,"cacheRead":43520,"cacheWrite":0,"totalTokens":64125,"reasoningTokens":18,"cost":{"input":0.10085000000000001,"output":0.01305,"cacheRead":0.021759999999999998,"cacheWrite":0,"total":0.13566}},"stopReason":"toolUse","timestamp":1784292937954,"responseId":"resp_0148993141920bab016a5a264a46cc819585c9105307dc952f","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a264b2ef0819584af6d1f2bf41b04","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiZTCuSzk5IIx23sZMzunWzQfEhjjn5EOBjqJJCZ0Zl9OQ09_R7UtoHvVFC7r3PxYtflH-z-dCXCUS8pC62QwpurE8LMjsLFGbU_WIqgxXYT-otcWrCOauiQq4VPq-27J_TsH-7kUD9BPaFS5Q9ArppXHi-uPe1JAtbC5OBMKa9uEzEG49pqD60AT6EcJaquEsLuIXn3BiXwKm4s43lGry2X3n1kaVYZwAcf7IPjzB9K8IjzcnnOdyD6yPJyCXewjtVp_rNiqGYnAp_ILQftEJNQebRIBmlP2PunWBxeSrrH6VQdSYFiXOrK38opEvwaO3_Mmu-NDMn6iBKVw8ForRloLzYM12_kSyfI9dSzIhuNfhp8Gwj7kZAOhZABlueKXp8kDKBskplOGqFiMevSotwxJZUsTHhoEphfUEzniDiv9VWG1sVNxBFZOq9bfHszAav4f9XvKASmIXbxgBwuMmzWneGAT_HJaMpzIQ_PBxjsgbNPsu1rbymGsGZVQi1R5sXTzh2rFHSS1bX1i1cv0BFbdAxrivoYKkJQaS9pPiRVqIgAg-9BFVRprMBGw9B_eFyPA00Wdfh7yx_E_1mM-MqAsDVIXHzrWXBoOlGrichvJUVUFLdokSh9dn1vw3QkzLnCXYMqjejfui9KtdPonR06nAB5aLJcxkz6U96MjDzc65M9iUBOqRYipWCA1qtas1ptRKDJosyFL8ZQaTgWcLIhZU5xntjSX1Lss9tRmcN9r7925gMKbaDvqhEryeyO5WJbsAeaUAkQvl0L-vBKdaqkjYnTSqbhyfxzI_ok3QcGy07HLKzYPSi-nQTby7wZ_LxzI4dXXYuA4MVVn2i2xkT5V4Ybz3l8reChgsl1rXw_QgXu0o6krijcojgozWNdMHxAk0mb7dhFj96npVr7MTXrO1Vjnyz1e_ecQO6h2Xm3sqsnOQuIpAz7vmgqmEawqnnbdkBmQ9X30Mf19o6yx2J-ABEGCC_h9BMz3plBKbQ-QXI0SFhH_o8YyoBLEYxML0PY","summary":[{"type":"summary_text","text":"**Locating default SPT home implementation**"}]},{"id":"fc_0148993141920bab016a5a265307ec8195a4bc0e81c35a83fd","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding SPT home resolution\",\"pattern\":\"pub fn spt_home|fn spt_home|LOCALAPPDATA|\\\\.spt\",\"path\":\"crates/spt-store/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_hoKO2IuUQLZXQPmCYCBtfWTT","name":"grep"},{"id":"fc_0148993141920bab016a5a26530800819593fb77f6be06ecd4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump scheduler loop\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"1-220,219-340,500-760\"}","call_id":"call_OQNvD5iFvDrDLgbASuuv1g4w","name":"read"},{"id":"fc_0148993141920bab016a5a2653080c8195a8d18aaa5611e860","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump round execution\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"760-1040,1180-1280\"}","call_id":"call_KxKISFDTMoo5Xr7uc8FQGzr9","name":"read"},{"id":"fc_0148993141920bab016a5a265308108195874d257f37d4aa35","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding dispatcher main loop\",\"pattern\":\"pub fn run_dispatcher|fn run_dispatcher|spawn_dispatcher|DEFAULT_DISPATCH_POLL|thread::sleep\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_OoEgZohciuCspQkyYjbFOKwD","name":"grep"},{"id":"fc_0148993141920bab016a5a265308188195886e0bc01126e750","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry scan complexity\",\"pattern\":\"pub fn|read_dir|walk|owlery|registry|advert|scan|entries|resolve\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_E5QPPEHSuP6swBsznbjjctbD","name":"grep"},{"id":"fc_0148993141920bab016a5a2653081c81959c1d5687628033a4","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding livehost cadence\",\"pattern\":\"const .*PERIOD|Duration::from|thread::sleep|reconcile_once|spawn_live_host|loop \\\\{\",\"path\":\"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/projwriter.rs;crates/spt-daemon/src/shellwake.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_wUzDZjJljOMxAWUf6xL3Zwo3","name":"grep"}]},"duration":9135.275299996138,"ttft":1245.7035000026226,"contextSnapshot":{"promptTokens":63690,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hoKO2IuUQLZXQPmCYCBtfWTT|fc_0148993141920bab016a5a265307ec8195a4bc0e81c35a83fd","toolName":"grep","startedAt":"2026-07-17T12:55:47.090Z","args":{"path":"crates/spt-store/src"},"intent":"Finding SPT home resolution"},"id":"151e5520","parentId":"c7501b5b","timestamp":"2026-07-17T12:55:47.090Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_OQNvD5iFvDrDLgbASuuv1g4w|fc_0148993141920bab016a5a26530800819593fb77f6be06ecd4","toolName":"read","startedAt":"2026-07-17T12:55:47.090Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump scheduler loop"},"id":"9e9c5b9c","parentId":"151e5520","timestamp":"2026-07-17T12:55:47.090Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KxKISFDTMoo5Xr7uc8FQGzr9|fc_0148993141920bab016a5a2653080c8195a8d18aaa5611e860","toolName":"read","startedAt":"2026-07-17T12:55:47.090Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump round execution"},"id":"ff2f5118","parentId":"9e9c5b9c","timestamp":"2026-07-17T12:55:47.090Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_OoEgZohciuCspQkyYjbFOKwD|fc_0148993141920bab016a5a265308108195874d257f37d4aa35","toolName":"grep","startedAt":"2026-07-17T12:55:47.090Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding dispatcher main loop"},"id":"b2e3c354","parentId":"ff2f5118","timestamp":"2026-07-17T12:55:47.090Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_E5QPPEHSuP6swBsznbjjctbD|fc_0148993141920bab016a5a265308188195886e0bc01126e750","toolName":"grep","startedAt":"2026-07-17T12:55:47.091Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Finding registry scan complexity"},"id":"10c34c06","parentId":"b2e3c354","timestamp":"2026-07-17T12:55:47.091Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_wUzDZjJljOMxAWUf6xL3Zwo3|fc_0148993141920bab016a5a2653081c81959c1d5687628033a4","toolName":"grep","startedAt":"2026-07-17T12:55:47.091Z","args":{"path":"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/projwriter.rs;crates/spt-daemon/src/shellwake.rs"},"intent":"Finding livehost cadence"},"id":"e614cccd","parentId":"10c34c06","timestamp":"2026-07-17T12:55:47.091Z"}
{"type":"message","id":"20c0a055","parentId":"e614cccd","timestamp":"2026-07-17T12:55:47.092Z","message":{"role":"toolResult","toolCallId":"call_OoEgZohciuCspQkyYjbFOKwD|fc_0148993141920bab016a5a265308108195874d257f37d4aa35","toolName":"grep","content":[{"type":"text","text":" 86|/// workers block on their stream's event feed).\n*87|pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n 88|\n 89|/// What protocol a peer-initiated stream speaks, by its first record's shape.\n 90|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n...\n 532|            // with fresh replay subscribers (Amendment fix 5).\n*533|            thread::sleep(poll);\n 534|            continue;\n 535|        }\n 536|        let reply = brain.net_streams()?;\n...\n 678|        }\n*679|        thread::sleep(poll);\n 680|    }\n 681|    Ok(())\n 682|}\n...\n 704|        }\n*705|        thread::sleep(Duration::from_millis(10));\n 706|    }\n 707|    Err(last)\n 708|}\n...\n 1414|/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\n*1415|pub fn spawn_dispatcher(\n 1416|    broker_name: String,\n 1417|    registry: Arc<RegistryHost>,\n 1418|    stop: Arc<AtomicBool>,\n...\n 1422|        if let Err(e) =\n*1423|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1424|        {\n 1425|            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1426|        }"}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":6,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":6}],"truncated":false,"displayContent":"   86│/// workers block on their stream's event feed).\n  *87│pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n   88│\n   89│/// What protocol a peer-initiated stream speaks, by its first record's shape.\n   90│#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n     │...\n  532│            // with fresh replay subscribers (Amendment fix 5).\n *533│            thread::sleep(poll);\n  534│            continue;\n  535│        }\n  536│        let reply = brain.net_streams()?;\n     │...\n  678│        }\n *679│        thread::sleep(poll);\n  680│    }\n  681│    Ok(())\n  682│}\n     │...\n  704│        }\n *705│        thread::sleep(Duration::from_millis(10));\n  706│    }\n  707│    Err(last)\n  708│}\n     │...\n 1414│/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\n*1415│pub fn spawn_dispatcher(\n 1416│    broker_name: String,\n 1417│    registry: Arc<RegistryHost>,\n 1418│    stop: Arc<AtomicBool>,\n     │...\n 1422│        if let Err(e) =\n*1423│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1424│        {\n 1425│            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1426│        }"},"isError":false,"timestamp":1784292947092}}
{"type":"message","id":"097bd4a0","parentId":"20c0a055","timestamp":"2026-07-17T12:55:47.107Z","message":{"role":"toolResult","toolCallId":"call_OQNvD5iFvDrDLgbASuuv1g4w|fc_0148993141920bab016a5a26530800819593fb77f6be06ecd4","toolName":"read","content":[{"type":"text","text":"//! Outbound peer pump (D9-1-2) — the production trigger loops every D5–D8\n//! slice deferred (\"rides D9 with the daemon lifecycle\").\n//!\n//! One daemon-hosted loop — *the* peer pump — is a pure scheduler + per-peer\n//! fan-out over four [`PumpWorker`] legs. The pump owns *when* (each worker's\n//! cadence + its wake markers, fed to the pure [`due`] kernel) and *toward\n//! whom* (every roster member of every non-detached member subnet); each worker\n//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin\n//! call over an already-shipped, idempotent driver. The four legs, in fan-out\n//! order, each in its own module:\n//!\n//! - **registry push** ([`registry`], [`RegistryHost::advertise_local`] → one\n//!   feed stream per peer): the node re-advertises its own rows; peers\n//!   reconverge within one cadence (replay-is-recovery, the D4d/D8 push\n//!   posture). Mesh-D6 widened the push target from the directly-paired set to\n//!   ALL roster members — a wider DIRECT fan-out, never a relay (REQ-MESH-3).\n//!   Own rows only — a relayed third-party row would carry an origin the\n//!   receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10), so every row still\n//!   arrives from its author over a handshake.\n//! - **notif push** ([`notif`], [`crate::notifsync::emit_notif_feed`]): the\n//!   full semilattice spool per subnet; the receiver's join dedups.\n//! - **sync pull** ([`sync`], [`crate::sync::request_sync`]): anti-entropy for\n//!   the minds. Want-refs are the union of [`crate::sync::select_refs`]\n//!   (locally tracked branches the policy allows toward the peer) and\n//!   **registry-derived** `a-<id>` refs (endpoints known in the shared\n//!   subnets — how a fresh instance bootstraps a mind it has never held), both\n//!   gated by the same [`SyncPolicy::allows`] the responder enforces (symmetric\n//!   scoping).\n//! - **update pull** ([`update`], [`crate::propagate::request_update`]): the\n//!   peer-propagated self-update (REQ-UPD-1), consent-gated by default\n//!   (REQ-UPD-4), with typed convergence outcomes (REQ-UPD-6).\n//!\n//! The scheduler kernels are pure and unit-tested with scripted workers (the\n//! choreography table below): [`compute_due`] (prime-all / wake-forces-one),\n//! [`pre_rounds`] (once per due round, before any peer_step), [`run_due`]\n//! (abort-on-first-fail), [`mark_ran`] (the §V4 stagger), [`fan_targets`]\n//! (detached-skip). LLM-bearing work is never a [`PumpWorker`] (KNOWN-HAZARDS\n//! 7.4) — see the trait's contract.\n//!\n//! Conflicts a pull surfaces are reported through [`PumpHooks::on_pull`] —\n//! the default production hook logs them loud. The bounded Psyche reconcile\n//! turn itself still runs at the activation paths (ADR-0013): the daemon\n//! does not yet host per-agent manifest runtimes (the 7.4 fan-out), so an\n//! in-pump turn has no runtime to ride; conflict artifacts persist safely\n//! meanwhile (REQ-HAZARD-CONFLICT-BOTH-PRESERVED).\n//!\n//! ## Wire discipline (inherited from the test suites, now production)\n//!\n//! Every pump write is fire-and-forget (`op_id: None`) — a journaled\n//! `net_stream_send` blocks on its ack and DISCARDS interleaved events\n//! (gotcha #1). Stream opens for push feeds carry no op either: the feeds\n//! are idempotent by construction. The sync pull's `open_op` IS durable\n//! (exactly-once open identity), minted from a dedicated [`EpochSource`]\n//! file so a daemon restart can never reuse one.\n//!\n//! Per-leg wire-discipline evidence lives with each worker now: registry push\n//! ([`registry`], REQ-INST-7), notif push ([`notif`], REQ-NOTIF-1), sync pull\n//! ([`sync`], REQ-INST-5).\n\nuse std::collections::{HashMap, HashSet};\nuse std::io;\nuse std::path::PathBuf;\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::Arc;\nuse std::thread;\nuse std::time::{Duration, Instant};\n\nuse spt_net::net::endpoint::addr_for_node_hex;\nuse spt_store::epoch::EpochSource;\nuse spt_store::peeraddrs::PeerAddrStore;\nuse spt_store::perch;\nuse spt_store::subnet::SubnetStore;\nuse spt_store::visibility::VisibilityStore;\n\nuse crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\nuse crate::config::DaemonConfig;\nuse crate::effect::{Minter, MintedOp};\nuse crate::msg::{\n    NetPresenceEvent, PRESENCE_CONNECTED, PRESENCE_DIAL_FAILED, PRESENCE_DISCONNECTED,\n};\nuse crate::registryhost::RegistryHost;\nuse crate::sync::{SyncPolicy, SyncPullReport};\n\npub mod health;\nuse health::PumpHealth;\n\nmod notif;\nmod registry;\nmod sync;\nmod update;\nuse notif::NotifWorker;\nuse registry::RegistryWorker;\nuse sync::SyncWorker;\nuse update::UpdateWorker;\n\n/// The pump's tick granularity — each cadence fires when its period elapsed.\nconst TICK: Duration = Duration::from_millis(200);\n\n/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall\n/// warning reads 3-cadence staleness, so a few seconds of heartbeat\n/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\nconst HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\n\n/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\n/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\n/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either\n/// way). A read that exceeds this is treated as a poisoned client and\n/// escalated to a supervised restart, NEVER a per-peer retry.\nconst PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);\n\n/// Supervisor backoff floor: the first restart after a pump death.\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Supervisor backoff cap (M8 decision 23): a persistently-crashing pump\n/// retries at most every 5 minutes — visible, bounded, never silent.\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);\n\n/// A run that survived this long before dying counts as healthy — the next\n/// backoff resets to the floor instead of doubling (a once-a-day panic must\n/// not ratchet the pump toward permanent 5-minute outages).\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);\n\n/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the\n/// first failed dial to a peer waits this long before the pump re-dials THAT\n/// peer. Scoped to the peer — a dead peer backs off while live peers stay hot.\nconst PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most\n/// every 5 minutes (same bound as the supervisor) — bounded, never a hot redial\n/// loop, never silent. Reset to the floor on any successful connect.\nconst PEER_BACKOFF_CAP: Duration = Duration::from_secs(300);\n\n/// Round-drain margin over W1's per-dial reply-read budget (G3, Q1): because the\n/// dials are CONCURRENT, every outcome lands within ~one W1 bound, so the round\n/// closes shortly after it. Derived symbolically from\n/// [`PEER_REPLY_READ_BUDGET`] (not a hardcoded 12s) so it tracks any W1 retune.\nconst ROUND_DRAIN_MARGIN: Duration = Duration::from_secs(2);\n\n/// Per-peer dial schedule (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): a peer is\n/// dial-eligible when `now >= next_due`. A `DIAL_FAILED` (or a mid-round\n/// `peer_step` failure — Q3) doubles `backoff` (capped [`PEER_BACKOFF_CAP`]) and\n/// pushes `next_due` out; a successful connect drops the entry (reset). Kept in a\n/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n/// supervised restart like `WorkerLasts`.\n#[derive(Clone, Copy, Debug)]\nstruct PeerSched {\n    next_due: Instant,\n    backoff: Duration,\n}\n\n/// The next per-peer backoff after a failed dial (pure, unit-tested): the first\n/// failure waits [`PEER_BACKOFF_BASE`]; each subsequent failure doubles, capped\n/// at [`PEER_BACKOFF_CAP`]. `next_due = now + backoff`.\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn next_peer_backoff(prev: Option<PeerSched>, now: Instant) -> PeerSched {\n    let backoff = match prev {\n        None => PEER_BACKOFF_BASE,\n        Some(p) => p.backoff.saturating_mul(2).min(PEER_BACKOFF_CAP),\n    };\n    PeerSched {\n        next_due: now + backoff,\n        backoff,\n    }\n}\n\n/// Whether a peer may be dialed this round (pure): a peer with no schedule entry\n/// (never failed, or just reset by a success) is always eligible; one in backoff\n/// is eligible only once `next_due` has passed.\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn peer_eligible(sched: &HashMap<String, PeerSched>, peer_hex: &str, now: Instant) -> bool {\n    sched.get(peer_hex).is_none_or(|s| now >= s.next_due)\n}\n\n/// The outcome of ONE events-carrier drain read (PUMP-TRUTH W2). Pulled out of the\n/// round loop so the load-bearing dead-carrier classification is a UNIT fact.\nenum DrainStep {\n    /// A presence event to apply to per-peer state.\n    Apply(NetPresenceEvent),\n    /// A non-presence frame on the event carrier — ignore, keep draining.\n    Skip,\n    /// A quiet read (`TimedOut`): no more outcomes available now → close the round.\n    RoundDone,\n    /// A dead CARRIER (any non-`TimedOut` read error — the broker stopped answering\n    /// the stream: reader-thread `UnexpectedEof`/`BrokenPipe` on a closed conn).\n    /// The re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: bubble to a supervised restart.\n    Restart(io::Error),\n}\n\n/// Classify one events-carrier drain read (PUMP-TRUTH W2, the re-pointed\n/// REQ-HAZARD-PUMP-IPC-DEADLINE). This is THE guard on the decouple: a dead PEER\n/// never reaches here (its failure is an ordinary `PRESENCE_DIAL_FAILED` event or\n/// a reclassified per-peer drop), but a dead BROKER — the event carrier itself\n/// going silent — MUST still bubble to a supervised restart. `TimedOut` is the\n/// benign \"no outcome available this instant\" (round closes on its deadline); any\n/// OTHER read error is the carrier dying and MUST NOT be swallowed as quiet.\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn classify_drain_read(read: io::Result<BrokerEvent>) -> DrainStep {\n    match read {\n        Ok(BrokerEvent::NetPresence(ev)) => DrainStep::Apply(ev),\n        Ok(_) => DrainStep::Skip,\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => DrainStep::RoundDone,\n        Err(e) => DrainStep::Restart(e),\n    }\n}\n\n/// Resolve a trusted peer's stable name (lowercase-hex pubkey) to a dialable\n/// address (the serde JSON `net-dial` carries). Production resolution lets\n/// discovery do the work ([`production_resolver`]); hermetic tests inject a\n/// concrete address map (loopback endpoints run no discovery).\npub type PeerResolver = Box<dyn Fn(&str) -> Option<serde_json::Value> + Send>;\n\n/// The production resolver: an id-only iroh address — mDNS on the LAN, n0\n/// DNS on the WAN (`addr_for_node_hex`).\npub fn production_resolver() -> PeerResolver {\n    Box::new(|hex| addr_for_node_hex(hex).and_then(|a| serde_json::to_value(a).ok()))\n}\n\n/// Where this node's pump-side stores live. Production = the canonical\n/// SPT_HOME layout; the loopback E2E gives its in-process \"node\" distinct\n/// roots so two nodes can share one test process.\npub struct PumpPaths {\n    /// The perch tree (registry advertisement scan).\n    pub owlery: PathBuf,\n    /// The context store root ([`ContextStore::open_or_init_in`]).\n    pub ctx_root: PathBuf,\n    /// The notif spool DB ([`NotifStore::open_at`]).\n    pub notif_db: PathBuf,\n    /// Transient pull scratch.\n    pub scratch: PathBuf,\n    /// `subnet.json` ([`SubnetStore::load_from`]).\n    pub subnets: PathBuf,\n    /// `visibility.json` ([`VisibilityStore::load_from`]).\n    pub vis: PathBuf,\n    /// The pump's durable open-op counter (its own file — colliding with the\n    /// registry's advertisement epochs would break neither, but a shared\n    /// in-memory cursor pair over one file double-mints; separate files keep\n    /// each `EpochSource` the sole writer of its counter).\n    pub ops: PathBuf,\n    /// The staged-release cache dir ([`ReleaseCache::open`]).\n    pub releases: PathBuf,\n    /// `release-keys.json` ([`VerifyPolicy::load_from`]).\n    pub release_keys: PathBuf,\n    /// The wake-edge freshness-pull marker (D9-2, REQ-INST-3): a\n    /// dormant→active transition drops it; the pump consumes it and forces a\n    /// sync round NOW instead of waiting out `cadence.sync`\n    /// ([`crate::resting::PULL_MARKER_FILE`]).\n    pub pull_marker: PathBuf,\n    /// The event-driven advertisement marker (M8 decision 15, REQ-CONV-2):\n    /// an endpoint online/offline transition drops it; the pump consumes it\n    /// and forces a registry round NOW instead of waiting out\n    /// `cadence.registry` ([`crate::registryhost::ADVERTISE_MARKER_FILE`]).\n    pub advertise_marker: PathBuf,\n    /// `peer-addrs.json` — last-known peer addresses (M8 decisions 14/20,\n    /// REQ-CONV-1): consulted before id-only discovery, written back after\n    /// every successful dial ([`spt_store::peeraddrs::PeerAddrStore`]).\n    pub peer_addrs: PathBuf,\n    /// The pump's last-tick heartbeat (M8 decision 23, REQ-DAEMON-5):\n    /// epoch-ms written while the loop is alive, rendered by\n    /// `spt daemon status` / the `subnet status` stall warning\n    /// ([`crate::endpoint::pump_heartbeat_path`]).\n    pub heartbeat: PathBuf,\n    /// `rotation-pending.json` (Mesh-D7, REQ-MESH-4): the timeboxed seed-rotation\n    /// schedule a `subnet revoke` writes; the pump fires due entries each\n    /// registry tick ([`spt_store::rotation::RotationPending`]).\n    pub rotations: PathBuf,\n}\n\nimpl PumpPaths {\n    /// The canonical SPT_HOME layout.\n    pub fn production() -> PumpPaths {\n        let home = perch::spt_home();\n        let identity = perch::identity_dir();\n        PumpPaths {\n            owlery: perch::owlery_dir(),\n            ctx_root: home.join(\"context\"),\n            notif_db: identity.join(\"notifs.db\"),\n            scratch: home.join(\"scratch\").join(\"pump\"),\n            subnets: identity.join(\"subnet.json\"),\n            vis: identity.join(\"visibility.json\"),\n            ops: identity.join(\"pump-ops.json\"),\n            releases: home.join(\"releases\"),\n            release_keys: identity.join(\"release-keys.json\"),\n            pull_marker: identity.join(crate::resting::PULL_MARKER_FILE),\n            advertise_marker: identity.join(crate::registryhost::ADVERTISE_MARKER_FILE),\n            peer_addrs: identity.join(\"peer-addrs.json\"),\n            heartbeat: crate::endpoint::pump_heartbeat_path(),\n            rotations: identity.join(\"rotation-pending.json\"),\n        }\n    }\n}\n\n/// Pump cadences (config-driven in production: [`DaemonConfig`]).\n#[derive(Debug, Clone, Copy)]\npub struct PumpCadence {\n    pub registry: Duration,\n    pub notif: Duration,\n    pub sync: Duration,\n    pub update: Duration,\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): swept each\n    /// registry tick, before re-advertisement.\n    pub registry_evict_after: Duration,\n}\n\nimpl PumpCadence {\n    /// From the daemon config knobs.\n    pub fn from_config(cfg: &DaemonConfig) -> PumpCadence {\n        PumpCadence {\n            registry: cfg.registry_pump_period,\n            notif: cfg.notif_pump_period,\n            sync: cfg.sync_pull_period,\n            update: cfg.update_check_period,\n            registry_evict_after: cfg.registry_evict_after,\n        }\n    }\n}\n\n/// The pump's resolved knobs: cadences + the REQ-UPD-4 consent stance.\n#[derive(Debug, Clone, Copy)]\npub struct PumpConfig {\n    pub cadence: PumpCadence,\n    /// `true` = the explicit opt-in to prompt-free updates; default `false`\n    /// surfaces every staged release as a consent notif.\n    pub full_auto_update: bool,\n}\n\nimpl PumpConfig {\n    /// From the daemon config knobs.\n    pub fn from_config(cfg: &DaemonConfig) -> PumpConfig {\n        PumpConfig {\n            cadence: PumpCadence::from_config(cfg),\n            full_auto_update: cfg.full_auto_update,\n        }\n    }\n}\n\n/// A pull observer: `(peer_hex, report)` after every completed sync pull.\npub type OnPull = Box<dyn FnMut(&str, &SyncPullReport) + Send>;\n\n/// Observation hooks. `on_pull` fires after every completed sync pull —\n…\nimpl PeerIo<'_> {\n…\n    /// open identity — a restart can never reuse one), tagged with the `pump`\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\n    fn open_op(&mut self) -> io::Result<MintedOp> {\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\n    }\n}\n\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\n/// per-peer connection cache (an IO failure against a peer drops its cache\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\n/// because the broker's closed-watcher reaps dead conns).\n///\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n/// logic lives here — the shell owns only *when* and *toward whom*.\npub fn run_peer_pump(\n    broker_name: &str,\n    registry: Arc<RegistryHost>,\n    paths: &PumpPaths,\n    resolver: PeerResolver,\n    config: PumpConfig,\n    hooks: PumpHooks,\n    stop: &AtomicBool,\n) -> io::Result<()> {\n    let PumpConfig {\n        cadence,\n        full_auto_update,\n    } = config;\n    // PUMP MODE: a brain whose carrier is SPLIT at construction (reader thread +\n    // channel) so every reply read is bounded by PUMP_PEER_IO_TIMEOUT — a\n    // black-holed peer can never wedge this single-threaded loop (the 2.2h\n    // hfenduleam stall). A timed-out read escalates to a supervised restart\n    // below, never a per-peer retry (REQ-HAZARD-PUMP-IPC-DEADLINE).\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    let mut brain = connect(broker_name)?;\n    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\n    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n    // whose reply-reads consume every event kind off their carrier; sharing one\n    // carrier would make a pull-read swallow a presence frame (advancing the\n    // exactly-once cursor while dropping the outcome — the D4c break). Two\n    // carriers keep the drain and the pulls from swallowing each other by\n    // construction. Tail-follow (no history replay, baseline on first live event)\n    // so a long-lived broker's evicted ring can never gap-trip a false restart.\n    let mut events = connect(broker_name)?;\n    events.net_presence_subscribe_tail()?;\n    // Startup reconcile + invariant migration (ADR-0039 Decisions 3+4,\n    // REQ-PEER-ROUTE-CHAIN / REQ-PEERADDR-INVARIANT): validated roster\n    // addresses reconcile into the dial cache BEFORE the first round —\n    // recovery is connection-independent (a node restarted mid-strand heals\n    // here, no operator surgery) — and rows violating `outer key ==\n    // address.id` are repaired from the roster or dropped loudly (the first\n    // post-upgrade load is the migration; the file is never bare-deleted —\n    // valid rows and the id-only fallback behind them stay untouched).\n    // Idempotent, so re-running on every supervised pump restart is free.\n    startup_reconcile_peeraddrs(paths, registry.node_hex());\n    // Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded\n    // so the last-good stamps survive a restart; the live counts re-prime as\n    // rounds run. Persisted beside the heartbeat; the status CLI reads it.\n    let health_path = PumpHealth::path_beside(&paths.heartbeat);\n    let mut health = PumpHealth::load_from(&health_path);\n    health.note_disconnected(0); // no conns exist yet in this pump generation\n    let mut ops = EpochSource::load_from(&paths.ops);\n    // The live per-peer connection cache (updated by presence events) + the\n    // per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.\n    let mut conns: HashMap<String, u64> = HashMap::new();\n    let mut sched: HashMap<String, PeerSched> = HashMap::new();\n    // The four cadenced legs behind the worker seam, in fan-out order\n    // (registry → notif → sync → update). The shell drives them generically;\n    // each leg's *what* lives in its module (§Frozen). Construction capture\n    // (§Frozen-4): each worker owns the registry Arc / path slices / config\n    // knob it needs — the sync worker additionally owns the conflict-surface\n    // hooks (ADR-0013).\n    let mut registry_worker = RegistryWorker::new(Arc::clone(&registry), paths, &cadence);\n    let mut notif_worker = NotifWorker::new(paths, &cadence);\n    let mut sync_worker = SyncWorker::new(Arc::clone(&registry), paths, &cadence, hooks);\n    let mut update_worker = UpdateWorker::new(Arc::clone(&registry), paths, &cadence, full_auto_update);\n    let mut workers: [&mut dyn PumpWorker; 4] = [\n        &mut registry_worker,\n        &mut notif_worker,\n        &mut sync_worker,\n        &mut update_worker,\n    ];\n    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\n    // `workers`. `None` = never run yet → due immediately, so the first tick\n    // primes every leg. Never `Instant - Duration` — the underflow panic on a\n    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\n    let mut last: [Option<Instant>; 4] = [None; 4];\n    let mut last_hb: Option<Instant> = None;\n\n    while !stop.load(Ordering::Relaxed) {\n        let now = Instant::now();\n        // Shell-owned liveness heartbeat (M8 decision 23, REQ-DAEMON-5): written\n        // while the loop is ALIVE — including idle ticks — never per work round,\n        // so a wedged step and a healthy quiet pump are distinguishable.\n        // Throttled; per-tick, never a worker (REQ-DAEMON-5), no wake.\n        // [impl->REQ-DAEMON-5]\n        if due(last_hb, false, now, HEARTBEAT_PERIOD) {\n            write_heartbeat(&paths.heartbeat);\n            last_hb = Some(now);\n        }\n        // Poll every worker's wake and decide due (the pure scheduler step):\n        // every wake is consumed EVERY tick so a marker is never stranded (the\n        // registry advertise-now, REQ-CONV-2; the sync freshness pull,\n        // REQ-INST-3). The take IS the remove — one wake claims exactly one\n        // forced round.\n        let (due_flags, any_due) = compute_due(&mut workers, &last, now);\n        if !any_due {\n            thread::sleep(TICK);\n            continue;\n        }\n\n        // Per-round shared loads (§Frozen-3): subnets / attachment /\n        // roster-backed policy, read ONCE and handed to every worker.\n        let ctx = RoundCtx::load(paths);\n\n        // Each due worker's node-local pre_round, once per round before ANY\n        // peer_step (only the registry leg does work here — its sweep +\n        // advertise; the rest default to a no-op).\n        pre_rounds(&mut workers, &due_flags, &ctx);\n\n        // ── PUMP-TRUTH W2 round (REQ-PUMP-PEER-ISOLATION) — concurrent dials +\n        // per-peer fault isolation. Group this round's fan-out targets by peer (a\n        // peer may target several subnets; one conn serves them all).\n        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\n        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\n            peer_subnets.entry(peer_hex).or_default().push(sub_name);\n        }\n        // Health targets = this round's fan-out set; snapshot the registry\n        // host's last-admitted stamp while here (REQ-PUMP-STAGE-TRUTH).\n        health.set_targets(peer_subnets.keys().cloned(), now_ms());\n        health.note_registry_admit(registry.last_admit_ms());\n        let round_start = Instant::now();\n        let mut pending: HashSet<String> = HashSet::new();\n\n        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\n        // legs NOW for already-connected ones. The live peer advertises without\n        // waiting on a dead one (no head-of-line block) — a dead peer is only a\n        // pending outcome, never a serial blocker.\n        for (peer_hex, subs) in &peer_subnets {\n            if let Some(&conn_id) = conns.get(peer_hex) {\n                run_peer_subnets(\n                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    conn_id, subs, peer_hex, &ctx, round_start,\n                )?;\n            } else if peer_eligible(&sched, peer_hex, round_start) {\n                if let Some(addr) =\n                    resolve_submit_addr(&resolver, peer_hex, &paths.peer_addrs, &ctx.policy.roster)\n                {\n                    match brain.submit_dial(addr) {\n                        Ok(()) => {\n                            pending.insert(peer_hex.clone());\n                        }\n                        // A raw carrier-op TimedOut on the submit IPC itself is a\n                        // genuine broker-IPC desync → bubble → supervised restart.\n                        Err(e) if e.kind() == io::ErrorKind::TimedOut => return Err(e),\n                        // The broker refused the submit (net disabled / bad addr):\n                        // an ordinary per-peer failure — back off, round continues.\n                        Err(e) => {\n                            eprintln!(\n                                \"PUMP_PEER_FAIL:{peer_hex}:{e} wall_ms={} mono_ms={}\",\n                                now_ms(),\n                                mono_ms()\n                            );\n                            health.note_failed(peer_hex, \"submit\", conns.len(), now_ms());\n                            let prev = sched.get(peer_hex).copied();\n                            sched.insert(peer_hex.clone(), next_peer_backoff(prev, round_start));\n                        }\n                    }\n                } else {\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\n                    // `address-resolution`). Transition-logged: the first\n                    // unroutable round per peer is loud, repeats are quiet —\n                    // the peer retries on its own cadence like before.\n                    if health.note_failed(\n                        peer_hex,\n                        crate::seedproofx::STAGE_RESOLVE,\n                        conns.len(),\n                        now_ms(),\n                    ) {\n                        eprintln!(\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\n                            crate::seedproofx::STAGE_RESOLVE,\n                            now_ms(),\n                            mono_ms()\n                        );\n                    }\n                }\n            }\n        }\n\n        // Drain dial outcomes on the DEDICATED event carrier until the round\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\n        // restarts the pump; a dead PEER never does).\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\n        loop {\n            let read_deadline = if pending.is_empty() {\n                Instant::now() // no outstanding submits — sweep only what is queued\n            } else {\n                round_deadline\n            };\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\n                DrainStep::Apply(ev) => handle_presence_event(\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\n                )?,\n                DrainStep::Skip => continue, // the event carrier only carries presence\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\n            }\n        }\n\n        // Persist the round's reachability truth for the status surfaces\n        // (REQ-PUMP-STAGE-TRUTH: the acceptance surface of this contract).\n        health.save_to(&health_path);\n\n        // Mark-after-round with a POST-round instant (ADR-0018 §V4: the\n        // stagger — ran = ATTEMPTED, not succeeded; the next due is measured\n        // from here, not from the round's start).\n        mark_ran(&mut last, &due_flags, Instant::now());\n    }\n    Ok(())\n}\n\n/// Compute each worker's due flag for this tick (the pure scheduler step):\n/// poll EVERY worker's wake first — even a not-otherwise-due leg, so a marker\n/// is never stranded — then the [`due`] kernel over its RAM-only last-ran\n/// instant. Returns the per-worker flags (parallel to `workers`) and whether\n/// ANY leg is due (an all-idle tick sleeps without loading a round).\nfn compute_due(\n    workers: &mut [&mut dyn PumpWorker],\n    last: &[Option<Instant>],\n    now: Instant,\n) -> (Vec<bool>, bool) {\n    let mut flags = vec![false; workers.len()];\n    let mut any = false;\n    for i in 0..workers.len() {\n        let wake = workers[i].poll_wake();\n        flags[i] = due(last[i], wake, now, workers[i].cadence());\n        any |= flags[i];\n    }\n    (flags, any)\n}\n\n/// Run each due worker's node-local `pre_round` ONCE for the round, before any\n/// peer_step (the registry sweep + advertise; the other legs default no-op).\nfn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n    for i in 0..workers.len() {\n        if due_flags[i] {\n            workers[i].pre_round(ctx);\n        }\n    }\n}"}],"details":{"displayContent":{"text":"//! Outbound peer pump (D9-1-2) — the production trigger loops every D5–D8\n//! slice deferred (\"rides D9 with the daemon lifecycle\").\n//!\n//! One daemon-hosted loop — *the* peer pump — is a pure scheduler + per-peer\n//! fan-out over four [`PumpWorker`] legs. The pump owns *when* (each worker's\n//! cadence + its wake markers, fed to the pure [`due`] kernel) and *toward\n//! whom* (every roster member of every non-detached member subnet); each worker\n//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin\n//! call over an already-shipped, idempotent driver. The four legs, in fan-out\n//! order, each in its own module:\n//!\n//! - **registry push** ([`registry`], [`RegistryHost::advertise_local`] → one\n//!   feed stream per peer): the node re-advertises its own rows; peers\n//!   reconverge within one cadence (replay-is-recovery, the D4d/D8 push\n//!   posture). Mesh-D6 widened the push target from the directly-paired set to\n//!   ALL roster members — a wider DIRECT fan-out, never a relay (REQ-MESH-3).\n//!   Own rows only — a relayed third-party row would carry an origin the\n//!   receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10), so every row still\n//!   arrives from its author over a handshake.\n//! - **notif push** ([`notif`], [`crate::notifsync::emit_notif_feed`]): the\n//!   full semilattice spool per subnet; the receiver's join dedups.\n//! - **sync pull** ([`sync`], [`crate::sync::request_sync`]): anti-entropy for\n//!   the minds. Want-refs are the union of [`crate::sync::select_refs`]\n//!   (locally tracked branches the policy allows toward the peer) and\n//!   **registry-derived** `a-<id>` refs (endpoints known in the shared\n//!   subnets — how a fresh instance bootstraps a mind it has never held), both\n//!   gated by the same [`SyncPolicy::allows`] the responder enforces (symmetric\n//!   scoping).\n//! - **update pull** ([`update`], [`crate::propagate::request_update`]): the\n//!   peer-propagated self-update (REQ-UPD-1), consent-gated by default\n//!   (REQ-UPD-4), with typed convergence outcomes (REQ-UPD-6).\n//!\n//! The scheduler kernels are pure and unit-tested with scripted workers (the\n//! choreography table below): [`compute_due`] (prime-all / wake-forces-one),\n//! [`pre_rounds`] (once per due round, before any peer_step), [`run_due`]\n//! (abort-on-first-fail), [`mark_ran`] (the §V4 stagger), [`fan_targets`]\n//! (detached-skip). LLM-bearing work is never a [`PumpWorker`] (KNOWN-HAZARDS\n//! 7.4) — see the trait's contract.\n//!\n//! Conflicts a pull surfaces are reported through [`PumpHooks::on_pull`] —\n//! the default production hook logs them loud. The bounded Psyche reconcile\n//! turn itself still runs at the activation paths (ADR-0013): the daemon\n//! does not yet host per-agent manifest runtimes (the 7.4 fan-out), so an\n//! in-pump turn has no runtime to ride; conflict artifacts persist safely\n//! meanwhile (REQ-HAZARD-CONFLICT-BOTH-PRESERVED).\n//!\n//! ## Wire discipline (inherited from the test suites, now production)\n//!\n//! Every pump write is fire-and-forget (`op_id: None`) — a journaled\n//! `net_stream_send` blocks on its ack and DISCARDS interleaved events\n//! (gotcha #1). Stream opens for push feeds carry no op either: the feeds\n//! are idempotent by construction. The sync pull's `open_op` IS durable\n//! (exactly-once open identity), minted from a dedicated [`EpochSource`]\n//! file so a daemon restart can never reuse one.\n//!\n//! Per-leg wire-discipline evidence lives with each worker now: registry push\n//! ([`registry`], REQ-INST-7), notif push ([`notif`], REQ-NOTIF-1), sync pull\n//! ([`sync`], REQ-INST-5).\n\nuse std::collections::{HashMap, HashSet};\nuse std::io;\nuse std::path::PathBuf;\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::Arc;\nuse std::thread;\nuse std::time::{Duration, Instant};\n\nuse spt_net::net::endpoint::addr_for_node_hex;\nuse spt_store::epoch::EpochSource;\nuse spt_store::peeraddrs::PeerAddrStore;\nuse spt_store::perch;\nuse spt_store::subnet::SubnetStore;\nuse spt_store::visibility::VisibilityStore;\n\nuse crate::brain::{Brain, BrokerEvent, PEER_REPLY_READ_BUDGET};\nuse crate::config::DaemonConfig;\nuse crate::effect::{Minter, MintedOp};\nuse crate::msg::{\n    NetPresenceEvent, PRESENCE_CONNECTED, PRESENCE_DIAL_FAILED, PRESENCE_DISCONNECTED,\n};\nuse crate::registryhost::RegistryHost;\nuse crate::sync::{SyncPolicy, SyncPullReport};\n\npub mod health;\nuse health::PumpHealth;\n\nmod notif;\nmod registry;\nmod sync;\nmod update;\nuse notif::NotifWorker;\nuse registry::RegistryWorker;\nuse sync::SyncWorker;\nuse update::UpdateWorker;\n\n/// The pump's tick granularity — each cadence fires when its period elapsed.\nconst TICK: Duration = Duration::from_millis(200);\n\n/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall\n/// warning reads 3-cadence staleness, so a few seconds of heartbeat\n/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\nconst HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\n\n/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\n/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\n/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either\n/// way). A read that exceeds this is treated as a poisoned client and\n/// escalated to a supervised restart, NEVER a per-peer retry.\nconst PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);\n\n/// Supervisor backoff floor: the first restart after a pump death.\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Supervisor backoff cap (M8 decision 23): a persistently-crashing pump\n/// retries at most every 5 minutes — visible, bounded, never silent.\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);\n\n/// A run that survived this long before dying counts as healthy — the next\n/// backoff resets to the floor instead of doubling (a once-a-day panic must\n/// not ratchet the pump toward permanent 5-minute outages).\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);\n\n/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the\n/// first failed dial to a peer waits this long before the pump re-dials THAT\n/// peer. Scoped to the peer — a dead peer backs off while live peers stay hot.\nconst PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most\n/// every 5 minutes (same bound as the supervisor) — bounded, never a hot redial\n/// loop, never silent. Reset to the floor on any successful connect.\nconst PEER_BACKOFF_CAP: Duration = Duration::from_secs(300);\n\n/// Round-drain margin over W1's per-dial reply-read budget (G3, Q1): because the\n/// dials are CONCURRENT, every outcome lands within ~one W1 bound, so the round\n/// closes shortly after it. Derived symbolically from\n/// [`PEER_REPLY_READ_BUDGET`] (not a hardcoded 12s) so it tracks any W1 retune.\nconst ROUND_DRAIN_MARGIN: Duration = Duration::from_secs(2);\n\n/// Per-peer dial schedule (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): a peer is\n/// dial-eligible when `now >= next_due`. A `DIAL_FAILED` (or a mid-round\n/// `peer_step` failure — Q3) doubles `backoff` (capped [`PEER_BACKOFF_CAP`]) and\n/// pushes `next_due` out; a successful connect drops the entry (reset). Kept in a\n/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n/// supervised restart like `WorkerLasts`.\n#[derive(Clone, Copy, Debug)]\nstruct PeerSched {\n    next_due: Instant,\n    backoff: Duration,\n}\n\n/// The next per-peer backoff after a failed dial (pure, unit-tested): the first\n/// failure waits [`PEER_BACKOFF_BASE`]; each subsequent failure doubles, capped\n/// at [`PEER_BACKOFF_CAP`]. `next_due = now + backoff`.\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn next_peer_backoff(prev: Option<PeerSched>, now: Instant) -> PeerSched {\n    let backoff = match prev {\n        None => PEER_BACKOFF_BASE,\n        Some(p) => p.backoff.saturating_mul(2).min(PEER_BACKOFF_CAP),\n    };\n    PeerSched {\n        next_due: now + backoff,\n        backoff,\n    }\n}\n\n/// Whether a peer may be dialed this round (pure): a peer with no schedule entry\n/// (never failed, or just reset by a success) is always eligible; one in backoff\n/// is eligible only once `next_due` has passed.\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn peer_eligible(sched: &HashMap<String, PeerSched>, peer_hex: &str, now: Instant) -> bool {\n    sched.get(peer_hex).is_none_or(|s| now >= s.next_due)\n}\n\n/// The outcome of ONE events-carrier drain read (PUMP-TRUTH W2). Pulled out of the\n/// round loop so the load-bearing dead-carrier classification is a UNIT fact.\nenum DrainStep {\n    /// A presence event to apply to per-peer state.\n    Apply(NetPresenceEvent),\n    /// A non-presence frame on the event carrier — ignore, keep draining.\n    Skip,\n    /// A quiet read (`TimedOut`): no more outcomes available now → close the round.\n    RoundDone,\n    /// A dead CARRIER (any non-`TimedOut` read error — the broker stopped answering\n    /// the stream: reader-thread `UnexpectedEof`/`BrokenPipe` on a closed conn).\n    /// The re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: bubble to a supervised restart.\n    Restart(io::Error),\n}\n\n/// Classify one events-carrier drain read (PUMP-TRUTH W2, the re-pointed\n/// REQ-HAZARD-PUMP-IPC-DEADLINE). This is THE guard on the decouple: a dead PEER\n/// never reaches here (its failure is an ordinary `PRESENCE_DIAL_FAILED` event or\n/// a reclassified per-peer drop), but a dead BROKER — the event carrier itself\n/// going silent — MUST still bubble to a supervised restart. `TimedOut` is the\n/// benign \"no outcome available this instant\" (round closes on its deadline); any\n/// OTHER read error is the carrier dying and MUST NOT be swallowed as quiet.\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n// [impl->REQ-PUMP-PEER-ISOLATION]\nfn classify_drain_read(read: io::Result<BrokerEvent>) -> DrainStep {\n    match read {\n        Ok(BrokerEvent::NetPresence(ev)) => DrainStep::Apply(ev),\n        Ok(_) => DrainStep::Skip,\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => DrainStep::RoundDone,\n        Err(e) => DrainStep::Restart(e),\n    }\n}\n\n/// Resolve a trusted peer's stable name (lowercase-hex pubkey) to a dialable\n/// address (the serde JSON `net-dial` carries). Production resolution lets\n/// discovery do the work ([`production_resolver`]); hermetic tests inject a\n/// concrete address map (loopback endpoints run no discovery).\npub type PeerResolver = Box<dyn Fn(&str) -> Option<serde_json::Value> + Send>;\n\n/// The production resolver: an id-only iroh address — mDNS on the LAN, n0\n/// DNS on the WAN (`addr_for_node_hex`).\npub fn production_resolver() -> PeerResolver {\n    Box::new(|hex| addr_for_node_hex(hex).and_then(|a| serde_json::to_value(a).ok()))\n}\n\n/// Where this node's pump-side stores live. Production = the canonical\n/// SPT_HOME layout; the loopback E2E gives its in-process \"node\" distinct\n/// roots so two nodes can share one test process.\npub struct PumpPaths {\n    /// The perch tree (registry advertisement scan).\n    pub owlery: PathBuf,\n    /// The context store root ([`ContextStore::open_or_init_in`]).\n    pub ctx_root: PathBuf,\n    /// The notif spool DB ([`NotifStore::open_at`]).\n    pub notif_db: PathBuf,\n    /// Transient pull scratch.\n    pub scratch: PathBuf,\n    /// `subnet.json` ([`SubnetStore::load_from`]).\n    pub subnets: PathBuf,\n    /// `visibility.json` ([`VisibilityStore::load_from`]).\n    pub vis: PathBuf,\n    /// The pump's durable open-op counter (its own file — colliding with the\n    /// registry's advertisement epochs would break neither, but a shared\n    /// in-memory cursor pair over one file double-mints; separate files keep\n    /// each `EpochSource` the sole writer of its counter).\n    pub ops: PathBuf,\n    /// The staged-release cache dir ([`ReleaseCache::open`]).\n    pub releases: PathBuf,\n    /// `release-keys.json` ([`VerifyPolicy::load_from`]).\n    pub release_keys: PathBuf,\n    /// The wake-edge freshness-pull marker (D9-2, REQ-INST-3): a\n    /// dormant→active transition drops it; the pump consumes it and forces a\n    /// sync round NOW instead of waiting out `cadence.sync`\n    /// ([`crate::resting::PULL_MARKER_FILE`]).\n    pub pull_marker: PathBuf,\n    /// The event-driven advertisement marker (M8 decision 15, REQ-CONV-2):\n    /// an endpoint online/offline transition drops it; the pump consumes it\n    /// and forces a registry round NOW instead of waiting out\n    /// `cadence.registry` ([`crate::registryhost::ADVERTISE_MARKER_FILE`]).\n    pub advertise_marker: PathBuf,\n    /// `peer-addrs.json` — last-known peer addresses (M8 decisions 14/20,\n    /// REQ-CONV-1): consulted before id-only discovery, written back after\n    /// every successful dial ([`spt_store::peeraddrs::PeerAddrStore`]).\n    pub peer_addrs: PathBuf,\n    /// The pump's last-tick heartbeat (M8 decision 23, REQ-DAEMON-5):\n    /// epoch-ms written while the loop is alive, rendered by\n    /// `spt daemon status` / the `subnet status` stall warning\n    /// ([`crate::endpoint::pump_heartbeat_path`]).\n    pub heartbeat: PathBuf,\n    /// `rotation-pending.json` (Mesh-D7, REQ-MESH-4): the timeboxed seed-rotation\n    /// schedule a `subnet revoke` writes; the pump fires due entries each\n    /// registry tick ([`spt_store::rotation::RotationPending`]).\n    pub rotations: PathBuf,\n}\n\nimpl PumpPaths {\n    /// The canonical SPT_HOME layout.\n    pub fn production() -> PumpPaths {\n        let home = perch::spt_home();\n        let identity = perch::identity_dir();\n        PumpPaths {\n            owlery: perch::owlery_dir(),\n            ctx_root: home.join(\"context\"),\n            notif_db: identity.join(\"notifs.db\"),\n            scratch: home.join(\"scratch\").join(\"pump\"),\n            subnets: identity.join(\"subnet.json\"),\n            vis: identity.join(\"visibility.json\"),\n            ops: identity.join(\"pump-ops.json\"),\n            releases: home.join(\"releases\"),\n            release_keys: identity.join(\"release-keys.json\"),\n            pull_marker: identity.join(crate::resting::PULL_MARKER_FILE),\n            advertise_marker: identity.join(crate::registryhost::ADVERTISE_MARKER_FILE),\n            peer_addrs: identity.join(\"peer-addrs.json\"),\n            heartbeat: crate::endpoint::pump_heartbeat_path(),\n            rotations: identity.join(\"rotation-pending.json\"),\n        }\n    }\n}\n\n/// Pump cadences (config-driven in production: [`DaemonConfig`]).\n#[derive(Debug, Clone, Copy)]\npub struct PumpCadence {\n    pub registry: Duration,\n    pub notif: Duration,\n    pub sync: Duration,\n    pub update: Duration,\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10): swept each\n    /// registry tick, before re-advertisement.\n    pub registry_evict_after: Duration,\n}\n\nimpl PumpCadence {\n    /// From the daemon config knobs.\n    pub fn from_config(cfg: &DaemonConfig) -> PumpCadence {\n        PumpCadence {\n            registry: cfg.registry_pump_period,\n            notif: cfg.notif_pump_period,\n            sync: cfg.sync_pull_period,\n            update: cfg.update_check_period,\n            registry_evict_after: cfg.registry_evict_after,\n        }\n    }\n}\n\n/// The pump's resolved knobs: cadences + the REQ-UPD-4 consent stance.\n#[derive(Debug, Clone, Copy)]\npub struct PumpConfig {\n    pub cadence: PumpCadence,\n    /// `true` = the explicit opt-in to prompt-free updates; default `false`\n    /// surfaces every staged release as a consent notif.\n    pub full_auto_update: bool,\n}\n\nimpl PumpConfig {\n    /// From the daemon config knobs.\n    pub fn from_config(cfg: &DaemonConfig) -> PumpConfig {\n        PumpConfig {\n            cadence: PumpCadence::from_config(cfg),\n            full_auto_update: cfg.full_auto_update,\n        }\n    }\n}\n\n/// A pull observer: `(peer_hex, report)` after every completed sync pull.\npub type OnPull = Box<dyn FnMut(&str, &SyncPullReport) + Send>;\n\n/// Observation hooks. `on_pull` fires after every completed sync pull —\n…\nimpl PeerIo<'_> {\n…\n    /// open identity — a restart can never reuse one), tagged with the `pump`\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\n    fn open_op(&mut self) -> io::Result<MintedOp> {\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\n    }\n}\n\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\n/// per-peer connection cache (an IO failure against a peer drops its cache\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\n/// because the broker's closed-watcher reaps dead conns).\n///\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n/// logic lives here — the shell owns only *when* and *toward whom*.\npub fn run_peer_pump(\n    broker_name: &str,\n    registry: Arc<RegistryHost>,\n    paths: &PumpPaths,\n    resolver: PeerResolver,\n    config: PumpConfig,\n    hooks: PumpHooks,\n    stop: &AtomicBool,\n) -> io::Result<()> {\n    let PumpConfig {\n        cadence,\n        full_auto_update,\n    } = config;\n    // PUMP MODE: a brain whose carrier is SPLIT at construction (reader thread +\n    // channel) so every reply read is bounded by PUMP_PEER_IO_TIMEOUT — a\n    // black-holed peer can never wedge this single-threaded loop (the 2.2h\n    // hfenduleam stall). A timed-out read escalates to a supervised restart\n    // below, never a per-peer retry (REQ-HAZARD-PUMP-IPC-DEADLINE).\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    let mut brain = connect(broker_name)?;\n    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\n    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n    // whose reply-reads consume every event kind off their carrier; sharing one\n    // carrier would make a pull-read swallow a presence frame (advancing the\n    // exactly-once cursor while dropping the outcome — the D4c break). Two\n    // carriers keep the drain and the pulls from swallowing each other by\n    // construction. Tail-follow (no history replay, baseline on first live event)\n    // so a long-lived broker's evicted ring can never gap-trip a false restart.\n    let mut events = connect(broker_name)?;\n    events.net_presence_subscribe_tail()?;\n    // Startup reconcile + invariant migration (ADR-0039 Decisions 3+4,\n    // REQ-PEER-ROUTE-CHAIN / REQ-PEERADDR-INVARIANT): validated roster\n    // addresses reconcile into the dial cache BEFORE the first round —\n    // recovery is connection-independent (a node restarted mid-strand heals\n    // here, no operator surgery) — and rows violating `outer key ==\n    // address.id` are repaired from the roster or dropped loudly (the first\n    // post-upgrade load is the migration; the file is never bare-deleted —\n    // valid rows and the id-only fallback behind them stay untouched).\n    // Idempotent, so re-running on every supervised pump restart is free.\n    startup_reconcile_peeraddrs(paths, registry.node_hex());\n    // Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded\n    // so the last-good stamps survive a restart; the live counts re-prime as\n    // rounds run. Persisted beside the heartbeat; the status CLI reads it.\n    let health_path = PumpHealth::path_beside(&paths.heartbeat);\n    let mut health = PumpHealth::load_from(&health_path);\n    health.note_disconnected(0); // no conns exist yet in this pump generation\n    let mut ops = EpochSource::load_from(&paths.ops);\n    // The live per-peer connection cache (updated by presence events) + the\n    // per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.\n    let mut conns: HashMap<String, u64> = HashMap::new();\n    let mut sched: HashMap<String, PeerSched> = HashMap::new();\n    // The four cadenced legs behind the worker seam, in fan-out order\n    // (registry → notif → sync → update). The shell drives them generically;\n    // each leg's *what* lives in its module (§Frozen). Construction capture\n    // (§Frozen-4): each worker owns the registry Arc / path slices / config\n    // knob it needs — the sync worker additionally owns the conflict-surface\n    // hooks (ADR-0013).\n    let mut registry_worker = RegistryWorker::new(Arc::clone(&registry), paths, &cadence);\n    let mut notif_worker = NotifWorker::new(paths, &cadence);\n    let mut sync_worker = SyncWorker::new(Arc::clone(&registry), paths, &cadence, hooks);\n    let mut update_worker = UpdateWorker::new(Arc::clone(&registry), paths, &cadence, full_auto_update);\n    let mut workers: [&mut dyn PumpWorker; 4] = [\n        &mut registry_worker,\n        &mut notif_worker,\n        &mut sync_worker,\n        &mut update_worker,\n    ];\n    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\n    // `workers`. `None` = never run yet → due immediately, so the first tick\n    // primes every leg. Never `Instant - Duration` — the underflow panic on a\n    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\n    let mut last: [Option<Instant>; 4] = [None; 4];\n    let mut last_hb: Option<Instant> = None;\n\n    while !stop.load(Ordering::Relaxed) {\n        let now = Instant::now();\n        // Shell-owned liveness heartbeat (M8 decision 23, REQ-DAEMON-5): written\n        // while the loop is ALIVE — including idle ticks — never per work round,\n        // so a wedged step and a healthy quiet pump are distinguishable.\n        // Throttled; per-tick, never a worker (REQ-DAEMON-5), no wake.\n        // [impl->REQ-DAEMON-5]\n        if due(last_hb, false, now, HEARTBEAT_PERIOD) {\n            write_heartbeat(&paths.heartbeat);\n            last_hb = Some(now);\n        }\n        // Poll every worker's wake and decide due (the pure scheduler step):\n        // every wake is consumed EVERY tick so a marker is never stranded (the\n        // registry advertise-now, REQ-CONV-2; the sync freshness pull,\n        // REQ-INST-3). The take IS the remove — one wake claims exactly one\n        // forced round.\n        let (due_flags, any_due) = compute_due(&mut workers, &last, now);\n        if !any_due {\n            thread::sleep(TICK);\n            continue;\n        }\n\n        // Per-round shared loads (§Frozen-3): subnets / attachment /\n        // roster-backed policy, read ONCE and handed to every worker.\n        let ctx = RoundCtx::load(paths);\n\n        // Each due worker's node-local pre_round, once per round before ANY\n        // peer_step (only the registry leg does work here — its sweep +\n        // advertise; the rest default to a no-op).\n        pre_rounds(&mut workers, &due_flags, &ctx);\n\n        // ── PUMP-TRUTH W2 round (REQ-PUMP-PEER-ISOLATION) — concurrent dials +\n        // per-peer fault isolation. Group this round's fan-out targets by peer (a\n        // peer may target several subnets; one conn serves them all).\n        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\n        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\n            peer_subnets.entry(peer_hex).or_default().push(sub_name);\n        }\n        // Health targets = this round's fan-out set; snapshot the registry\n        // host's last-admitted stamp while here (REQ-PUMP-STAGE-TRUTH).\n        health.set_targets(peer_subnets.keys().cloned(), now_ms());\n        health.note_registry_admit(registry.last_admit_ms());\n        let round_start = Instant::now();\n        let mut pending: HashSet<String> = HashSet::new();\n\n        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\n        // legs NOW for already-connected ones. The live peer advertises without\n        // waiting on a dead one (no head-of-line block) — a dead peer is only a\n        // pending outcome, never a serial blocker.\n        for (peer_hex, subs) in &peer_subnets {\n            if let Some(&conn_id) = conns.get(peer_hex) {\n                run_peer_subnets(\n                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    conn_id, subs, peer_hex, &ctx, round_start,\n                )?;\n            } else if peer_eligible(&sched, peer_hex, round_start) {\n                if let Some(addr) =\n                    resolve_submit_addr(&resolver, peer_hex, &paths.peer_addrs, &ctx.policy.roster)\n                {\n                    match brain.submit_dial(addr) {\n                        Ok(()) => {\n                            pending.insert(peer_hex.clone());\n                        }\n                        // A raw carrier-op TimedOut on the submit IPC itself is a\n                        // genuine broker-IPC desync → bubble → supervised restart.\n                        Err(e) if e.kind() == io::ErrorKind::TimedOut => return Err(e),\n                        // The broker refused the submit (net disabled / bad addr):\n                        // an ordinary per-peer failure — back off, round continues.\n                        Err(e) => {\n                            eprintln!(\n                                \"PUMP_PEER_FAIL:{peer_hex}:{e} wall_ms={} mono_ms={}\",\n                                now_ms(),\n                                mono_ms()\n                            );\n                            health.note_failed(peer_hex, \"submit\", conns.len(), now_ms());\n                            let prev = sched.get(peer_hex).copied();\n                            sched.insert(peer_hex.clone(), next_peer_backoff(prev, round_start));\n                        }\n                    }\n                } else {\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\n                    // `address-resolution`). Transition-logged: the first\n                    // unroutable round per peer is loud, repeats are quiet —\n                    // the peer retries on its own cadence like before.\n                    if health.note_failed(\n                        peer_hex,\n                        crate::seedproofx::STAGE_RESOLVE,\n                        conns.len(),\n                        now_ms(),\n                    ) {\n                        eprintln!(\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\n                            crate::seedproofx::STAGE_RESOLVE,\n                            now_ms(),\n                            mono_ms()\n                        );\n                    }\n                }\n            }\n        }\n\n        // Drain dial outcomes on the DEDICATED event carrier until the round\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\n        // restarts the pump; a dead PEER never does).\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\n        loop {\n            let read_deadline = if pending.is_empty() {\n                Instant::now() // no outstanding submits — sweep only what is queued\n            } else {\n                round_deadline\n            };\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\n                DrainStep::Apply(ev) => handle_presence_event(\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\n                )?,\n                DrainStep::Skip => continue, // the event carrier only carries presence\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\n            }\n        }\n\n        // Persist the round's reachability truth for the status surfaces\n        // (REQ-PUMP-STAGE-TRUTH: the acceptance surface of this contract).\n        health.save_to(&health_path);\n\n        // Mark-after-round with a POST-round instant (ADR-0018 §V4: the\n        // stagger — ran = ATTEMPTED, not succeeded; the next due is measured\n        // from here, not from the round's start).\n        mark_ran(&mut last, &due_flags, Instant::now());\n    }\n    Ok(())\n}\n\n/// Compute each worker's due flag for this tick (the pure scheduler step):\n/// poll EVERY worker's wake first — even a not-otherwise-due leg, so a marker\n/// is never stranded — then the [`due`] kernel over its RAM-only last-ran\n/// instant. Returns the per-worker flags (parallel to `workers`) and whether\n/// ANY leg is due (an all-idle tick sleeps without loading a round).\nfn compute_due(\n    workers: &mut [&mut dyn PumpWorker],\n    last: &[Option<Instant>],\n    now: Instant,\n) -> (Vec<bool>, bool) {\n    let mut flags = vec![false; workers.len()];\n    let mut any = false;\n    for i in 0..workers.len() {\n        let wake = workers[i].poll_wake();\n        flags[i] = due(last[i], wake, now, workers[i].cadence());\n        any |= flags[i];\n    }\n    (flags, any)\n}\n\n/// Run each due worker's node-local `pre_round` ONCE for the round, before any\n/// peer_step (the registry sweep + advertise; the other legs default no-op).\nfn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n    for i in 0..workers.len() {\n        if due_flags[i] {\n            workers[i].pre_round(ctx);\n        }\n    }\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,null,492,null,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"}}},"isError":false,"timestamp":1784292947107}}
{"type":"message","id":"1d4640b7","parentId":"097bd4a0","timestamp":"2026-07-17T12:55:47.110Z","message":{"role":"toolResult","toolCallId":"call_hoKO2IuUQLZXQPmCYCBtfWTT|fc_0148993141920bab016a5a265307ec8195a4bc0e81c35a83fd","toolName":"grep","content":[{"type":"text","text":"# crates/spt-store/src/\n## perch.rs\n 24|/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform\n*25|/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).\n 26|/// **Pure** — reads env, composes a path, creates nothing.\n 27|///\n 28|/// The default lives under `spt-core/`, **deliberately distinct from the modern\n...\n 33|// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\n*34|pub fn spt_home() -> PathBuf {\n 35|    if let Ok(over) = std::env::var(\"SPT_HOME\") {\n 36|        if !over.is_empty() {\n 37|            return PathBuf::from(over);\n...\n 44|fn platform_default_spt_home() -> PathBuf {\n*45|    if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {\n 46|        if !local.is_empty() {\n 47|            return PathBuf::from(local).join(\"spt-core\");\n 48|        }\n...\n 50|    let up =\n*51|        std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");\n 52|    PathBuf::from(up)\n 53|        .join(\"AppData\")\n 54|        .join(\"Local\")\n...\n 60|    let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");\n*61|    PathBuf::from(home).join(\".spt-core\")\n 62|}\n 63|\n 64|/// The owlery directory holding all perches: `<spt_home>/owlery/`.\n...\n 686|    #[test]\n*687|    fn spt_home_is_pure_and_honors_env() {\n 688|        let tmp = tempfile::tempdir().unwrap();\n 689|        let target = tmp.path().join(\"does-not-exist-yet\");\n 690|        let _g = EnvGuard::set(&target);"}],"details":{"scopePath":"crates/spt-store/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":6,"fileCount":1,"files":["crates/spt-store/src/perch.rs"],"fileMatches":[{"path":"crates/spt-store/src/perch.rs","count":6}],"truncated":false,"displayContent":"# crates/spt-store/src/\n## perch.rs\n  24│/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform\n *25│/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).\n  26│/// **Pure** — reads env, composes a path, creates nothing.\n  27│///\n  28│/// The default lives under `spt-core/`, **deliberately distinct from the modern\n    │...\n  33│// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\n *34│pub fn spt_home() -> PathBuf {\n  35│    if let Ok(over) = std::env::var(\"SPT_HOME\") {\n  36│        if !over.is_empty() {\n  37│            return PathBuf::from(over);\n    │...\n  44│fn platform_default_spt_home() -> PathBuf {\n *45│    if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {\n  46│        if !local.is_empty() {\n  47│            return PathBuf::from(local).join(\"spt-core\");\n  48│        }\n    │...\n  50│    let up =\n *51│        std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");\n  52│    PathBuf::from(up)\n  53│        .join(\"AppData\")\n  54│        .join(\"Local\")\n    │...\n  60│    let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");\n *61│    PathBuf::from(home).join(\".spt-core\")\n  62│}\n  63│\n  64│/// The owlery directory holding all perches: `<spt_home>/owlery/`.\n    │...\n 686│    #[test]\n*687│    fn spt_home_is_pure_and_honors_env() {\n 688│        let tmp = tempfile::tempdir().unwrap();\n 689│        let target = tmp.path().join(\"does-not-exist-yet\");\n 690│        let _g = EnvGuard::set(&target);"},"isError":false,"timestamp":1784292947109}}
{"type":"message","id":"22e09617","parentId":"1d4640b7","timestamp":"2026-07-17T12:55:47.116Z","message":{"role":"toolResult","toolCallId":"call_E5QPPEHSuP6swBsznbjjctbD|fc_0148993141920bab016a5a265308188195886e0bc01126e750","toolName":"grep","content":[{"type":"text","text":"*1|//! The daemon's live subnet-registry holder (D9-1-2) — REQ-INST-7's\n 2|//! production wiring.\n 3|//!\n*4|//! D3 built the registry **model** (`spt_net::net::registry`: the epoch\n 5|//! lease, the join-time collision check, visibility enforcement) and D4d the\n*6|//! wire record (`RegistryUpdate`), both consumed only by tests. This type is\n*7|//! the daemon-side instance: one in-memory `SubnetRegistry` per member\n 8|//! subnet, fed from two directions —\n 9|//!\n*10|//! - **inbound**: the dispatcher's registry arm applies peer feeds under the\n 11|//!   same fail-closed gate as every replicated store (member subnet ∧ origin\n 12|//!   trusted *in that subnet*, subject = handshake-proven stream origin —\n 13|//!   KNOWN-HAZARDS 7.5);\n*14|//! - **local**: [`advertise_local`](RegistryHost::advertise_local) scans the\n*15|//!   owlery and (re-)advertises every visible self perch with a fresh\n 16|//!   [`EpochSource`] epoch — the per-node monotonic lease key, never\n 17|//!   wall-clock (KNOWN-HAZARDS 4.8).\n 18|//!\n*19|//! The registry is **eventually consistent by re-advertisement**: state is\n 20|//! in-memory (a daemon restart forgets peers' rows), and each pump tick\n 21|//! re-pushes the node's own rows — peers reconverge within one cadence, the\n 22|//! same replay-is-recovery posture as the D8 notif feed. For out-of-process\n 23|//! consumers (`spt send`'s WAN resolution, D9-1-4) the host mirrors each\n*24|//! subnet's registry to an atomic JSON snapshot under\n*25|//! `identity/registry/` — readers tolerate staleness (the 4.3\n 26|//! stale-clean posture), never block on the daemon.\n 27|// [impl->REQ-INST-7]\n 28|\n...\n 33|\n*34|use spt_net::net::registry::{\n*35|    advertise_if_visible, Instance, MergeOutcome, Status, SubnetRegistry,\n 36|};\n*37|use spt_net::net::replicate::{NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate};\n 38|use spt_store::epoch::EpochSource;\n 39|use spt_store::liveness::{is_perch_alive, is_perch_unbound};\n 40|use spt_store::perch::{self, ParentHint};\n...\n 44|\n*45|/// What the host did with one inbound registry record — loud + typed.\n 46|#[derive(Debug, Clone, PartialEq, Eq)]\n*47|pub enum RegistryApplyVerdict {\n 48|    /// Admitted and merged with the stated outcome (the lease may still have\n 49|    /// dropped it as [`MergeOutcome::Stale`] — that IS a merge decision).\n 50|    Merged(MergeOutcome),\n...\n 58|/// without a restart; the access-gate stance shared with sync/notif).\n*59|pub struct RegistryGatePolicy {\n 60|    /// Names of every subnet this node is a member of.\n 61|    pub subnets: Vec<String>,\n 62|    /// The membership directory (Mesh-D5, REQ-MESH-5): authorization is now\n...\n 68|\n*69|impl RegistryGatePolicy {\n 70|    /// Load from the node's canonical stores.\n*71|    pub fn load() -> RegistryGatePolicy {\n 72|        let subnets = SubnetStore::load()\n 73|            .subnets\n 74|            .iter()\n...\n 76|            .collect();\n*77|        RegistryGatePolicy {\n 78|            subnets,\n 79|            roster: RosterStore::load(),\n 80|        }\n...\n 85|    // [impl->REQ-MESH-5]\n*86|    pub fn admits(&self, subnet: &str, origin_node: &str) -> bool {\n 87|        self.subnets.iter().any(|s| s == subnet) && self.roster.is_member(subnet, origin_node)\n 88|    }\n 89|}\n 90|\n*91|/// The daemon's per-subnet registry instances + this node's advertisement\n*92|/// epoch source. Shared (`Arc`) between the dispatcher's registry arm and\n 93|/// the peer pump.\n*94|pub struct RegistryHost {\n 95|    /// This node's stable name (lowercase-hex pubkey).\n 96|    node_hex: String,\n 97|    /// This node's human label (M7 D2, REQ-SUBNET-3): the OS hostname,\n 98|    /// re-read at daemon startup ([`new`](Self::new)) and stamped onto every\n*99|    /// advertised row — a hostname change reaches peers as ordinary\n 100|    /// epoch-bumped updates. Display/addressing sugar; `node_hex` stays the\n 101|    /// identity.\n 102|    node_label: Option<String>,\n 103|    /// This node's hashed stable machine identifier (M8 decision 13/22,\n*104|    /// REQ-SUBNET-7): stamped onto every advertised row beside the label —\n 105|    /// the re-pair overwrite anchor. Already domain-separated-hashed by\n 106|    /// [`crate::machineid`]; never the raw id.\n 107|    machine_id: Option<String>,\n...\n 113|    heard: Mutex<BTreeMap<String, u64>>,\n*114|    /// Wall-clock ms of the LAST admitted inbound registry/label feed from\n*115|    /// ANY origin — the \"last admitted registry update\" health field\n 116|    /// (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): real inbound gossip\n 117|    /// progress, as opposed to `heard`'s per-origin recency. `0` = never.\n 118|    last_admit_ms: std::sync::atomic::AtomicU64,\n*119|    regs: Mutex<BTreeMap<String, SubnetRegistry>>,\n 120|    /// The node's one durable monotonic counter (the D3b lease source) — the\n 121|    /// epoch on every locally-authored instance row.\n 122|    epoch: Mutex<EpochSource>,\n*123|    /// Where snapshots land (`identity/registry/<subnet>.json`).\n 124|    snapshot_dir: PathBuf,\n 125|    /// How many times [`write_snapshots`](Self::write_snapshots) ran this\n*126|    /// process — the REQ-REGISTRY-APPLY-TRANSACTIONAL observable: a feed\n 127|    /// applied transactionally writes ONCE per feed (bounded batches: once\n 128|    /// per batch), never once per chunk × record-kind (the KH 7.44 write\n 129|    /// amplification that stalled the brain's IPC drain).\n...\n 132|\n*133|impl RegistryHost {\n 134|    /// Stand the host up for this node, with the canonical epoch counter and\n 135|    /// snapshot dir under the spt home. Reads the OS hostname here — daemon\n 136|    /// startup IS the label's re-check point (REQ-SUBNET-3).\n*137|    pub fn new(node_hex: &str) -> RegistryHost {\n*138|        RegistryHost::new_at(\n 139|            node_hex,\n 140|            EpochSource::load(),\n*141|            perch::identity_dir().join(\"registry\"),\n 142|        )\n 143|        .with_node_label(spt_store::hostlabel::os_hostname())\n 144|        .with_machine_id(crate::machineid::machine_id_hash())\n...\n 149|    /// stay hostname-independent; chain [`with_node_label`](Self::with_node_label).\n*150|    pub fn new_at(node_hex: &str, epoch: EpochSource, snapshot_dir: PathBuf) -> RegistryHost {\n*151|        RegistryHost {\n 152|            node_hex: node_hex.to_string(),\n 153|            node_label: None,\n 154|            machine_id: None,\n...\n 165|    /// the transactional-apply unit/int observable (KH 7.44).\n*166|    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*167|    pub fn snapshot_write_count(&self) -> u64 {\n 168|        self.snapshot_writes\n 169|            .load(std::sync::atomic::Ordering::Relaxed)\n 170|    }\n 171|\n*172|    /// Set the label this host stamps onto every advertised row.\n 173|    // [impl->REQ-SUBNET-3]\n*174|    pub fn with_node_label(mut self, label: Option<String>) -> RegistryHost {\n 175|        self.node_label = label;\n 176|        self\n 177|    }\n...\n 179|    /// Set the hashed machine identifier this host stamps onto every\n*180|    /// advertised row (M8 decision 13/22, REQ-SUBNET-7).\n 181|    // [impl->REQ-SUBNET-7]\n*182|    pub fn with_machine_id(mut self, machine_id: Option<String>) -> RegistryHost {\n 183|        self.machine_id = machine_id;\n 184|        self\n 185|    }\n...\n 187|    /// This node's stable name.\n*188|    pub fn node_hex(&self) -> &str {\n 189|        &self.node_hex\n 190|    }\n 191|\n*192|    /// Every advertised [`Instance`] this host knows for `endpoint_id`, across\n*193|    /// all of its per-subnet registries (the WAN user-msg origin resolver reads\n 194|    /// these and keys by the proven node — REQ-MSG-6). Cloned out so the lock\n 195|    /// is released before the caller inspects the rows. The same id can hold\n*196|    /// rows on several nodes / in several subnets; the resolver filters to the\n 197|    /// QUIC-proven origin node.\n 198|    // [impl->REQ-MSG-6]\n*199|    pub fn instances_of(&self, endpoint_id: &str) -> Vec<Instance> {\n 200|        self.regs\n 201|            .lock()\n 202|            .unwrap()\n...\n 209|    /// monotonic counter (identity/epoch.json) behind every locally-authored\n*210|    /// registry row. Every other per-node-id producer on this node MUST mint\n 211|    /// from the same source, or `node:epoch`-shaped ids collide: a notif_id is\n 212|    /// `node_hex:epoch`, so the pump's consent-notif producer and the CLI\n 213|    /// notify front door (which loads this same canonical source) would\n...\n 219|    /// constraint failed: notifs.notif_id`.) Locks the shared cursor so the\n*220|    /// dispatcher's registry arm and the pump never double-mint.\n*221|    // [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\n*222|    pub fn with_epoch<R>(&self, f: impl FnOnce(&mut EpochSource) -> R) -> R {\n 223|        f(&mut self.epoch.lock().unwrap())\n 224|    }\n 225|\n...\n 229|    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n*230|    pub fn apply_feed(\n 231|        &self,\n 232|        origin_node: &str,\n*233|        updates: &[RegistryUpdate],\n*234|        policy: &RegistryGatePolicy,\n*235|    ) -> Vec<RegistryApplyVerdict> {\n 236|        self.apply_feed_flips(origin_node, updates, policy).0\n 237|    }\n 238|\n...\n 242|    /// that another instance of the id just became the driven one (its\n*243|    /// daemon advertises transitions epoch-bumped), which rests a local\n 244|    /// instance of the same id warm (CONTEXT: driving `ling@laptop` makes\n 245|    /// `ling@desktop` dormant).\n 246|    ///\n...\n 248|    /// and the incoming one is. Deliberately **never `Inserted`**: this\n*249|    /// registry is in-memory, so a daemon restart re-inserts every peer row\n 250|    /// at its *current* status — counting inserts would knock local\n 251|    /// instances dormant on every restart; and never the periodic\n*252|    /// re-advertisement (`Updated` with prev already `Active` is not a\n 253|    /// flip). The lease has already dropped stale/equal epochs before any\n 254|    /// of this runs.\n 255|    // [impl->REQ-INST-3]\n*256|    pub fn apply_feed_flips(\n 257|        &self,\n 258|        origin_node: &str,\n*259|        updates: &[RegistryUpdate],\n*260|        policy: &RegistryGatePolicy,\n*261|    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n 262|        let mut admitted_any = false;\n 263|        let mut flips: Vec<String> = Vec::new();\n 264|        let verdicts = {\n...\n 283|    /// PER RECORD in both shapes; only the snapshot-write cadence differs.\n*284|    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n 285|    #[allow(clippy::too_many_arguments)]\n 286|    fn merge_instances_locked(\n 287|        &self,\n*288|        regs: &mut BTreeMap<String, SubnetRegistry>,\n 289|        origin_node: &str,\n*290|        updates: &[RegistryUpdate],\n*291|        policy: &RegistryGatePolicy,\n 292|        admitted_any: &mut bool,\n 293|        flips: &mut Vec<String>,\n*294|    ) -> Vec<RegistryApplyVerdict> {\n 295|        updates\n 296|            .iter()\n 297|            .map(|u| {\n 298|                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n*299|                    return RegistryApplyVerdict::NotMember;\n 300|                }\n 301|                // [impl->REQ-MESH-5]\n 302|                if !policy.roster.is_member(&u.subnet, origin_node) {\n*303|                    return RegistryApplyVerdict::UntrustedOrigin;\n 304|                }\n 305|                *admitted_any = true;\n 306|                let reg = regs.entry(u.subnet.clone()).or_default();\n...\n 323|                }\n*324|                RegistryApplyVerdict::Merged(outcome)\n 325|            })\n 326|            .collect()\n 327|    }\n...\n 338|    /// TRANSACTIONAL feed apply (ADR-0040 decision 3,\n*339|    /// REQ-REGISTRY-APPLY-TRANSACTIONAL): merge one accumulated batch —\n 340|    /// node labels AND instance updates together — under ONE lock acquisition\n 341|    /// and write snapshots ONCE at the end. Per-record semantics (gate,\n 342|    /// epoch lease, flip detection, heard stamping) are byte-identical to the\n...\n 345|    /// attention flips).\n*346|    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*347|    pub fn apply_feed_batch(\n 348|        &self,\n 349|        origin_node: &str,\n 350|        labels: &[NodeLabelUpdate],\n*351|        updates: &[RegistryUpdate],\n*352|        policy: &RegistryGatePolicy,\n 353|    ) -> (usize, Vec<String>) {\n 354|        if labels.is_empty() && updates.is_empty() {\n 355|            return (0, Vec::new());\n...\n 382|    /// untrusted origin is refused; an admitted update merges via\n*383|    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n 384|    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n 385|    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n 386|    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n 387|    // [impl->REQ-SUBNET-3]\n*388|    pub fn apply_node_labels(\n 389|        &self,\n 390|        origin_node: &str,\n 391|        updates: &[NodeLabelUpdate],\n*392|        policy: &RegistryGatePolicy,\n*393|    ) -> Vec<RegistryApplyVerdict> {\n 394|        let mut admitted_any = false;\n 395|        let verdicts = {\n 396|            let mut regs = self.regs.lock().unwrap();\n...\n 408|    /// [`apply_feed_batch`] (same split as [`Self::merge_instances_locked`]).\n*409|    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n 410|    fn merge_labels_locked(\n 411|        &self,\n*412|        regs: &mut BTreeMap<String, SubnetRegistry>,\n 413|        origin_node: &str,\n 414|        updates: &[NodeLabelUpdate],\n*415|        policy: &RegistryGatePolicy,\n 416|        admitted_any: &mut bool,\n*417|    ) -> Vec<RegistryApplyVerdict> {\n 418|        updates\n 419|            .iter()\n 420|            .map(|u| {\n 421|                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n*422|                    return RegistryApplyVerdict::NotMember;\n 423|                }\n 424|                // [impl->REQ-MESH-5]\n 425|                if !policy.roster.is_member(&u.subnet, origin_node) {\n*426|                    return RegistryApplyVerdict::UntrustedOrigin;\n 427|                }\n 428|                *admitted_any = true;\n 429|                let reg = regs.entry(u.subnet.clone()).or_default();\n*430|                RegistryApplyVerdict::Merged(reg.merge_node_label(\n 431|                    &u.node,\n 432|                    u.label.clone(),\n 433|                    u.epoch,\n...\n 445|\n*446|    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n 447|    /// this process lifetime (ADR-0039 Decision 5 status field).\n 448|    // [impl->REQ-PUMP-STAGE-TRUTH]\n*449|    pub fn last_admit_ms(&self) -> Option<u64> {\n 450|        match self\n 451|            .last_admit_ms\n 452|            .load(std::sync::atomic::Ordering::Relaxed)\n...\n 458|\n*459|    /// Scan the owlery and (re-)advertise every self perch into every member\n 460|    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\n 461|    /// the updates to push to peers (the node's own rows only — peers' rows\n*462|    /// reconverge from their own re-advertisement, no transitive gossip in\n 463|    /// v1: trust is pairwise per subnet, a relayed third-party row would\n 464|    /// carry an origin the receiver can't gate honestly).\n 465|    // [impl->REQ-INST-7]\n*466|    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n 467|        let subnets = SubnetStore::load();\n 468|        let mut vis = VisibilityStore::load();\n 469|        // First-join home adoption (D9-5, REQ-INST-15): within one\n*470|        // advertisement cadence of the node's first join (a pair lands the\n 471|        // subnet record; no pairing-protocol threading needed), unhomed Self\n 472|        // perches adopt the sole subnet + seed their sync scope. Strictly\n 473|        // adopt-if-unset; a multi-subnet store adopts nothing.\n 474|        // [impl->REQ-INST-15]\n*475|        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n 476|            let _ = vis.save();\n 477|        }\n 478|        let vis = vis;\n 479|        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n*480|        // authored its own blurb advertises this default (config seeds, the\n*481|        // agent refines — CONTEXT §resource advertisement).\n 482|        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\n 483|        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\n 484|        // §Discovery scope): registered kind=\"shell\" adapters that chose\n 485|        // broadcast=subnet ride every row this node authors — the other-node\n*486|        // discovery arm. Computed once per scan (the registration set is\n 487|        // node-level).\n 488|        // [impl->REQ-EP-5]\n*489|        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\n 490|            .iter()\n 491|            .filter(|(r, m)| {\n 492|                r.kind == spt_runtime::manifest::AdapterKind::Shell\n...\n 502|        // The set of self perches that still EXIST on disk this round — the\n*503|        // ghost-heal predicate below (a LOCAL registry row whose id is absent\n 504|        // here was erased, REQ-HAZARD-ROSTER-GHOST).\n 505|        let live_ids: std::collections::BTreeSet<String> =\n*506|            perch::list_self_perch_ids(owlery).into_iter().collect();\n 507|\n*508|        for id in perch::list_self_perch_ids(owlery) {\n*509|            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n*510|            // Advertisement follows the resting-state machine (D9-2,\n*511|            // REQ-INST-3): a live perch with a resting record advertises its\n 512|            // machine state (active / dormant / suspended); a recordless\n 513|            // (pre-D9-2 / interim) or dead perch keeps the legacy\n*514|            // liveness-derived mapping. Every advertisement stamps a fresh\n 515|            // epoch below, so a transition reaches peers as an epoch-bumped\n 516|            // update — the lease orders it (KH 4.8).\n 517|            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\n*518|            let status = advertised_status(&perch_path);\n 519|            // Endpoint-authored blurb wins; the node seed fills the gap\n 520|            // (both-authored, REQ-INST-14). Rides the same epoch lease as\n 521|            // every instance update — a blurb edit reaches peers as an\n...\n 534|            // [impl->REQ-PRES-1]\n*535|            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\n 536|            // info.json `state` IS the bound endpoint type\n 537|            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\n*538|            // A node advertises ONLY its own endpoints' types; the cross-node\n 539|            // user-msg gate reads this at the receive funnel (T3). A recordless\n*540|            // perch advertises no type → the funnel fail-closes to a re-stamp.\n 541|            // [impl->REQ-MSG-6]\n 542|            let endpoint_type = info.as_ref().map(|i| i.state.clone());\n 543|            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\n...\n 553|            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n*554|            //    None self-corrects on the next bind, so it advertises harness-only\n 555|            //    until then, matching the local amber).\n 556|            // [impl->REQ-SUBNET-DISPLAY-PARITY]\n 557|            let bound = is_perch_alive(&perch_path);\n...\n 560|            // sets the separate `controlled` flag instead, and its driving node IS\n*561|            // this node — so advertise `self.node_hex`. A remote controller keeps\n 562|            // its own origin. This is what lets a remote viewer see a\n 563|            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n 564|            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n...\n 577|            //    used to show the resources blurb here).\n*578|            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n 579|            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n 580|            //    a local controller has driven_by=None so that WHO datum undercounts it).\n 581|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n...\n 583|            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n*584|            let recent_projects = recent_projects_for(&perch_path, owlery);\n 585|            let last_active_ms = info.and_then(|i| i.last_active_ms);\n 586|            for sub in &subnets.subnets {\n 587|                let Ok(ep) = epoch.next_epoch() else { continue };\n...\n 596|                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n*597|                    // startup, so a rename converges by re-advertisement.\n 598|                    // [impl->REQ-SUBNET-3]\n 599|                    node_label: self.node_label.clone(),\n 600|                    // The hashed machine id rides beside it (M8 decision\n...\n 621|                let reg = regs.entry(sub.name.clone()).or_default();\n*622|                match advertise_if_visible(\n 623|                    reg,\n 624|                    &vis,\n 625|                    &sub.name,\n...\n 629|                ) {\n*630|                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n 631|                        subnet: sub.name.clone(),\n 632|                        endpoint_id: id.clone(),\n 633|                        instance,\n 634|                    })),\n*635|                    Ok(None) => {} // hidden in this subnet — not advertised\n 636|                    Err(collision) => {\n 637|                        // Bare-id collision (another node owns the name in\n 638|                        // this subnet): loud skip — resolution is the user's\n 639|                        // rename (D3f), never a silent overwrite.\n*640|                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n 641|                    }\n 642|                }\n 643|            }\n...\n 645|        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\n*646|        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\n*647|        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\n*648|        // this scan only refreshes perches that still exist, so the stale row is\n*649|        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\n*650|        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\n 651|        // epoch: the lease orders it, so it stops showing Active locally\n 652|        // (resource_projection skips non-routable) AND peers converge to gone. Only\n 653|        // still-routable local rows are touched (idempotent — an already-Offline\n...\n 691|                reg.merge_instance(&id, instance.clone());\n*692|                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n 693|                    subnet: sub.name.clone(),\n 694|                    endpoint_id: id,\n 695|                    instance,\n 696|                }));\n*697|                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\n 698|            }\n 699|        }\n 700|\n*701|        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\n 702|        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\n 703|        // (zero Self perches, or all hidden) still names itself to peers rather\n 704|        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n*705|        // into our own registry too so the snapshot carries it. Emitted every\n 706|        // round regardless of endpoint count — redundant-but-robust when rows\n 707|        // exist (the render prefers a trust/instance label anyway), the SOLE\n 708|        // carrier when they don't.\n...\n 714|                reg.merge_node_label(&self.node_hex, label.clone(), ep);\n*715|                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n 716|                    subnet: sub.name.clone(),\n 717|                    node: self.node_hex.clone(),\n 718|                    label: label.clone(),\n...\n 728|\n*729|    /// Evict every registry row authored by a **silent** peer node\n 730|    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n*731|    /// within `ttl` has its rows removed from every subnet registry and the\n 732|    /// snapshots rewritten, so a dead node identity can no longer poison\n 733|    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n 734|    /// node authors them fresh each pump tick and is never in its own heard\n 735|    /// map). A row whose author has NO heard stamp is treated as silent —\n*736|    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n 737|    /// (own rows, excluded), so an unstamped foreign row is already an\n 738|    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n*739|    /// within one pump cadence of its return (re-advertisement from its\n 740|    /// durable epoch). Returns the number of rows evicted.\n*741|    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n*742|    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n 743|        self.evict_silent_peers_at(ttl, wall_ms())\n 744|    }\n 745|\n...\n 747|    /// clock (the testable seam).\n*748|    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n*749|    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n 750|        let ttl_ms = ttl.as_millis() as u64;\n 751|        let heard = self.heard.lock().unwrap();\n 752|        let silent = |node: &str| {\n...\n 762|            if n > 0 {\n*763|                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n 764|            }\n 765|            evicted += n;\n 766|        }\n...\n 774|\n*775|    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n*776|    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n 777|    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n 778|    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n 779|    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n*780|    /// re-advertises Offline once, whole-node eviction never fires) stops\n 781|    /// accumulating unbounded on a remote viewer under churn. Own rows never decay.\n 782|    /// Snapshots are rewritten iff a row was evicted. The per-row receiver-observed\n*783|    /// clock is the model's self-pruning [`SubnetRegistry::evict_aged_offline`]\n 784|    /// side-map (re-derived each call — no leak, no explicit whole-node purge).\n*785|    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n*786|    pub fn evict_aged_offline_rows(&self, ttl: std::time::Duration) -> usize {\n 787|        self.evict_aged_offline_rows_at(ttl, wall_ms())\n 788|    }\n 789|\n...\n 791|    /// clock (the testable seam, mirroring [`evict_silent_peers_at`]).\n*792|    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n*793|    pub fn evict_aged_offline_rows_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n 794|        let grace_ms = ttl.as_millis() as u64;\n 795|        let mut regs = self.regs.lock().unwrap();\n 796|        let mut evicted = 0usize;\n...\n 799|            if n > 0 {\n*800|                eprintln!(\"REGISTRY_EVICT_OFFLINE:{subnet}: {n} aged-offline row(s)\");\n 801|            }\n 802|            evicted += n;\n 803|        }\n...\n 812|    /// election's input; empty when unknown).\n*813|    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n 814|        self.regs\n 815|            .lock()\n 816|            .unwrap()\n...\n 821|\n*822|    /// A point-in-time clone of one subnet's registry (resolution input).\n*823|    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n 824|        self.regs.lock().unwrap().get(subnet).cloned()\n 825|    }\n 826|\n*827|    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n 828|    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n 829|    /// readers. Best-effort: a failed snapshot write must not fail the merge\n 830|    /// that triggered it (readers tolerate staleness by contract).\n...\n 859|    /// The snapshot path for one subnet (the CLI reader's contract).\n*860|    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\n 861|        dir.join(format!(\"{subnet}.json\"))\n 862|    }\n 863|\n...\n 866|    // [impl->REQ-SUBNET-1]\n*867|    pub fn heard_path(dir: &Path) -> PathBuf {\n 868|        dir.join(\"heard.meta\")\n 869|    }\n 870|\n...\n 872|    /// a JSON array of superseded node hexes the pairing host noted —\n*873|    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\n 874|    /// (a disk-only eviction would be resurrected by the next snapshot\n 875|    /// mirror). `.meta` for the same can't-shadow-a-subnet reason as the\n 876|    /// heard map.\n*877|    pub fn repair_evict_path(dir: &Path) -> PathBuf {\n 878|        dir.join(\"repair-evict.meta\")\n 879|    }\n 880|\n...\n 885|    // [impl->REQ-SUBNET-7]\n*886|    pub fn consume_repair_evictions(&self) -> usize {\n 887|        let path = Self::repair_evict_path(&self.snapshot_dir);\n 888|        let Ok(raw) = std::fs::read_to_string(&path) else {\n 889|            return 0;\n...\n 919|\n*920|/// The [`Status`] this node advertises for one of its OWN perches (the\n*921|/// self-gossip path of [`RegistryHost::advertise_local`]).\n 922|///\n 923|/// - **Bound + alive** (`is_perch_alive`): follow the resting-state machine —\n 924|///   Active / Dormant / Suspended per the perch's resting record (recordless ⇒\n...\n 944|// [impl->REQ-EFFECTIVE-INSTANCE-STATE]\n*945|fn advertised_status(perch_path: &Path) -> Status {\n 946|    let intent = crate::resting::read_rest(perch_path).map(|r| r.state);\n 947|    match crate::resting::effective_rest_state(\n 948|        is_perch_alive(perch_path),\n...\n 982|/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n*983|/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n 984|/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n 985|/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n 986|/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n 987|// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n*988|fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n*989|    let entries = spt_store::sessions::read_all(perch_path);\n 990|    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n 991|    let mut out: Vec<String> = Vec::new();\n*992|    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\n 993|        let dir = Path::new(cwd);\n*994|        if crate::lifecycle::is_owlery_internal(dir, owlery) {\n 995|            continue;\n 996|        }\n 997|        let pid = spt_store::project::project_id_for_dir(dir);\n...\n 1011|/// The superseded identities a completed ceremony's intro reveals (pure,\n*1012|/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\n 1013|/// label AND machine id under a DIFFERENT node key than the re-paired\n 1014|/// joiner. Both must match — a label alone re-pairs nothing (hostnames\n 1015|/// collide), a machine id alone is never gossiped without its label.\n 1016|// [impl->REQ-SUBNET-7]\n*1017|pub fn superseded_identities(\n*1018|    reg: &SubnetRegistry,\n 1019|    intro: &spt_net::net::pairing::wire::NodeIntro,\n 1020|    joiner_hex: &str,\n 1021|) -> Vec<String> {\n...\n 1044|pub struct RekeyNotice {\n*1045|    /// The machine's advertised node label (display only).\n 1046|    pub label: String,\n 1047|    /// The hashed machine id the match anchored on.\n 1048|    pub machine_id: String,\n...\n 1055|/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\n*1056|/// by the pairing host AFTER a completed ceremony: resolve the superseded\n*1057|/// identities from the subnet's snapshot, tombstone their roster entries (this\n 1058|/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\n 1059|/// about others), rewrite the disk snapshot, and note the hexes in the eviction\n 1060|/// marker so the pump clears the in-memory rows on its next tick. The caller\n...\n 1073|// [impl->REQ-MESH-5]\n*1074|pub fn repair_evict_superseded(\n 1075|    roster: &mut spt_store::roster::RosterStore,\n 1076|    subnet: &str,\n 1077|    joiner_hex: &str,\n...\n 1080|) -> Vec<RekeyNotice> {\n*1081|    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\n 1082|    let Some(mut reg) = std::fs::read_to_string(&snap_path)\n 1083|        .ok()\n*1084|        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\n 1085|    else {\n 1086|        return Vec::new(); // no gossip yet — nothing to supersede\n 1087|    };\n...\n 1103|            intro.label,\n*1104|            spt_net::net::registry::key_prefix(&intro.machine_id),\n*1105|            spt_net::net::registry::key_prefix(hex),\n*1106|            spt_net::net::registry::key_prefix(joiner_hex),\n 1107|        );\n 1108|        notices.push(RekeyNotice {\n 1109|            label: intro.label.clone(),\n...\n 1119|    // Merge into the marker (several re-pairs can land between pump ticks).\n*1120|    let marker = RegistryHost::repair_evict_path(snap_dir);\n 1121|    let mut all: std::collections::BTreeSet<String> = std::fs::read_to_string(&marker)\n 1122|        .ok()\n 1123|        .and_then(|s| serde_json::from_str(&s).ok())\n...\n 1131|\n*1132|/// The event-driven advertisement marker file (M8 decision 15, REQ-CONV-2),\n 1133|/// under `identity/` — the [`crate::resting::PULL_MARKER_FILE`] idiom applied\n*1134|/// to the registry leg. An endpoint online/offline transition (ready-listener\n 1135|/// start/stop, a rest edge) drops it; the pump consumes it and forces a\n*1136|/// registry round NOW (advertise_local + peer push) instead of waiting out\n*1137|/// the cadence. A WAKE of the existing loop, never a second advertisement\n 1138|/// path: the forced round takes the exact same code path, so the epoch lease\n 1139|/// and visibility gates ride unchanged. File-based because the transitions\n 1140|/// happen in other processes (`spt ready`, `spt endpoint stop`, a wake CLI)\n 1141|/// than the pump's daemon.\n*1142|pub const ADVERTISE_MARKER_FILE: &str = \"advertise-now\";\n 1143|\n*1144|/// Drop the advertise-now marker at the canonical identity dir (idempotent —\n 1145|/// a second transition before the pump's next tick re-requests the same\n 1146|/// round). Best-effort: a failed drop costs one cadence, never an error.\n 1147|// [impl->REQ-CONV-2]\n*1148|pub fn request_advertise_now() {\n*1149|    let marker = spt_store::perch::identity_dir().join(ADVERTISE_MARKER_FILE);\n 1150|    if let Some(parent) = marker.parent() {\n 1151|        let _ = std::fs::create_dir_all(parent);\n 1152|    }\n...\n 1155|\n*1156|/// Consume the advertise-now marker: `true` exactly once per drop (the\n 1157|/// remove is the take — two pump ticks can never both claim one transition).\n 1158|// [impl->REQ-CONV-2]\n*1159|pub fn take_advertise_now(marker_path: &Path) -> bool {\n 1160|    std::fs::remove_file(marker_path).is_ok()\n 1161|}\n 1162|\n...\n 1194|    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n*1195|    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196|    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197|    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198|    #[test]\n*1199|    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200|        let tmp = tempfile::tempdir().unwrap();\n 1201|        let root = tmp.path();\n*1202|        let owlery = root.join(\"owlery\");\n*1203|        let perch = owlery.join(\"hall-a\");\n 1204|        std::fs::create_dir_all(&perch).unwrap();\n 1205|        // Real project dirs OUTSIDE any repo → project_id_for_dir falls back to the\n 1206|        // folder name (no remote, no git toplevel).\n...\n 1210|        }\n*1211|        let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal → excluded\n 1212|        std::fs::create_dir_all(&psyche).unwrap();\n 1213|        let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");\n*1214|        // Ledger oldest→newest: alpha, beta, <owlery>, alpha(dup), gamma.\n 1215|        let mut body = String::new();\n 1216|        for (sid, dir) in [\n 1217|            (\"s1\", work.join(\"alpha\")),\n...\n 1229|\n*1230|        let got = recent_projects_for(&perch, &owlery);\n*1231|        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232|        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233|    }\n 1234|\n...\n 1260|\n*1261|    fn upd(subnet: &str, id: &str, node: &str, epoch: u64) -> RegistryUpdate {\n*1262|        RegistryUpdate {\n 1263|            subnet: subnet.to_string(),\n 1264|            endpoint_id: id.to_string(),\n 1265|            instance: Instance {\n...\n 1298|\n*1299|    fn policy(subnet: &str, trusted: &str) -> RegistryGatePolicy {\n 1300|        let mut roster = RosterStore::default();\n 1301|        roster.merge_entry(member(subnet, trusted));\n*1302|        RegistryGatePolicy {\n 1303|            subnets: vec![subnet.to_string()],\n 1304|            roster,\n 1305|        }\n...\n 1307|\n*1308|    fn host(dir: &Path) -> RegistryHost {\n*1309|        RegistryHost::new_at(\n 1310|            \"aa11\",\n 1311|            EpochSource::load_from(&dir.join(\"epoch.json\")),\n*1312|            dir.join(\"registry\"),\n 1313|        )\n 1314|    }\n 1315|"}],"details":{"scopePath":"crates/spt-daemon/src/registryhost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":200,"fileCount":1,"files":["crates/spt-daemon/src/registryhost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/registryhost.rs","count":200}],"truncated":true,"perFileLimitReached":200,"displayContent":"   *1│//! The daemon's live subnet-registry holder (D9-1-2) — REQ-INST-7's\n    2│//! production wiring.\n    3│//!\n   *4│//! D3 built the registry **model** (`spt_net::net::registry`: the epoch\n    5│//! lease, the join-time collision check, visibility enforcement) and D4d the\n   *6│//! wire record (`RegistryUpdate`), both consumed only by tests. This type is\n   *7│//! the daemon-side instance: one in-memory `SubnetRegistry` per member\n    8│//! subnet, fed from two directions —\n    9│//!\n  *10│//! - **inbound**: the dispatcher's registry arm applies peer feeds under the\n   11│//!   same fail-closed gate as every replicated store (member subnet ∧ origin\n   12│//!   trusted *in that subnet*, subject = handshake-proven stream origin —\n   13│//!   KNOWN-HAZARDS 7.5);\n  *14│//! - **local**: [`advertise_local`](RegistryHost::advertise_local) scans the\n  *15│//!   owlery and (re-)advertises every visible self perch with a fresh\n   16│//!   [`EpochSource`] epoch — the per-node monotonic lease key, never\n   17│//!   wall-clock (KNOWN-HAZARDS 4.8).\n   18│//!\n  *19│//! The registry is **eventually consistent by re-advertisement**: state is\n   20│//! in-memory (a daemon restart forgets peers' rows), and each pump tick\n   21│//! re-pushes the node's own rows — peers reconverge within one cadence, the\n   22│//! same replay-is-recovery posture as the D8 notif feed. For out-of-process\n   23│//! consumers (`spt send`'s WAN resolution, D9-1-4) the host mirrors each\n  *24│//! subnet's registry to an atomic JSON snapshot under\n  *25│//! `identity/registry/` — readers tolerate staleness (the 4.3\n   26│//! stale-clean posture), never block on the daemon.\n   27│// [impl->REQ-INST-7]\n   28│\n     │...\n   33│\n  *34│use spt_net::net::registry::{\n  *35│    advertise_if_visible, Instance, MergeOutcome, Status, SubnetRegistry,\n   36│};\n  *37│use spt_net::net::replicate::{NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate};\n   38│use spt_store::epoch::EpochSource;\n   39│use spt_store::liveness::{is_perch_alive, is_perch_unbound};\n   40│use spt_store::perch::{self, ParentHint};\n     │...\n   44│\n  *45│/// What the host did with one inbound registry record — loud + typed.\n   46│#[derive(Debug, Clone, PartialEq, Eq)]\n  *47│pub enum RegistryApplyVerdict {\n   48│    /// Admitted and merged with the stated outcome (the lease may still have\n   49│    /// dropped it as [`MergeOutcome::Stale`] — that IS a merge decision).\n   50│    Merged(MergeOutcome),\n     │...\n   58│/// without a restart; the access-gate stance shared with sync/notif).\n  *59│pub struct RegistryGatePolicy {\n   60│    /// Names of every subnet this node is a member of.\n   61│    pub subnets: Vec<String>,\n   62│    /// The membership directory (Mesh-D5, REQ-MESH-5): authorization is now\n     │...\n   68│\n  *69│impl RegistryGatePolicy {\n   70│    /// Load from the node's canonical stores.\n  *71│    pub fn load() -> RegistryGatePolicy {\n   72│        let subnets = SubnetStore::load()\n   73│            .subnets\n   74│            .iter()\n     │...\n   76│            .collect();\n  *77│        RegistryGatePolicy {\n   78│            subnets,\n   79│            roster: RosterStore::load(),\n   80│        }\n     │...\n   85│    // [impl->REQ-MESH-5]\n  *86│    pub fn admits(&self, subnet: &str, origin_node: &str) -> bool {\n   87│        self.subnets.iter().any(|s| s == subnet) && self.roster.is_member(subnet, origin_node)\n   88│    }\n   89│}\n   90│\n  *91│/// The daemon's per-subnet registry instances + this node's advertisement\n  *92│/// epoch source. Shared (`Arc`) between the dispatcher's registry arm and\n   93│/// the peer pump.\n  *94│pub struct RegistryHost {\n   95│    /// This node's stable name (lowercase-hex pubkey).\n   96│    node_hex: String,\n   97│    /// This node's human label (M7 D2, REQ-SUBNET-3): the OS hostname,\n   98│    /// re-read at daemon startup ([`new`](Self::new)) and stamped onto every\n  *99│    /// advertised row — a hostname change reaches peers as ordinary\n  100│    /// epoch-bumped updates. Display/addressing sugar; `node_hex` stays the\n  101│    /// identity.\n  102│    node_label: Option<String>,\n  103│    /// This node's hashed stable machine identifier (M8 decision 13/22,\n *104│    /// REQ-SUBNET-7): stamped onto every advertised row beside the label —\n  105│    /// the re-pair overwrite anchor. Already domain-separated-hashed by\n  106│    /// [`crate::machineid`]; never the raw id.\n  107│    machine_id: Option<String>,\n     │...\n  113│    heard: Mutex<BTreeMap<String, u64>>,\n *114│    /// Wall-clock ms of the LAST admitted inbound registry/label feed from\n *115│    /// ANY origin — the \"last admitted registry update\" health field\n  116│    /// (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): real inbound gossip\n  117│    /// progress, as opposed to `heard`'s per-origin recency. `0` = never.\n  118│    last_admit_ms: std::sync::atomic::AtomicU64,\n *119│    regs: Mutex<BTreeMap<String, SubnetRegistry>>,\n  120│    /// The node's one durable monotonic counter (the D3b lease source) — the\n  121│    /// epoch on every locally-authored instance row.\n  122│    epoch: Mutex<EpochSource>,\n *123│    /// Where snapshots land (`identity/registry/<subnet>.json`).\n  124│    snapshot_dir: PathBuf,\n  125│    /// How many times [`write_snapshots`](Self::write_snapshots) ran this\n *126│    /// process — the REQ-REGISTRY-APPLY-TRANSACTIONAL observable: a feed\n  127│    /// applied transactionally writes ONCE per feed (bounded batches: once\n  128│    /// per batch), never once per chunk × record-kind (the KH 7.44 write\n  129│    /// amplification that stalled the brain's IPC drain).\n     │...\n  132│\n *133│impl RegistryHost {\n  134│    /// Stand the host up for this node, with the canonical epoch counter and\n  135│    /// snapshot dir under the spt home. Reads the OS hostname here — daemon\n  136│    /// startup IS the label's re-check point (REQ-SUBNET-3).\n *137│    pub fn new(node_hex: &str) -> RegistryHost {\n *138│        RegistryHost::new_at(\n  139│            node_hex,\n  140│            EpochSource::load(),\n *141│            perch::identity_dir().join(\"registry\"),\n  142│        )\n  143│        .with_node_label(spt_store::hostlabel::os_hostname())\n  144│        .with_machine_id(crate::machineid::machine_id_hash())\n     │...\n  149│    /// stay hostname-independent; chain [`with_node_label`](Self::with_node_label).\n *150│    pub fn new_at(node_hex: &str, epoch: EpochSource, snapshot_dir: PathBuf) -> RegistryHost {\n *151│        RegistryHost {\n  152│            node_hex: node_hex.to_string(),\n  153│            node_label: None,\n  154│            machine_id: None,\n     │...\n  165│    /// the transactional-apply unit/int observable (KH 7.44).\n *166│    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n *167│    pub fn snapshot_write_count(&self) -> u64 {\n  168│        self.snapshot_writes\n  169│            .load(std::sync::atomic::Ordering::Relaxed)\n  170│    }\n  171│\n *172│    /// Set the label this host stamps onto every advertised row.\n  173│    // [impl->REQ-SUBNET-3]\n *174│    pub fn with_node_label(mut self, label: Option<String>) -> RegistryHost {\n  175│        self.node_label = label;\n  176│        self\n  177│    }\n     │...\n  179│    /// Set the hashed machine identifier this host stamps onto every\n *180│    /// advertised row (M8 decision 13/22, REQ-SUBNET-7).\n  181│    // [impl->REQ-SUBNET-7]\n *182│    pub fn with_machine_id(mut self, machine_id: Option<String>) -> RegistryHost {\n  183│        self.machine_id = machine_id;\n  184│        self\n  185│    }\n     │...\n  187│    /// This node's stable name.\n *188│    pub fn node_hex(&self) -> &str {\n  189│        &self.node_hex\n  190│    }\n  191│\n *192│    /// Every advertised [`Instance`] this host knows for `endpoint_id`, across\n *193│    /// all of its per-subnet registries (the WAN user-msg origin resolver reads\n  194│    /// these and keys by the proven node — REQ-MSG-6). Cloned out so the lock\n  195│    /// is released before the caller inspects the rows. The same id can hold\n *196│    /// rows on several nodes / in several subnets; the resolver filters to the\n  197│    /// QUIC-proven origin node.\n  198│    // [impl->REQ-MSG-6]\n *199│    pub fn instances_of(&self, endpoint_id: &str) -> Vec<Instance> {\n  200│        self.regs\n  201│            .lock()\n  202│            .unwrap()\n     │...\n  209│    /// monotonic counter (identity/epoch.json) behind every locally-authored\n *210│    /// registry row. Every other per-node-id producer on this node MUST mint\n  211│    /// from the same source, or `node:epoch`-shaped ids collide: a notif_id is\n  212│    /// `node_hex:epoch`, so the pump's consent-notif producer and the CLI\n  213│    /// notify front door (which loads this same canonical source) would\n     │...\n  219│    /// constraint failed: notifs.notif_id`.) Locks the shared cursor so the\n *220│    /// dispatcher's registry arm and the pump never double-mint.\n *221│    // [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\n *222│    pub fn with_epoch<R>(&self, f: impl FnOnce(&mut EpochSource) -> R) -> R {\n  223│        f(&mut self.epoch.lock().unwrap())\n  224│    }\n  225│\n     │...\n  229│    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n *230│    pub fn apply_feed(\n  231│        &self,\n  232│        origin_node: &str,\n *233│        updates: &[RegistryUpdate],\n *234│        policy: &RegistryGatePolicy,\n *235│    ) -> Vec<RegistryApplyVerdict> {\n  236│        self.apply_feed_flips(origin_node, updates, policy).0\n  237│    }\n  238│\n     │...\n  242│    /// that another instance of the id just became the driven one (its\n *243│    /// daemon advertises transitions epoch-bumped), which rests a local\n  244│    /// instance of the same id warm (CONTEXT: driving `ling@laptop` makes\n  245│    /// `ling@desktop` dormant).\n  246│    ///\n     │...\n  248│    /// and the incoming one is. Deliberately **never `Inserted`**: this\n *249│    /// registry is in-memory, so a daemon restart re-inserts every peer row\n  250│    /// at its *current* status — counting inserts would knock local\n  251│    /// instances dormant on every restart; and never the periodic\n *252│    /// re-advertisement (`Updated` with prev already `Active` is not a\n  253│    /// flip). The lease has already dropped stale/equal epochs before any\n  254│    /// of this runs.\n  255│    // [impl->REQ-INST-3]\n *256│    pub fn apply_feed_flips(\n  257│        &self,\n  258│        origin_node: &str,\n *259│        updates: &[RegistryUpdate],\n *260│        policy: &RegistryGatePolicy,\n *261│    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n  262│        let mut admitted_any = false;\n  263│        let mut flips: Vec<String> = Vec::new();\n  264│        let verdicts = {\n     │...\n  283│    /// PER RECORD in both shapes; only the snapshot-write cadence differs.\n *284│    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n  285│    #[allow(clippy::too_many_arguments)]\n  286│    fn merge_instances_locked(\n  287│        &self,\n *288│        regs: &mut BTreeMap<String, SubnetRegistry>,\n  289│        origin_node: &str,\n *290│        updates: &[RegistryUpdate],\n *291│        policy: &RegistryGatePolicy,\n  292│        admitted_any: &mut bool,\n  293│        flips: &mut Vec<String>,\n *294│    ) -> Vec<RegistryApplyVerdict> {\n  295│        updates\n  296│            .iter()\n  297│            .map(|u| {\n  298│                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n *299│                    return RegistryApplyVerdict::NotMember;\n  300│                }\n  301│                // [impl->REQ-MESH-5]\n  302│                if !policy.roster.is_member(&u.subnet, origin_node) {\n *303│                    return RegistryApplyVerdict::UntrustedOrigin;\n  304│                }\n  305│                *admitted_any = true;\n  306│                let reg = regs.entry(u.subnet.clone()).or_default();\n     │...\n  323│                }\n *324│                RegistryApplyVerdict::Merged(outcome)\n  325│            })\n  326│            .collect()\n  327│    }\n     │...\n  338│    /// TRANSACTIONAL feed apply (ADR-0040 decision 3,\n *339│    /// REQ-REGISTRY-APPLY-TRANSACTIONAL): merge one accumulated batch —\n  340│    /// node labels AND instance updates together — under ONE lock acquisition\n  341│    /// and write snapshots ONCE at the end. Per-record semantics (gate,\n  342│    /// epoch lease, flip detection, heard stamping) are byte-identical to the\n     │...\n  345│    /// attention flips).\n *346│    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n *347│    pub fn apply_feed_batch(\n  348│        &self,\n  349│        origin_node: &str,\n  350│        labels: &[NodeLabelUpdate],\n *351│        updates: &[RegistryUpdate],\n *352│        policy: &RegistryGatePolicy,\n  353│    ) -> (usize, Vec<String>) {\n  354│        if labels.is_empty() && updates.is_empty() {\n  355│            return (0, Vec::new());\n     │...\n  382│    /// untrusted origin is refused; an admitted update merges via\n *383│    /// [`SubnetRegistry::merge_node_label`] (epoch lease) and stamps the\n  384│    /// origin's gossip-recency (an admitted label feed proves the peer is up,\n  385│    /// exactly like an instance feed). The endpoint-less carrier: this is how a\n  386│    /// peer with zero endpoints gets its hostname into our `--nodes` view.\n  387│    // [impl->REQ-SUBNET-3]\n *388│    pub fn apply_node_labels(\n  389│        &self,\n  390│        origin_node: &str,\n  391│        updates: &[NodeLabelUpdate],\n *392│        policy: &RegistryGatePolicy,\n *393│    ) -> Vec<RegistryApplyVerdict> {\n  394│        let mut admitted_any = false;\n  395│        let verdicts = {\n  396│            let mut regs = self.regs.lock().unwrap();\n     │...\n  408│    /// [`apply_feed_batch`] (same split as [`Self::merge_instances_locked`]).\n *409│    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n  410│    fn merge_labels_locked(\n  411│        &self,\n *412│        regs: &mut BTreeMap<String, SubnetRegistry>,\n  413│        origin_node: &str,\n  414│        updates: &[NodeLabelUpdate],\n *415│        policy: &RegistryGatePolicy,\n  416│        admitted_any: &mut bool,\n *417│    ) -> Vec<RegistryApplyVerdict> {\n  418│        updates\n  419│            .iter()\n  420│            .map(|u| {\n  421│                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n *422│                    return RegistryApplyVerdict::NotMember;\n  423│                }\n  424│                // [impl->REQ-MESH-5]\n  425│                if !policy.roster.is_member(&u.subnet, origin_node) {\n *426│                    return RegistryApplyVerdict::UntrustedOrigin;\n  427│                }\n  428│                *admitted_any = true;\n  429│                let reg = regs.entry(u.subnet.clone()).or_default();\n *430│                RegistryApplyVerdict::Merged(reg.merge_node_label(\n  431│                    &u.node,\n  432│                    u.label.clone(),\n  433│                    u.epoch,\n     │...\n  445│\n *446│    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n  447│    /// this process lifetime (ADR-0039 Decision 5 status field).\n  448│    // [impl->REQ-PUMP-STAGE-TRUTH]\n *449│    pub fn last_admit_ms(&self) -> Option<u64> {\n  450│        match self\n  451│            .last_admit_ms\n  452│            .load(std::sync::atomic::Ordering::Relaxed)\n     │...\n  458│\n *459│    /// Scan the owlery and (re-)advertise every self perch into every member\n  460│    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\n  461│    /// the updates to push to peers (the node's own rows only — peers' rows\n *462│    /// reconverge from their own re-advertisement, no transitive gossip in\n  463│    /// v1: trust is pairwise per subnet, a relayed third-party row would\n  464│    /// carry an origin the receiver can't gate honestly).\n  465│    // [impl->REQ-INST-7]\n *466│    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n  467│        let subnets = SubnetStore::load();\n  468│        let mut vis = VisibilityStore::load();\n  469│        // First-join home adoption (D9-5, REQ-INST-15): within one\n *470│        // advertisement cadence of the node's first join (a pair lands the\n  471│        // subnet record; no pairing-protocol threading needed), unhomed Self\n  472│        // perches adopt the sole subnet + seed their sync scope. Strictly\n  473│        // adopt-if-unset; a multi-subnet store adopts nothing.\n  474│        // [impl->REQ-INST-15]\n *475│        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n  476│            let _ = vis.save();\n  477│        }\n  478│        let vis = vis;\n  479│        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n *480│        // authored its own blurb advertises this default (config seeds, the\n *481│        // agent refines — CONTEXT §resource advertisement).\n  482│        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\n  483│        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\n  484│        // §Discovery scope): registered kind=\"shell\" adapters that chose\n  485│        // broadcast=subnet ride every row this node authors — the other-node\n *486│        // discovery arm. Computed once per scan (the registration set is\n  487│        // node-level).\n  488│        // [impl->REQ-EP-5]\n *489│        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\n  490│            .iter()\n  491│            .filter(|(r, m)| {\n  492│                r.kind == spt_runtime::manifest::AdapterKind::Shell\n     │...\n  502│        // The set of self perches that still EXIST on disk this round — the\n *503│        // ghost-heal predicate below (a LOCAL registry row whose id is absent\n  504│        // here was erased, REQ-HAZARD-ROSTER-GHOST).\n  505│        let live_ids: std::collections::BTreeSet<String> =\n *506│            perch::list_self_perch_ids(owlery).into_iter().collect();\n  507│\n *508│        for id in perch::list_self_perch_ids(owlery) {\n *509│            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n *510│            // Advertisement follows the resting-state machine (D9-2,\n *511│            // REQ-INST-3): a live perch with a resting record advertises its\n  512│            // machine state (active / dormant / suspended); a recordless\n  513│            // (pre-D9-2 / interim) or dead perch keeps the legacy\n *514│            // liveness-derived mapping. Every advertisement stamps a fresh\n  515│            // epoch below, so a transition reaches peers as an epoch-bumped\n  516│            // update — the lease orders it (KH 4.8).\n  517│            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\n *518│            let status = advertised_status(&perch_path);\n  519│            // Endpoint-authored blurb wins; the node seed fills the gap\n  520│            // (both-authored, REQ-INST-14). Rides the same epoch lease as\n  521│            // every instance update — a blurb edit reaches peers as an\n     │...\n  534│            // [impl->REQ-PRES-1]\n *535│            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\n  536│            // info.json `state` IS the bound endpoint type\n  537│            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\n *538│            // A node advertises ONLY its own endpoints' types; the cross-node\n  539│            // user-msg gate reads this at the receive funnel (T3). A recordless\n *540│            // perch advertises no type → the funnel fail-closes to a re-stamp.\n  541│            // [impl->REQ-MSG-6]\n  542│            let endpoint_type = info.as_ref().map(|i| i.state.clone());\n  543│            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\n     │...\n  553│            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n *554│            //    None self-corrects on the next bind, so it advertises harness-only\n  555│            //    until then, matching the local amber).\n  556│            // [impl->REQ-SUBNET-DISPLAY-PARITY]\n  557│            let bound = is_perch_alive(&perch_path);\n     │...\n  560│            // sets the separate `controlled` flag instead, and its driving node IS\n *561│            // this node — so advertise `self.node_hex`. A remote controller keeps\n  562│            // its own origin. This is what lets a remote viewer see a\n  563│            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n  564│            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n     │...\n  577│            //    used to show the resources blurb here).\n *578│            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n  579│            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n  580│            //    a local controller has driven_by=None so that WHO datum undercounts it).\n  581│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n     │...\n  583│            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n *584│            let recent_projects = recent_projects_for(&perch_path, owlery);\n  585│            let last_active_ms = info.and_then(|i| i.last_active_ms);\n  586│            for sub in &subnets.subnets {\n  587│                let Ok(ep) = epoch.next_epoch() else { continue };\n     │...\n  596│                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n *597│                    // startup, so a rename converges by re-advertisement.\n  598│                    // [impl->REQ-SUBNET-3]\n  599│                    node_label: self.node_label.clone(),\n  600│                    // The hashed machine id rides beside it (M8 decision\n     │...\n  621│                let reg = regs.entry(sub.name.clone()).or_default();\n *622│                match advertise_if_visible(\n  623│                    reg,\n  624│                    &vis,\n  625│                    &sub.name,\n     │...\n  629│                ) {\n *630│                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n  631│                        subnet: sub.name.clone(),\n  632│                        endpoint_id: id.clone(),\n  633│                        instance,\n  634│                    })),\n *635│                    Ok(None) => {} // hidden in this subnet — not advertised\n  636│                    Err(collision) => {\n  637│                        // Bare-id collision (another node owns the name in\n  638│                        // this subnet): loud skip — resolution is the user's\n  639│                        // rename (D3f), never a silent overwrite.\n *640│                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n  641│                    }\n  642│                }\n  643│            }\n     │...\n  645│        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\n *646│        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\n *647│        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\n *648│        // this scan only refreshes perches that still exist, so the stale row is\n *649│        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\n *650│        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\n  651│        // epoch: the lease orders it, so it stops showing Active locally\n  652│        // (resource_projection skips non-routable) AND peers converge to gone. Only\n  653│        // still-routable local rows are touched (idempotent — an already-Offline\n     │...\n  691│                reg.merge_instance(&id, instance.clone());\n *692│                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n  693│                    subnet: sub.name.clone(),\n  694│                    endpoint_id: id,\n  695│                    instance,\n  696│                }));\n *697│                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\n  698│            }\n  699│        }\n  700│\n *701│        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\n  702│        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\n  703│        // (zero Self perches, or all hidden) still names itself to peers rather\n  704│        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n *705│        // into our own registry too so the snapshot carries it. Emitted every\n  706│        // round regardless of endpoint count — redundant-but-robust when rows\n  707│        // exist (the render prefers a trust/instance label anyway), the SOLE\n  708│        // carrier when they don't.\n     │...\n  714│                reg.merge_node_label(&self.node_hex, label.clone(), ep);\n *715│                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n  716│                    subnet: sub.name.clone(),\n  717│                    node: self.node_hex.clone(),\n  718│                    label: label.clone(),\n     │...\n  728│\n *729│    /// Evict every registry row authored by a **silent** peer node\n  730│    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n *731│    /// within `ttl` has its rows removed from every subnet registry and the\n  732│    /// snapshots rewritten, so a dead node identity can no longer poison\n  733│    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n  734│    /// node authors them fresh each pump tick and is never in its own heard\n  735│    /// map). A row whose author has NO heard stamp is treated as silent —\n *736│    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n  737│    /// (own rows, excluded), so an unstamped foreign row is already an\n  738│    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n *739│    /// within one pump cadence of its return (re-advertisement from its\n  740│    /// durable epoch). Returns the number of rows evicted.\n *741│    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n *742│    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n  743│        self.evict_silent_peers_at(ttl, wall_ms())\n  744│    }\n  745│\n     │...\n  747│    /// clock (the testable seam).\n *748│    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n *749│    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n  750│        let ttl_ms = ttl.as_millis() as u64;\n  751│        let heard = self.heard.lock().unwrap();\n  752│        let silent = |node: &str| {\n     │...\n  762│            if n > 0 {\n *763│                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n  764│            }\n  765│            evicted += n;\n  766│        }\n     │...\n  774│\n *775│    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n *776│    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n  777│    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n  778│    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n  779│    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n *780│    /// re-advertises Offline once, whole-node eviction never fires) stops\n  781│    /// accumulating unbounded on a remote viewer under churn. Own rows never decay.\n  782│    /// Snapshots are rewritten iff a row was evicted. The per-row receiver-observed\n *783│    /// clock is the model's self-pruning [`SubnetRegistry::evict_aged_offline`]\n  784│    /// side-map (re-derived each call — no leak, no explicit whole-node purge).\n *785│    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n *786│    pub fn evict_aged_offline_rows(&self, ttl: std::time::Duration) -> usize {\n  787│        self.evict_aged_offline_rows_at(ttl, wall_ms())\n  788│    }\n  789│\n     │...\n  791│    /// clock (the testable seam, mirroring [`evict_silent_peers_at`]).\n *792│    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n *793│    pub fn evict_aged_offline_rows_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n  794│        let grace_ms = ttl.as_millis() as u64;\n  795│        let mut regs = self.regs.lock().unwrap();\n  796│        let mut evicted = 0usize;\n     │...\n  799│            if n > 0 {\n *800│                eprintln!(\"REGISTRY_EVICT_OFFLINE:{subnet}: {n} aged-offline row(s)\");\n  801│            }\n  802│            evicted += n;\n  803│        }\n     │...\n  812│    /// election's input; empty when unknown).\n *813│    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n  814│        self.regs\n  815│            .lock()\n  816│            .unwrap()\n     │...\n  821│\n *822│    /// A point-in-time clone of one subnet's registry (resolution input).\n *823│    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n  824│        self.regs.lock().unwrap().get(subnet).cloned()\n  825│    }\n  826│\n *827│    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n  828│    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n  829│    /// readers. Best-effort: a failed snapshot write must not fail the merge\n  830│    /// that triggered it (readers tolerate staleness by contract).\n     │...\n  859│    /// The snapshot path for one subnet (the CLI reader's contract).\n *860│    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\n  861│        dir.join(format!(\"{subnet}.json\"))\n  862│    }\n  863│\n     │...\n  866│    // [impl->REQ-SUBNET-1]\n *867│    pub fn heard_path(dir: &Path) -> PathBuf {\n  868│        dir.join(\"heard.meta\")\n  869│    }\n  870│\n     │...\n  872│    /// a JSON array of superseded node hexes the pairing host noted —\n *873│    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\n  874│    /// (a disk-only eviction would be resurrected by the next snapshot\n  875│    /// mirror). `.meta` for the same can't-shadow-a-subnet reason as the\n  876│    /// heard map.\n *877│    pub fn repair_evict_path(dir: &Path) -> PathBuf {\n  878│        dir.join(\"repair-evict.meta\")\n  879│    }\n  880│\n     │...\n  885│    // [impl->REQ-SUBNET-7]\n *886│    pub fn consume_repair_evictions(&self) -> usize {\n  887│        let path = Self::repair_evict_path(&self.snapshot_dir);\n  888│        let Ok(raw) = std::fs::read_to_string(&path) else {\n  889│            return 0;\n     │...\n  919│\n *920│/// The [`Status`] this node advertises for one of its OWN perches (the\n *921│/// self-gossip path of [`RegistryHost::advertise_local`]).\n  922│///\n  923│/// - **Bound + alive** (`is_perch_alive`): follow the resting-state machine —\n  924│///   Active / Dormant / Suspended per the perch's resting record (recordless ⇒\n     │...\n  944│// [impl->REQ-EFFECTIVE-INSTANCE-STATE]\n *945│fn advertised_status(perch_path: &Path) -> Status {\n  946│    let intent = crate::resting::read_rest(perch_path).map(|r| r.state);\n  947│    match crate::resting::effective_rest_state(\n  948│        is_perch_alive(perch_path),\n     │...\n  982│/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n *983│/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n  984│/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n  985│/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n  986│/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n  987│// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n *988│fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n *989│    let entries = spt_store::sessions::read_all(perch_path);\n  990│    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n  991│    let mut out: Vec<String> = Vec::new();\n *992│    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\n  993│        let dir = Path::new(cwd);\n *994│        if crate::lifecycle::is_owlery_internal(dir, owlery) {\n  995│            continue;\n  996│        }\n  997│        let pid = spt_store::project::project_id_for_dir(dir);\n     │...\n 1011│/// The superseded identities a completed ceremony's intro reveals (pure,\n*1012│/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\n 1013│/// label AND machine id under a DIFFERENT node key than the re-paired\n 1014│/// joiner. Both must match — a label alone re-pairs nothing (hostnames\n 1015│/// collide), a machine id alone is never gossiped without its label.\n 1016│// [impl->REQ-SUBNET-7]\n*1017│pub fn superseded_identities(\n*1018│    reg: &SubnetRegistry,\n 1019│    intro: &spt_net::net::pairing::wire::NodeIntro,\n 1020│    joiner_hex: &str,\n 1021│) -> Vec<String> {\n     │...\n 1044│pub struct RekeyNotice {\n*1045│    /// The machine's advertised node label (display only).\n 1046│    pub label: String,\n 1047│    /// The hashed machine id the match anchored on.\n 1048│    pub machine_id: String,\n     │...\n 1055│/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\n*1056│/// by the pairing host AFTER a completed ceremony: resolve the superseded\n*1057│/// identities from the subnet's snapshot, tombstone their roster entries (this\n 1058│/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\n 1059│/// about others), rewrite the disk snapshot, and note the hexes in the eviction\n 1060│/// marker so the pump clears the in-memory rows on its next tick. The caller\n     │...\n 1073│// [impl->REQ-MESH-5]\n*1074│pub fn repair_evict_superseded(\n 1075│    roster: &mut spt_store::roster::RosterStore,\n 1076│    subnet: &str,\n 1077│    joiner_hex: &str,\n     │...\n 1080│) -> Vec<RekeyNotice> {\n*1081│    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\n 1082│    let Some(mut reg) = std::fs::read_to_string(&snap_path)\n 1083│        .ok()\n*1084│        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\n 1085│    else {\n 1086│        return Vec::new(); // no gossip yet — nothing to supersede\n 1087│    };\n     │...\n 1103│            intro.label,\n*1104│            spt_net::net::registry::key_prefix(&intro.machine_id),\n*1105│            spt_net::net::registry::key_prefix(hex),\n*1106│            spt_net::net::registry::key_prefix(joiner_hex),\n 1107│        );\n 1108│        notices.push(RekeyNotice {\n 1109│            label: intro.label.clone(),\n     │...\n 1119│    // Merge into the marker (several re-pairs can land between pump ticks).\n*1120│    let marker = RegistryHost::repair_evict_path(snap_dir);\n 1121│    let mut all: std::collections::BTreeSet<String> = std::fs::read_to_string(&marker)\n 1122│        .ok()\n 1123│        .and_then(|s| serde_json::from_str(&s).ok())\n     │...\n 1131│\n*1132│/// The event-driven advertisement marker file (M8 decision 15, REQ-CONV-2),\n 1133│/// under `identity/` — the [`crate::resting::PULL_MARKER_FILE`] idiom applied\n*1134│/// to the registry leg. An endpoint online/offline transition (ready-listener\n 1135│/// start/stop, a rest edge) drops it; the pump consumes it and forces a\n*1136│/// registry round NOW (advertise_local + peer push) instead of waiting out\n*1137│/// the cadence. A WAKE of the existing loop, never a second advertisement\n 1138│/// path: the forced round takes the exact same code path, so the epoch lease\n 1139│/// and visibility gates ride unchanged. File-based because the transitions\n 1140│/// happen in other processes (`spt ready`, `spt endpoint stop`, a wake CLI)\n 1141│/// than the pump's daemon.\n*1142│pub const ADVERTISE_MARKER_FILE: &str = \"advertise-now\";\n 1143│\n*1144│/// Drop the advertise-now marker at the canonical identity dir (idempotent —\n 1145│/// a second transition before the pump's next tick re-requests the same\n 1146│/// round). Best-effort: a failed drop costs one cadence, never an error.\n 1147│// [impl->REQ-CONV-2]\n*1148│pub fn request_advertise_now() {\n*1149│    let marker = spt_store::perch::identity_dir().join(ADVERTISE_MARKER_FILE);\n 1150│    if let Some(parent) = marker.parent() {\n 1151│        let _ = std::fs::create_dir_all(parent);\n 1152│    }\n     │...\n 1155│\n*1156│/// Consume the advertise-now marker: `true` exactly once per drop (the\n 1157│/// remove is the take — two pump ticks can never both claim one transition).\n 1158│// [impl->REQ-CONV-2]\n*1159│pub fn take_advertise_now(marker_path: &Path) -> bool {\n 1160│    std::fs::remove_file(marker_path).is_ok()\n 1161│}\n 1162│\n     │...\n 1194│    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n*1195│    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196│    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197│    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198│    #[test]\n*1199│    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200│        let tmp = tempfile::tempdir().unwrap();\n 1201│        let root = tmp.path();\n*1202│        let owlery = root.join(\"owlery\");\n*1203│        let perch = owlery.join(\"hall-a\");\n 1204│        std::fs::create_dir_all(&perch).unwrap();\n 1205│        // Real project dirs OUTSIDE any repo → project_id_for_dir falls back to the\n 1206│        // folder name (no remote, no git toplevel).\n     │...\n 1210│        }\n*1211│        let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal → excluded\n 1212│        std::fs::create_dir_all(&psyche).unwrap();\n 1213│        let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");\n*1214│        // Ledger oldest→newest: alpha, beta, <owlery>, alpha(dup), gamma.\n 1215│        let mut body = String::new();\n 1216│        for (sid, dir) in [\n 1217│            (\"s1\", work.join(\"alpha\")),\n     │...\n 1229│\n*1230│        let got = recent_projects_for(&perch, &owlery);\n*1231│        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232│        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233│    }\n 1234│\n     │...\n 1260│\n*1261│    fn upd(subnet: &str, id: &str, node: &str, epoch: u64) -> RegistryUpdate {\n*1262│        RegistryUpdate {\n 1263│            subnet: subnet.to_string(),\n 1264│            endpoint_id: id.to_string(),\n 1265│            instance: Instance {\n     │...\n 1298│\n*1299│    fn policy(subnet: &str, trusted: &str) -> RegistryGatePolicy {\n 1300│        let mut roster = RosterStore::default();\n 1301│        roster.merge_entry(member(subnet, trusted));\n*1302│        RegistryGatePolicy {\n 1303│            subnets: vec![subnet.to_string()],\n 1304│            roster,\n 1305│        }\n     │...\n 1307│\n*1308│    fn host(dir: &Path) -> RegistryHost {\n*1309│        RegistryHost::new_at(\n 1310│            \"aa11\",\n 1311│            EpochSource::load_from(&dir.join(\"epoch.json\")),\n*1312│            dir.join(\"registry\"),\n 1313│        )\n 1314│    }\n 1315│"},"isError":false,"timestamp":1784292947116}}
{"type":"message","id":"151e2461","parentId":"22e09617","timestamp":"2026-07-17T12:55:47.131Z","message":{"role":"toolResult","toolCallId":"call_KxKISFDTMoo5Xr7uc8FQGzr9|fc_0148993141920bab016a5a2653080c8195a8d18aaa5611e860","toolName":"read","content":[{"type":"text","text":"fn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n    for i in 0..workers.len() {\n        if due_flags[i] {\n…\n        }\n    }\n}\n\n/// Run `step` for each due worker index in fan-out order, aborting on the\n/// FIRST error (abort-on-first-fail — the caller drops the peer's conn and\n/// redials next tick). The peer-step IO itself lives in `step`; this is the\n/// pure ordering/abort kernel, so the choreography is a unit fact.\nfn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {\n    for (i, &is_due) in due_flags.iter().enumerate() {\n        if is_due {\n            step(i)?;\n        }\n    }\n    Ok(())\n}\n\n/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — SUPERSEDES\n/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its\n/// carrier-desync→restart path. `Ok` keeps the conn. An ORDINARY error (including\n/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\n/// does (the decouple W2 delivers).\n// [impl->REQ-PUMP-PEER-ISOLATION]\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\nfn peer_leg_outcome(\n    result: io::Result<()>,\n    peer_hex: &str,\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    now: Instant,\n) -> io::Result<()> {\n    match result {\n        Ok(()) => Ok(()),\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => Err(e), // carrier desync → restart\n        Err(e) => {\n            eprintln!(\"PUMP_PEER_FAIL:{peer_hex}:{e}\");\n            conns.remove(peer_hex); // ordinary per-peer failure → drop conn\n            let prev = sched.get(peer_hex).copied();\n            sched.insert(peer_hex.to_string(), next_peer_backoff(prev, now)); // + back off (Q3)\n            Ok(())\n        }\n    }\n}\n\n/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\n/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\n/// after each — an ordinary failure drops the conn + backs the peer off and stops\n/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\n/// Each worker mints its open-ops only through the shell-owned [`PeerIo`].\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn run_peer_subnets(\n    brain: &mut Brain,\n    ops: &mut EpochSource,\n    workers: &mut [&mut dyn PumpWorker],\n    due_flags: &[bool],\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    conn_id: u64,\n    subs: &[String],\n    peer_hex: &str,\n    ctx: &RoundCtx,\n    now: Instant,\n) -> io::Result<()> {\n    for sub_name in subs {\n        let outcome = run_due(due_flags, |i| {\n            let mut io = PeerIo {\n                brain: &mut *brain,\n                conn_id,\n                ops: &mut *ops,\n            };\n            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\n        });\n        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\n        if !conns.contains_key(peer_hex) {\n            break; // an ordinary failure dropped the conn — redial a later round\n        }\n    }\n    Ok(())\n}\n\n/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).\n/// `CONNECTED` → cache the conn, RESET the peer's backoff, seed the observed addr\n/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in\n/// THIS round (advertise the round it connects — no head-of-line block by the dead\n/// peers). `DIAL_FAILED` → back the peer off (G5), log the ordinary per-peer\n/// signal, and drop the stale seed (REQ-CONV-1 self-heal → next round re-resolves\n/// via discovery). `DISCONNECTED` → drop the cached conn, NO backoff (redial-\n/// eligible immediately, Q3). A future presence kind is tolerated (no-op).\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn handle_presence_event(\n    ev: NetPresenceEvent,\n    brain: &mut Brain,\n    ops: &mut EpochSource,\n    workers: &mut [&mut dyn PumpWorker],\n    due_flags: &[bool],\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    pending: &mut HashSet<String>,\n    peer_subnets: &HashMap<String, Vec<String>>,\n    ctx: &RoundCtx,\n    peer_addrs: &std::path::Path,\n    health: &mut PumpHealth,\n    now: Instant,\n) -> io::Result<()> {\n    let is_target = peer_subnets.contains_key(&ev.remote_id_hex);\n    if presence_state_effect(&ev, conns, sched, pending, peer_addrs, health, is_target, now) {\n        // A CONNECTED peer that is a fan target this round → advertise NOW.\n        if let Some(subs) = peer_subnets.get(&ev.remote_id_hex) {\n            run_peer_subnets(\n                brain,\n                ops,\n                workers,\n                due_flags,\n                conns,\n                sched,\n                ev.conn_id,\n                subs,\n                &ev.remote_id_hex,\n                ctx,\n                now,\n            )?;\n        }\n    }\n    Ok(())\n}\n\n/// Apply a drained presence event's per-peer STATE effect — pure of the brain, so\n/// it is a UNIT fact (correlation by `remote_id_hex`, backoff on fail, reset on\n/// connect, disconnect drops the conn). Mutates conns / sched / pending + the seed\n/// store; returns `true` iff the peer's due legs should now run (a CONNECTED that\n/// is a fan target this round — `is_target`). See [`handle_presence_event`] for\n/// the per-kind rationale.\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn presence_state_effect(\n    ev: &NetPresenceEvent,\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    pending: &mut HashSet<String>,\n    peer_addrs: &std::path::Path,\n    health: &mut PumpHealth,\n    is_target: bool,\n    now: Instant,\n) -> bool {\n    match ev.kind.as_str() {\n        PRESENCE_CONNECTED => {\n            conns.insert(ev.remote_id_hex.clone(), ev.conn_id);\n            sched.remove(&ev.remote_id_hex); // live peer → reset backoff\n            pending.remove(&ev.remote_id_hex);\n            // REQ-CONV-1 write-back: seed the OBSERVED addr from the async connect.\n            if !ev.remote_addr.is_null() {\n                let _ =\n                    PeerAddrStore::record(peer_addrs, &ev.remote_id_hex, ev.remote_addr.clone());\n            }\n            // Real peer progress — the ONLY thing that turns health green\n            // (REQ-PUMP-STAGE-TRUTH).\n            health.note_connected(&ev.remote_id_hex, conns.len(), now_ms());\n            is_target\n        }\n        PRESENCE_DIAL_FAILED => {\n            // Stamped + stage-attributed (ADR-0039 Decision 5, REQ-PUMP-STAGE-\n            // TRUTH): the reason carries `stage=<where>` from the dial pipeline;\n            // the stamps make cross-node incident timelines line up (the\n            // 2026-07-14 PUMP_PEER_FAIL-unstamped seed, folded here).\n            // [impl->REQ-PUMP-STAGE-TRUTH]\n            eprintln!(\n                \"PUMP_PEER_FAIL:{}:{} wall_ms={} mono_ms={}\",\n                ev.remote_id_hex,\n                ev.reason.as_deref().unwrap_or(\"dial failed\"),\n                now_ms(),\n                mono_ms(),\n            );\n            pending.remove(&ev.remote_id_hex);\n            health.note_failed(\n                &ev.remote_id_hex,\n                health::parse_stage(ev.reason.as_deref().unwrap_or(\"\")),\n                conns.len(),\n                now_ms(),\n            );\n            let prev = sched.get(&ev.remote_id_hex).copied();\n            sched.insert(ev.remote_id_hex.clone(), next_peer_backoff(prev, now));\n            // Route retention (ADR-0039, KNOWN-HAZARDS 7.42): DEMOTE the cached\n            // route to suspect — never delete it. The pre-ADR drop-on-fail\n            // \"self-heal\" was the strand: one transient failure destroyed the\n            // only bootstrap route while the resolver never consulted the\n            // roster. The suspect row defers to the roster leg in\n            // [`resolve_submit_addr`] and is superseded by any validated\n            // fresher address (connect write-back, roster reconcile).\n            // [impl->REQ-PEER-ROUTE-CHAIN]\n            let _ = PeerAddrStore::demote_seed(peer_addrs, &ev.remote_id_hex);\n            false\n        }\n        PRESENCE_DISCONNECTED => {\n            // Drop the cached conn — redial-eligible immediately, NO backoff (Q3).\n            conns.retain(|_, cid| *cid != ev.conn_id);\n            health.note_disconnected(conns.len());\n            false\n        }\n        _ => false, // a future presence kind an older pump tolerates\n    }\n}\n\n/// Mark every due worker ran (ADR-0018 §V4: a POST-round `now`, ran =\n/// ATTEMPTED not succeeded). Non-due slots are untouched, so the stagger holds.\nfn mark_ran(last: &mut [Option<Instant>], due_flags: &[bool], now: Instant) {\n    for i in 0..last.len() {\n        if due_flags[i] {\n            last[i] = Some(now);\n        }\n    }\n}\n\n/// The round's fan-out targets: every `(subnet, peer)` this node pushes to —\n/// every member subnet that is NOT detached (REQ-SUBNET-5), crossed with that\n/// subnet's full roster minus self (REQ-MESH-3). One owned list so the order\n/// and the detached-skip are pure unit facts.\n// [impl->REQ-SUBNET-5]\nfn fan_targets(ctx: &RoundCtx, self_hex: &str) -> Vec<(String, String)> {\n    let mut out = Vec::new();\n    for sub in &ctx.subnets.subnets {\n        if ctx.attachment.is_detached(&sub.name) {\n            continue; // detached: neither advertise into nor connect to\n        }\n        for peer in push_targets(&ctx.policy.roster, &sub.name, self_hex) {\n            out.push((sub.name.clone(), peer));\n        }\n    }\n    out\n}\n\n/// The widened push target (Mesh-D6, REQ-MESH-3): every roster member of\n/// `subnet` except this node itself. Tombstoned members are already excluded by\n/// [`RosterStore::members_in`]. This is THE fan-out change — the push target is\n/// the full roster, not the directly-paired set — kept a pure function so the\n/// \"rows reach all members, never relayed\" widen is a unit fact, not just an\n/// integration property.\n// [impl->REQ-MESH-3]\nfn push_targets(\n    roster: &spt_store::roster::RosterStore,\n    subnet: &str,\n    self_hex: &str,\n) -> Vec<String> {\n    roster\n        .members_in(subnet)\n        .filter(|m| m.pubkey_hex != self_hex)\n        .map(|m| m.pubkey_hex.clone())\n        .collect()\n}\n\n/// Resolve the ONE address to submit a non-blocking dial to — THE ROUTE CHAIN\n/// (ADR-0039 Decision 1, REQ-PEER-ROUTE-CHAIN), static and always fully\n/// consulted in order:\n///\n/// 1. the exact peer-cache entry, iff invariant-valid and not suspect (the\n///    cold-start fast path that skips the id-only discovery round-trip);\n/// 2. the VALIDATED `RosterEntry.address` for that peer (`address.id` must\n///    match the peer key — a poison row never becomes a route): a node\n///    holding a valid roster address is never route-less, which is exactly\n///    what the 2026-07-10 field incident falsified about the old shape;\n/// 3. the injected resolver (production: id-only discovery).\n///\n/// A failed dial DEMOTES the cache row (`PeerAddrStore::demote_seed` on the\n/// resulting `DIAL_FAILED`) — the suspect row defers to the roster leg here\n/// and is superseded by any validated fresher address: a stale addr never\n/// strands a peer, now guaranteed by the chain + retention rather than the\n/// falsified drop-on-fail. The OBSERVED-addr write-back rides the\n/// `PRESENCE_CONNECTED` event ([`handle_presence_event`]). `None` =\n/// unresolvable right now — the peer reschedules on its own cadence, never a\n/// round failure.\n// [impl->REQ-CONV-1]\n// [impl->REQ-PEER-ROUTE-CHAIN]\nfn resolve_submit_addr(\n    resolver: &PeerResolver,\n…\n) -> Option<serde_json::Value> {\n…\n}\n…\n/// (M8 decision 23). Best-effort: a failed write costs honesty, never the\n/// pump (and the reader treats an absent/unreadable file as \"no heartbeat\n/// recorded\", not as healthy).\n// [impl->REQ-DAEMON-5]\nfn write_heartbeat(path: &std::path::Path) {\n    if let Some(parent) = path.parent() {\n        let _ = std::fs::create_dir_all(parent);\n    }\n    let _ = spt_store::atomic::atomic_write_string(path, &now_ms().to_string());\n}\n\n/// The supervisor's next backoff after a death: a healthy run (survived\n/// [`SUPERVISE_HEALTHY_RUN`]) resets to the floor `base`; a fast death\n/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`] (M8 decision 23 — a\n/// persistently-crashing pump stays visible and bounded, never silent and\n/// never a hot crash loop). Pure for the unit table.\n// [impl->REQ-DAEMON-5]\nfn next_backoff(prev: Duration, ran_for: Duration, base: Duration) -> Duration {\n    if ran_for >= SUPERVISE_HEALTHY_RUN {\n        base\n    } else {\n        prev.saturating_mul(2).min(SUPERVISE_BACKOFF_CAP)\n    }\n}\n\n/// Supervise repeated runs of a pump body until `stop` is raised (M8\n/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n/// self-heals visibly instead of silently halving the daemon for 24 h.\n/// `base` is the backoff floor (production: [`SUPERVISE_BACKOFF_BASE`];\n/// the unit harness shrinks it). Backoff sleeps in [`TICK`] slices so a\n/// stop request lands promptly. Generic over the body for the unit\n/// harness; production binds [`run_peer_pump`].\n// [impl->REQ-DAEMON-5]\npub fn supervise_pump(stop: &AtomicBool, base: Duration, mut body: impl FnMut() -> io::Result<()>) {\n    let mut backoff = base;\n    while !stop.load(Ordering::Relaxed) {\n        let started = Instant::now();\n        let outcome = std::panic::catch_unwind(std::panic::AssertUnwindSafe(&mut body));\n        if stop.load(Ordering::Relaxed) {\n            return; // a clean stop — whatever the body returned\n        }\n        let ran_for = started.elapsed();\n        match outcome {\n            // The body only returns Ok when stop is raised; reaching here\n            // without it is a died-loop fact — same restart as an error.\n            Ok(Ok(())) => eprintln!(\"PEER_PUMP_EXIT: loop returned without stop — restarting\"),\n            Ok(Err(e)) => eprintln!(\"PEER_PUMP_FAIL: {e}\"),\n            Err(panic) => {\n                let msg = panic\n                    .downcast_ref::<&str>()\n                    .map(|s| s.to_string())\n                    .or_else(|| panic.downcast_ref::<String>().cloned())\n                    .unwrap_or_else(|| \"<non-string panic>\".to_string());\n                eprintln!(\"PEER_PUMP_PANIC: {msg}\");\n            }\n        }\n        backoff = next_backoff(backoff, ran_for, base);\n        eprintln!(\n            \"PEER_PUMP_RESTART: supervised restart in {}s\",\n            backoff.as_secs()\n        );\n        let mut slept = Duration::ZERO;\n        while slept < backoff && !stop.load(Ordering::Relaxed) {\n            thread::sleep(TICK.min(backoff - slept));\n            slept += TICK;\n        }\n    }\n}\n\n/// Spawn the pump on its own thread with the production wiring — the\n/// daemon-boot entry ([`crate::daemon::Daemon::run`]). The thread body is\n/// the SUPERVISOR ([`supervise_pump`]), not the bare loop: the pump\n/// restarts after a panic or error with capped backoff (M8 decision 23).\n// [impl->REQ-DAEMON-5]\npub fn spawn_peer_pump(\n    broker_name: String,\n    registry: Arc<RegistryHost>,\n    cfg: DaemonConfig,\n    stop: Arc<AtomicBool>,\n) -> thread::JoinHandle<()> {\n    thread::spawn(move || {\n        let paths = PumpPaths::production();\n        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n            run_peer_pump(\n                &broker_name,\n                Arc::clone(&registry),\n                &paths,\n                production_resolver(),\n                PumpConfig::from_config(&cfg),\n                PumpHooks::default(),\n                &stop,\n            )\n        });\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n…\n}"}],"details":{"displayContent":{"text":"fn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n    for i in 0..workers.len() {\n        if due_flags[i] {\n…\n        }\n    }\n}\n\n/// Run `step` for each due worker index in fan-out order, aborting on the\n/// FIRST error (abort-on-first-fail — the caller drops the peer's conn and\n/// redials next tick). The peer-step IO itself lives in `step`; this is the\n/// pure ordering/abort kernel, so the choreography is a unit fact.\nfn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {\n    for (i, &is_due) in due_flags.iter().enumerate() {\n        if is_due {\n            step(i)?;\n        }\n    }\n    Ok(())\n}\n\n/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — SUPERSEDES\n/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its\n/// carrier-desync→restart path. `Ok` keeps the conn. An ORDINARY error (including\n/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\n/// does (the decouple W2 delivers).\n// [impl->REQ-PUMP-PEER-ISOLATION]\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\nfn peer_leg_outcome(\n    result: io::Result<()>,\n    peer_hex: &str,\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    now: Instant,\n) -> io::Result<()> {\n    match result {\n        Ok(()) => Ok(()),\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => Err(e), // carrier desync → restart\n        Err(e) => {\n            eprintln!(\"PUMP_PEER_FAIL:{peer_hex}:{e}\");\n            conns.remove(peer_hex); // ordinary per-peer failure → drop conn\n            let prev = sched.get(peer_hex).copied();\n            sched.insert(peer_hex.to_string(), next_peer_backoff(prev, now)); // + back off (Q3)\n            Ok(())\n        }\n    }\n}\n\n/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\n/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\n/// after each — an ordinary failure drops the conn + backs the peer off and stops\n/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\n/// Each worker mints its open-ops only through the shell-owned [`PeerIo`].\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn run_peer_subnets(\n    brain: &mut Brain,\n    ops: &mut EpochSource,\n    workers: &mut [&mut dyn PumpWorker],\n    due_flags: &[bool],\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    conn_id: u64,\n    subs: &[String],\n    peer_hex: &str,\n    ctx: &RoundCtx,\n    now: Instant,\n) -> io::Result<()> {\n    for sub_name in subs {\n        let outcome = run_due(due_flags, |i| {\n            let mut io = PeerIo {\n                brain: &mut *brain,\n                conn_id,\n                ops: &mut *ops,\n            };\n            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\n        });\n        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\n        if !conns.contains_key(peer_hex) {\n            break; // an ordinary failure dropped the conn — redial a later round\n        }\n    }\n    Ok(())\n}\n\n/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).\n/// `CONNECTED` → cache the conn, RESET the peer's backoff, seed the observed addr\n/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in\n/// THIS round (advertise the round it connects — no head-of-line block by the dead\n/// peers). `DIAL_FAILED` → back the peer off (G5), log the ordinary per-peer\n/// signal, and drop the stale seed (REQ-CONV-1 self-heal → next round re-resolves\n/// via discovery). `DISCONNECTED` → drop the cached conn, NO backoff (redial-\n/// eligible immediately, Q3). A future presence kind is tolerated (no-op).\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn handle_presence_event(\n    ev: NetPresenceEvent,\n    brain: &mut Brain,\n    ops: &mut EpochSource,\n    workers: &mut [&mut dyn PumpWorker],\n    due_flags: &[bool],\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    pending: &mut HashSet<String>,\n    peer_subnets: &HashMap<String, Vec<String>>,\n    ctx: &RoundCtx,\n    peer_addrs: &std::path::Path,\n    health: &mut PumpHealth,\n    now: Instant,\n) -> io::Result<()> {\n    let is_target = peer_subnets.contains_key(&ev.remote_id_hex);\n    if presence_state_effect(&ev, conns, sched, pending, peer_addrs, health, is_target, now) {\n        // A CONNECTED peer that is a fan target this round → advertise NOW.\n        if let Some(subs) = peer_subnets.get(&ev.remote_id_hex) {\n            run_peer_subnets(\n                brain,\n                ops,\n                workers,\n                due_flags,\n                conns,\n                sched,\n                ev.conn_id,\n                subs,\n                &ev.remote_id_hex,\n                ctx,\n                now,\n            )?;\n        }\n    }\n    Ok(())\n}\n\n/// Apply a drained presence event's per-peer STATE effect — pure of the brain, so\n/// it is a UNIT fact (correlation by `remote_id_hex`, backoff on fail, reset on\n/// connect, disconnect drops the conn). Mutates conns / sched / pending + the seed\n/// store; returns `true` iff the peer's due legs should now run (a CONNECTED that\n/// is a fan target this round — `is_target`). See [`handle_presence_event`] for\n/// the per-kind rationale.\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn presence_state_effect(\n    ev: &NetPresenceEvent,\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    pending: &mut HashSet<String>,\n    peer_addrs: &std::path::Path,\n    health: &mut PumpHealth,\n    is_target: bool,\n    now: Instant,\n) -> bool {\n    match ev.kind.as_str() {\n        PRESENCE_CONNECTED => {\n            conns.insert(ev.remote_id_hex.clone(), ev.conn_id);\n            sched.remove(&ev.remote_id_hex); // live peer → reset backoff\n            pending.remove(&ev.remote_id_hex);\n            // REQ-CONV-1 write-back: seed the OBSERVED addr from the async connect.\n            if !ev.remote_addr.is_null() {\n                let _ =\n                    PeerAddrStore::record(peer_addrs, &ev.remote_id_hex, ev.remote_addr.clone());\n            }\n            // Real peer progress — the ONLY thing that turns health green\n            // (REQ-PUMP-STAGE-TRUTH).\n            health.note_connected(&ev.remote_id_hex, conns.len(), now_ms());\n            is_target\n        }\n        PRESENCE_DIAL_FAILED => {\n            // Stamped + stage-attributed (ADR-0039 Decision 5, REQ-PUMP-STAGE-\n            // TRUTH): the reason carries `stage=<where>` from the dial pipeline;\n            // the stamps make cross-node incident timelines line up (the\n            // 2026-07-14 PUMP_PEER_FAIL-unstamped seed, folded here).\n            // [impl->REQ-PUMP-STAGE-TRUTH]\n            eprintln!(\n                \"PUMP_PEER_FAIL:{}:{} wall_ms={} mono_ms={}\",\n                ev.remote_id_hex,\n                ev.reason.as_deref().unwrap_or(\"dial failed\"),\n                now_ms(),\n                mono_ms(),\n            );\n            pending.remove(&ev.remote_id_hex);\n            health.note_failed(\n                &ev.remote_id_hex,\n                health::parse_stage(ev.reason.as_deref().unwrap_or(\"\")),\n                conns.len(),\n                now_ms(),\n            );\n            let prev = sched.get(&ev.remote_id_hex).copied();\n            sched.insert(ev.remote_id_hex.clone(), next_peer_backoff(prev, now));\n            // Route retention (ADR-0039, KNOWN-HAZARDS 7.42): DEMOTE the cached\n            // route to suspect — never delete it. The pre-ADR drop-on-fail\n            // \"self-heal\" was the strand: one transient failure destroyed the\n            // only bootstrap route while the resolver never consulted the\n            // roster. The suspect row defers to the roster leg in\n            // [`resolve_submit_addr`] and is superseded by any validated\n            // fresher address (connect write-back, roster reconcile).\n            // [impl->REQ-PEER-ROUTE-CHAIN]\n            let _ = PeerAddrStore::demote_seed(peer_addrs, &ev.remote_id_hex);\n            false\n        }\n        PRESENCE_DISCONNECTED => {\n            // Drop the cached conn — redial-eligible immediately, NO backoff (Q3).\n            conns.retain(|_, cid| *cid != ev.conn_id);\n            health.note_disconnected(conns.len());\n            false\n        }\n        _ => false, // a future presence kind an older pump tolerates\n    }\n}\n\n/// Mark every due worker ran (ADR-0018 §V4: a POST-round `now`, ran =\n/// ATTEMPTED not succeeded). Non-due slots are untouched, so the stagger holds.\nfn mark_ran(last: &mut [Option<Instant>], due_flags: &[bool], now: Instant) {\n    for i in 0..last.len() {\n        if due_flags[i] {\n            last[i] = Some(now);\n        }\n    }\n}\n\n/// The round's fan-out targets: every `(subnet, peer)` this node pushes to —\n/// every member subnet that is NOT detached (REQ-SUBNET-5), crossed with that\n/// subnet's full roster minus self (REQ-MESH-3). One owned list so the order\n/// and the detached-skip are pure unit facts.\n// [impl->REQ-SUBNET-5]\nfn fan_targets(ctx: &RoundCtx, self_hex: &str) -> Vec<(String, String)> {\n    let mut out = Vec::new();\n    for sub in &ctx.subnets.subnets {\n        if ctx.attachment.is_detached(&sub.name) {\n            continue; // detached: neither advertise into nor connect to\n        }\n        for peer in push_targets(&ctx.policy.roster, &sub.name, self_hex) {\n            out.push((sub.name.clone(), peer));\n        }\n    }\n    out\n}\n\n/// The widened push target (Mesh-D6, REQ-MESH-3): every roster member of\n/// `subnet` except this node itself. Tombstoned members are already excluded by\n/// [`RosterStore::members_in`]. This is THE fan-out change — the push target is\n/// the full roster, not the directly-paired set — kept a pure function so the\n/// \"rows reach all members, never relayed\" widen is a unit fact, not just an\n/// integration property.\n// [impl->REQ-MESH-3]\nfn push_targets(\n    roster: &spt_store::roster::RosterStore,\n    subnet: &str,\n    self_hex: &str,\n) -> Vec<String> {\n    roster\n        .members_in(subnet)\n        .filter(|m| m.pubkey_hex != self_hex)\n        .map(|m| m.pubkey_hex.clone())\n        .collect()\n}\n\n/// Resolve the ONE address to submit a non-blocking dial to — THE ROUTE CHAIN\n/// (ADR-0039 Decision 1, REQ-PEER-ROUTE-CHAIN), static and always fully\n/// consulted in order:\n///\n/// 1. the exact peer-cache entry, iff invariant-valid and not suspect (the\n///    cold-start fast path that skips the id-only discovery round-trip);\n/// 2. the VALIDATED `RosterEntry.address` for that peer (`address.id` must\n///    match the peer key — a poison row never becomes a route): a node\n///    holding a valid roster address is never route-less, which is exactly\n///    what the 2026-07-10 field incident falsified about the old shape;\n/// 3. the injected resolver (production: id-only discovery).\n///\n/// A failed dial DEMOTES the cache row (`PeerAddrStore::demote_seed` on the\n/// resulting `DIAL_FAILED`) — the suspect row defers to the roster leg here\n/// and is superseded by any validated fresher address: a stale addr never\n/// strands a peer, now guaranteed by the chain + retention rather than the\n/// falsified drop-on-fail. The OBSERVED-addr write-back rides the\n/// `PRESENCE_CONNECTED` event ([`handle_presence_event`]). `None` =\n/// unresolvable right now — the peer reschedules on its own cadence, never a\n/// round failure.\n// [impl->REQ-CONV-1]\n// [impl->REQ-PEER-ROUTE-CHAIN]\nfn resolve_submit_addr(\n    resolver: &PeerResolver,\n…\n) -> Option<serde_json::Value> {\n…\n}\n…\n/// (M8 decision 23). Best-effort: a failed write costs honesty, never the\n/// pump (and the reader treats an absent/unreadable file as \"no heartbeat\n/// recorded\", not as healthy).\n// [impl->REQ-DAEMON-5]\nfn write_heartbeat(path: &std::path::Path) {\n    if let Some(parent) = path.parent() {\n        let _ = std::fs::create_dir_all(parent);\n    }\n    let _ = spt_store::atomic::atomic_write_string(path, &now_ms().to_string());\n}\n\n/// The supervisor's next backoff after a death: a healthy run (survived\n/// [`SUPERVISE_HEALTHY_RUN`]) resets to the floor `base`; a fast death\n/// doubles, capped at [`SUPERVISE_BACKOFF_CAP`] (M8 decision 23 — a\n/// persistently-crashing pump stays visible and bounded, never silent and\n/// never a hot crash loop). Pure for the unit table.\n// [impl->REQ-DAEMON-5]\nfn next_backoff(prev: Duration, ran_for: Duration, base: Duration) -> Duration {\n    if ran_for >= SUPERVISE_HEALTHY_RUN {\n        base\n    } else {\n        prev.saturating_mul(2).min(SUPERVISE_BACKOFF_CAP)\n    }\n}\n\n/// Supervise repeated runs of a pump body until `stop` is raised (M8\n/// decision 23, REQ-DAEMON-5): a panic is CAUGHT and logged loud\n/// (`PEER_PUMP_PANIC`), an error return logged (`PEER_PUMP_FAIL`), and the\n/// body restarts after a capped, doubling backoff — a 5.9-class pump death\n/// self-heals visibly instead of silently halving the daemon for 24 h.\n/// `base` is the backoff floor (production: [`SUPERVISE_BACKOFF_BASE`];\n/// the unit harness shrinks it). Backoff sleeps in [`TICK`] slices so a\n/// stop request lands promptly. Generic over the body for the unit\n/// harness; production binds [`run_peer_pump`].\n// [impl->REQ-DAEMON-5]\npub fn supervise_pump(stop: &AtomicBool, base: Duration, mut body: impl FnMut() -> io::Result<()>) {\n    let mut backoff = base;\n    while !stop.load(Ordering::Relaxed) {\n        let started = Instant::now();\n        let outcome = std::panic::catch_unwind(std::panic::AssertUnwindSafe(&mut body));\n        if stop.load(Ordering::Relaxed) {\n            return; // a clean stop — whatever the body returned\n        }\n        let ran_for = started.elapsed();\n        match outcome {\n            // The body only returns Ok when stop is raised; reaching here\n            // without it is a died-loop fact — same restart as an error.\n            Ok(Ok(())) => eprintln!(\"PEER_PUMP_EXIT: loop returned without stop — restarting\"),\n            Ok(Err(e)) => eprintln!(\"PEER_PUMP_FAIL: {e}\"),\n            Err(panic) => {\n                let msg = panic\n                    .downcast_ref::<&str>()\n                    .map(|s| s.to_string())\n                    .or_else(|| panic.downcast_ref::<String>().cloned())\n                    .unwrap_or_else(|| \"<non-string panic>\".to_string());\n                eprintln!(\"PEER_PUMP_PANIC: {msg}\");\n            }\n        }\n        backoff = next_backoff(backoff, ran_for, base);\n        eprintln!(\n            \"PEER_PUMP_RESTART: supervised restart in {}s\",\n            backoff.as_secs()\n        );\n        let mut slept = Duration::ZERO;\n        while slept < backoff && !stop.load(Ordering::Relaxed) {\n            thread::sleep(TICK.min(backoff - slept));\n            slept += TICK;\n        }\n    }\n}\n\n/// Spawn the pump on its own thread with the production wiring — the\n/// daemon-boot entry ([`crate::daemon::Daemon::run`]). The thread body is\n/// the SUPERVISOR ([`supervise_pump`]), not the bare loop: the pump\n/// restarts after a panic or error with capped backoff (M8 decision 23).\n// [impl->REQ-DAEMON-5]\npub fn spawn_peer_pump(\n    broker_name: String,\n    registry: Arc<RegistryHost>,\n    cfg: DaemonConfig,\n    stop: Arc<AtomicBool>,\n) -> thread::JoinHandle<()> {\n    thread::spawn(move || {\n        let paths = PumpPaths::production();\n        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n            run_peer_pump(\n                &broker_name,\n                Arc::clone(&registry),\n                &paths,\n                production_resolver(),\n                PumpConfig::from_config(&cfg),\n                PumpHooks::default(),\n                &stop,\n            )\n        });\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n…\n}","startLine":756,"lineNumbers":[756,757,758,null,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,null,1044,null,1053,null,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,null,2053]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"}}},"isError":false,"timestamp":1784292947131}}
{"type":"message","id":"b470abfa","parentId":"151e2461","timestamp":"2026-07-17T12:55:47.134Z","message":{"role":"toolResult","toolCallId":"call_wUzDZjJljOMxAWUf6xL3Zwo3|fc_0148993141920bab016a5a2653081c81959c1d5687628033a4","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## livehost.rs\n 6|//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of\n*7|//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from\n 8|//! disk): same shape — enumerate Self perches, resolve each manifest from its\n 9|//! `info.json` `adapter` option, hold a stop flag per supervised thread, and run\n 10|//! one bounded reconcile sweep at boot and every tick. Where the shell waker\n...\n 134|/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n*135|/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n 136|///\n 137|/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n 138|///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\n...\n 144|// [impl->REQ-DAEMON-1]\n*145|pub fn reconcile_once(\n 146|    owlery: &Path,\n 147|    registered: &[(AdapterRecord, Manifest)],\n 148|    adapters_dir: &Path,\n...\n 540|/// massacres them (seed #6, the field-accept blocker). Runs ONCE at\n*541|/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear\n 542|/// ([`reconcile_hosted_liveness`]) offlines the stale-online records — which IS the \"was\n 543|/// online at restart\" signal. A brain restart with a SURVIVING broker sees the live\n 544|/// sessions in `live` and re-runs nothing (they are not orphaned). The re-run resumes\n...\n 653|/// is online + controllable but ABSENT from it has a dead/exited harness → mark it\n*654|/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and\n 655|/// the start-side stops re-hosting it.\n 656|///\n 657|/// **Controllable gate (load-bearing):** only `controllable == Some(true)`\n...\n 1029|\n*1030|/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n 1031|/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n 1032|/// config are re-read each sweep (adapter / pulse-period changes land between\n 1033|/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n...\n 1036|// [impl->REQ-DAEMON-1]\n*1037|pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n 1038|    std::thread::spawn(move || {\n 1039|        let set = Arc::new(LiveSet::new());\n 1040|        {\n...\n 1078|            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1079|                std::thread::sleep(Duration::from_millis(100));\n 1080|                continue;\n 1081|            }\n 1082|            let owlery = perch::owlery_dir();\n...\n 1088|            // latch for any spt-hosted endpoint whose broker session is gone — and\n*1089|            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\n 1090|            // so the same-tick stop-side un-hosts the now-offline perch and the\n 1091|            // start-side never REVIVES its Psyche. The boot-gate is what stops a\n 1092|            // cold start after an unclean stop from spawning N phantom Psyches for N\n...\n 1104|            }\n*1105|            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n 1106|            // Sleep in slices so a stop lands promptly.\n 1107|            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n 1108|            while left > 0 && !stop.load(Ordering::SeqCst) {\n 1109|                let step = left.min(100);\n*1110|                std::thread::sleep(Duration::from_millis(step));\n 1111|                left -= step;\n 1112|            }\n 1113|        }\n...\n 1159|        DaemonConfig {\n*1160|            pulse_period: Duration::from_millis(15),\n 1161|            ..DaemonConfig::default()\n 1162|        }\n 1163|    }\n...\n 1175|            }\n*1176|            std::thread::sleep(Duration::from_millis(20));\n 1177|        }\n 1178|        pred()\n 1179|    }\n...\n 1375|    // `Some(∅)` (broker reachable, hosting nothing) offlines phantoms. This\n*1376|    // pins the caller-side contract `spawn_live_host` runs each tick.\n 1377|    #[test]\n 1378|    fn broker_failure_skips_the_pass_never_mass_offlines() {\n 1379|        with_home(|_| {\n...\n 1450|    // [unit->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE] the B5 boot-gate: at boot the\n*1451|    // reconcile runs reconcile_hosted_liveness BEFORE reconcile_once, so a\n 1452|    // sessionless spt-hosted (controllable) online perch is OFFLINED first and\n*1453|    // reconcile_once then never REVIVES its Psyche (the cold-start-after-unclean-stop\n 1454|    // phantom). A session-backed perch is left online and IS hosted — proving the\n 1455|    // gate is the live broker session, not a blanket boot block. This is the exact\n*1456|    // ordering spawn_live_host runs each tick (now from tick 1, no boot grace).\n 1457|    #[test]\n 1458|    fn boot_gate_offlines_sessionless_controllable_then_reconcile_skips_host() {\n 1459|        with_home(|_| {\n...\n 1464|            // A controllable spt-hosted online perch WITH the adapter set — so\n*1465|            // reconcile_once WOULD host it absent the gate.\n 1466|            let seed_ctrl = |id: &str| {\n 1467|                let perch = perch::resolve_perch_path(id, ParentHint::Infer);\n 1468|                std::fs::create_dir_all(&perch).unwrap();\n...\n 1486|            reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n*1487|            reconcile_once(\n 1488|                &perch::owlery_dir(),\n 1489|                &registered_now(),\n 1490|                &perch::adapters_dir(),\n...\n 1514|    // [int->REQ-WORKER-REAP] the REAL reconcile GC (v0.12.1 real-harness rule):\n*1515|    // reconcile_once reaps an AGED orphaned worker under a DEAD parent while an\n 1516|    // equally-aged worker under a LIVE parent SURVIVES — the only difference is parent\n 1517|    // liveness, so this proves the wiring the primitive unit can't: per-parent\n 1518|    // is_perch_alive, the list_self_perch_ids traversal, and the clamped TTL knob.\n## projwriter.rs\n 56|/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\n*57|const PERIODIC_MS: u64 = 300_000;\n 58|\n 59|/// The complexity counters — the deterministic CI gate surface (gate ruling:\n 60|/// counters gate, wall-clock is manual acceptance only).\n...\n 617|/// runs the periodic full backstop until `stop`. Mirrors\n*618|/// `livehost::spawn_live_host`; the thread dies with the brain and the next\n 619|/// brain rehydrates from the persisted index (ready without warm).\n 620|// [impl->REQ-PROJECT-INDEX-WRITER]\n 621|// [impl->REQ-PROJECT-INDEX-INVALIDATION]\n...\n 629|        }\n*630|        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\n*631|        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\n*632|        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\n 633|\n 634|        let mut engine = WriterEngine::new(WriterPaths::production());\n 635|        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\n...\n 650|                let step = left.min(100);\n*651|                std::thread::sleep(Duration::from_millis(step));\n 652|                left -= step;\n 653|            }\n 654|            if stop.load(Ordering::SeqCst) {\n...\n 668|                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n*669|                std::thread::sleep(debounce);\n 670|                engine.stats.pending_refresh = true;\n 671|                engine.write_stats();\n 672|            }\n...\n 1004|        // and the attribution follows the new identity.\n*1005|        std::thread::sleep(Duration::from_millis(30)); // distinct mtime/len either way\n 1006|        spt_store::gitrun::run_git_ok(\n 1007|            &[\n 1008|                \"-C\",\n...\n 1078|            let stats = || read_stats_at(&stats_path());\n*1079|            let deadline = Instant::now() + Duration::from_secs(10);\n 1080|            // Wait for the boot cycle to settle.\n 1081|            while stats().map(|s| s.pending_refresh || s.generated_ms == 0).unwrap_or(true) {\n 1082|                assert!(Instant::now() < deadline, \"boot cycle never settled\");\n*1083|                std::thread::sleep(Duration::from_millis(25));\n 1084|            }\n 1085|            let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;\n 1086|\n...\n 1093|            }\n*1094|            let consumed = Instant::now() + Duration::from_secs(10);\n 1095|            while spt_store::projinval::pending_at(&spt_store::projinval::invalidations_dir())\n 1096|                || stats().map(|s| s.pending_refresh).unwrap_or(true)\n 1097|            {\n 1098|                assert!(Instant::now() < consumed, \"burst never consumed\");\n*1099|                std::thread::sleep(Duration::from_millis(25));\n 1100|            }\n 1101|            let s = stats().unwrap();\n 1102|            stop.store(true, Ordering::SeqCst);\n## shellwake.rs\n 5|//! sole job is to fire a wake; while the shell binary runs, no watcher does\n*6|//! ([`reconcile_once`] flips between them — spt-core owns the flip).\n 7|//!\n 8|//! **Exit-opcode supervision:** the watcher exiting with [`WAKE_OPCODE`] ⇒\n 9|//! the wake resolution ([`resolve_wake`]) brings the shell online. Any other\n...\n 245|                    let step = left.min(50);\n*246|                    std::thread::sleep(Duration::from_millis(step));\n 247|                    left -= step;\n 248|                }\n 249|            }\n...\n 470|// [impl->REQ-SHELL-2]\n*471|pub fn reconcile_once(\n 472|    owlery: &Path,\n 473|    registered: &[(AdapterRecord, Manifest)],\n 474|    adapters_dir: &Path,\n...\n 548|\n*549|/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\n 550|/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\n 551|/// is re-read each sweep (adapter add/remove lands between ticks).\n 552|// [impl->REQ-SHELL-2]\n...\n 560|            let registered = spt_runtime::registry::registered(&adapters_dir);\n*561|            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n 562|            // Sleep in slices so a stop lands promptly.\n 563|            let mut left = RECONCILE_INTERVAL_MS;\n 564|            while left > 0 && !stop.load(Ordering::SeqCst) {\n 565|                let step = left.min(100);\n*566|                std::thread::sleep(Duration::from_millis(step));\n 567|                left -= step;\n 568|            }\n 569|        }\n...\n 905|        // Offline (the spawn_record default) ⇒ one watcher; never two.\n*906|        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 907|        assert_eq!(set.len(), 1, \"offline + wake_command ⇒ a watcher\");\n*908|        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 909|        assert_eq!(set.len(), 1, \"a second sweep never doubles it\");\n 910|        // The child parked its pid (it is the long sleeper, still up).\n 911|        for _ in 0..100 {\n...\n 914|            }\n*915|            std::thread::sleep(Duration::from_millis(20));\n 916|        }\n 917|        let waker_pid: u32 = std::fs::read_to_string(perch.join(WAKER_PID_FILE))\n 918|            .expect(\"waker pid parked\")\n...\n 931|        shellinfo::write_shell_info(&perch, &info).unwrap();\n*932|        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 933|        assert_eq!(set.len(), 0, \"onlined instance keeps no watcher\");\n 934|        assert!(\n 935|            !spt_store::proc::is_process_alive(waker_pid),\n...\n 943|        std::fs::write(perch.join(WAKER_GAVE_UP_FILE), b\"\").unwrap();\n*944|        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 945|        assert_eq!(set.len(), 0, \"the give-up latch suppresses adoption\");\n 946|    }\n 947|\n...\n 989|        let params = fast_params();\n*990|        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 991|        assert_eq!(\n 992|            set.len(),\n 993|            1,"}],"details":{"scopePath":"crates/spt-daemon/src/livehost.rs, crates/spt-daemon/src/projwriter.rs, crates/spt-daemon/src/shellwake.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":44,"fileCount":3,"files":["crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/shellwake.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/livehost.rs","count":20},{"path":"crates/spt-daemon/src/projwriter.rs","count":12},{"path":"crates/spt-daemon/src/shellwake.rs","count":12}],"truncated":true,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## livehost.rs\n    6│//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of\n   *7│//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from\n    8│//! disk): same shape — enumerate Self perches, resolve each manifest from its\n    9│//! `info.json` `adapter` option, hold a stop flag per supervised thread, and run\n   10│//! one bounded reconcile sweep at boot and every tick. Where the shell waker\n     │...\n  134│/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n *135│/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n  136│///\n  137│/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n  138│///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\n     │...\n  144│// [impl->REQ-DAEMON-1]\n *145│pub fn reconcile_once(\n  146│    owlery: &Path,\n  147│    registered: &[(AdapterRecord, Manifest)],\n  148│    adapters_dir: &Path,\n     │...\n  540│/// massacres them (seed #6, the field-accept blocker). Runs ONCE at\n *541│/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear\n  542│/// ([`reconcile_hosted_liveness`]) offlines the stale-online records — which IS the \"was\n  543│/// online at restart\" signal. A brain restart with a SURVIVING broker sees the live\n  544│/// sessions in `live` and re-runs nothing (they are not orphaned). The re-run resumes\n     │...\n  653│/// is online + controllable but ABSENT from it has a dead/exited harness → mark it\n *654│/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and\n  655│/// the start-side stops re-hosting it.\n  656│///\n  657│/// **Controllable gate (load-bearing):** only `controllable == Some(true)`\n     │...\n 1029│\n*1030│/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n 1031│/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n 1032│/// config are re-read each sweep (adapter / pulse-period changes land between\n 1033│/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n     │...\n 1036│// [impl->REQ-DAEMON-1]\n*1037│pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n 1038│    std::thread::spawn(move || {\n 1039│        let set = Arc::new(LiveSet::new());\n 1040│        {\n     │...\n 1078│            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1079│                std::thread::sleep(Duration::from_millis(100));\n 1080│                continue;\n 1081│            }\n 1082│            let owlery = perch::owlery_dir();\n     │...\n 1088│            // latch for any spt-hosted endpoint whose broker session is gone — and\n*1089│            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\n 1090│            // so the same-tick stop-side un-hosts the now-offline perch and the\n 1091│            // start-side never REVIVES its Psyche. The boot-gate is what stops a\n 1092│            // cold start after an unclean stop from spawning N phantom Psyches for N\n     │...\n 1104│            }\n*1105│            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n 1106│            // Sleep in slices so a stop lands promptly.\n 1107│            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n 1108│            while left > 0 && !stop.load(Ordering::SeqCst) {\n 1109│                let step = left.min(100);\n*1110│                std::thread::sleep(Duration::from_millis(step));\n 1111│                left -= step;\n 1112│            }\n 1113│        }\n     │...\n 1159│        DaemonConfig {\n*1160│            pulse_period: Duration::from_millis(15),\n 1161│            ..DaemonConfig::default()\n 1162│        }\n 1163│    }\n     │...\n 1175│            }\n*1176│            std::thread::sleep(Duration::from_millis(20));\n 1177│        }\n 1178│        pred()\n 1179│    }\n     │...\n 1375│    // `Some(∅)` (broker reachable, hosting nothing) offlines phantoms. This\n*1376│    // pins the caller-side contract `spawn_live_host` runs each tick.\n 1377│    #[test]\n 1378│    fn broker_failure_skips_the_pass_never_mass_offlines() {\n 1379│        with_home(|_| {\n     │...\n 1450│    // [unit->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE] the B5 boot-gate: at boot the\n*1451│    // reconcile runs reconcile_hosted_liveness BEFORE reconcile_once, so a\n 1452│    // sessionless spt-hosted (controllable) online perch is OFFLINED first and\n*1453│    // reconcile_once then never REVIVES its Psyche (the cold-start-after-unclean-stop\n 1454│    // phantom). A session-backed perch is left online and IS hosted — proving the\n 1455│    // gate is the live broker session, not a blanket boot block. This is the exact\n*1456│    // ordering spawn_live_host runs each tick (now from tick 1, no boot grace).\n 1457│    #[test]\n 1458│    fn boot_gate_offlines_sessionless_controllable_then_reconcile_skips_host() {\n 1459│        with_home(|_| {\n     │...\n 1464│            // A controllable spt-hosted online perch WITH the adapter set — so\n*1465│            // reconcile_once WOULD host it absent the gate.\n 1466│            let seed_ctrl = |id: &str| {\n 1467│                let perch = perch::resolve_perch_path(id, ParentHint::Infer);\n 1468│                std::fs::create_dir_all(&perch).unwrap();\n     │...\n 1486│            reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n*1487│            reconcile_once(\n 1488│                &perch::owlery_dir(),\n 1489│                &registered_now(),\n 1490│                &perch::adapters_dir(),\n     │...\n 1514│    // [int->REQ-WORKER-REAP] the REAL reconcile GC (v0.12.1 real-harness rule):\n*1515│    // reconcile_once reaps an AGED orphaned worker under a DEAD parent while an\n 1516│    // equally-aged worker under a LIVE parent SURVIVES — the only difference is parent\n 1517│    // liveness, so this proves the wiring the primitive unit can't: per-parent\n 1518│    // is_perch_alive, the list_self_perch_ids traversal, and the clamped TTL knob.\n## projwriter.rs\n   56│/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\n  *57│const PERIODIC_MS: u64 = 300_000;\n   58│\n   59│/// The complexity counters — the deterministic CI gate surface (gate ruling:\n   60│/// counters gate, wall-clock is manual acceptance only).\n     │...\n  617│/// runs the periodic full backstop until `stop`. Mirrors\n *618│/// `livehost::spawn_live_host`; the thread dies with the brain and the next\n  619│/// brain rehydrates from the persisted index (ready without warm).\n  620│// [impl->REQ-PROJECT-INDEX-WRITER]\n  621│// [impl->REQ-PROJECT-INDEX-INVALIDATION]\n     │...\n  629│        }\n *630│        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\n *631│        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\n *632│        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\n  633│\n  634│        let mut engine = WriterEngine::new(WriterPaths::production());\n  635│        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\n     │...\n  650│                let step = left.min(100);\n *651│                std::thread::sleep(Duration::from_millis(step));\n  652│                left -= step;\n  653│            }\n  654│            if stop.load(Ordering::SeqCst) {\n     │...\n  668│                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n *669│                std::thread::sleep(debounce);\n  670│                engine.stats.pending_refresh = true;\n  671│                engine.write_stats();\n  672│            }\n     │...\n 1004│        // and the attribution follows the new identity.\n*1005│        std::thread::sleep(Duration::from_millis(30)); // distinct mtime/len either way\n 1006│        spt_store::gitrun::run_git_ok(\n 1007│            &[\n 1008│                \"-C\",\n     │...\n 1078│            let stats = || read_stats_at(&stats_path());\n*1079│            let deadline = Instant::now() + Duration::from_secs(10);\n 1080│            // Wait for the boot cycle to settle.\n 1081│            while stats().map(|s| s.pending_refresh || s.generated_ms == 0).unwrap_or(true) {\n 1082│                assert!(Instant::now() < deadline, \"boot cycle never settled\");\n*1083│                std::thread::sleep(Duration::from_millis(25));\n 1084│            }\n 1085│            let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;\n 1086│\n     │...\n 1093│            }\n*1094│            let consumed = Instant::now() + Duration::from_secs(10);\n 1095│            while spt_store::projinval::pending_at(&spt_store::projinval::invalidations_dir())\n 1096│                || stats().map(|s| s.pending_refresh).unwrap_or(true)\n 1097│            {\n 1098│                assert!(Instant::now() < consumed, \"burst never consumed\");\n*1099│                std::thread::sleep(Duration::from_millis(25));\n 1100│            }\n 1101│            let s = stats().unwrap();\n 1102│            stop.store(true, Ordering::SeqCst);\n## shellwake.rs\n   5│//! sole job is to fire a wake; while the shell binary runs, no watcher does\n  *6│//! ([`reconcile_once`] flips between them — spt-core owns the flip).\n   7│//!\n   8│//! **Exit-opcode supervision:** the watcher exiting with [`WAKE_OPCODE`] ⇒\n   9│//! the wake resolution ([`resolve_wake`]) brings the shell online. Any other\n    │...\n 245│                    let step = left.min(50);\n*246│                    std::thread::sleep(Duration::from_millis(step));\n 247│                    left -= step;\n 248│                }\n 249│            }\n    │...\n 470│// [impl->REQ-SHELL-2]\n*471│pub fn reconcile_once(\n 472│    owlery: &Path,\n 473│    registered: &[(AdapterRecord, Manifest)],\n 474│    adapters_dir: &Path,\n    │...\n 548│\n*549│/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\n 550│/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\n 551│/// is re-read each sweep (adapter add/remove lands between ticks).\n 552│// [impl->REQ-SHELL-2]\n    │...\n 560│            let registered = spt_runtime::registry::registered(&adapters_dir);\n*561│            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n 562│            // Sleep in slices so a stop lands promptly.\n 563│            let mut left = RECONCILE_INTERVAL_MS;\n 564│            while left > 0 && !stop.load(Ordering::SeqCst) {\n 565│                let step = left.min(100);\n*566│                std::thread::sleep(Duration::from_millis(step));\n 567│                left -= step;\n 568│            }\n 569│        }\n    │...\n 905│        // Offline (the spawn_record default) ⇒ one watcher; never two.\n*906│        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 907│        assert_eq!(set.len(), 1, \"offline + wake_command ⇒ a watcher\");\n*908│        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 909│        assert_eq!(set.len(), 1, \"a second sweep never doubles it\");\n 910│        // The child parked its pid (it is the long sleeper, still up).\n 911│        for _ in 0..100 {\n    │...\n 914│            }\n*915│            std::thread::sleep(Duration::from_millis(20));\n 916│        }\n 917│        let waker_pid: u32 = std::fs::read_to_string(perch.join(WAKER_PID_FILE))\n 918│            .expect(\"waker pid parked\")\n    │...\n 931│        shellinfo::write_shell_info(&perch, &info).unwrap();\n*932│        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 933│        assert_eq!(set.len(), 0, \"onlined instance keeps no watcher\");\n 934│        assert!(\n 935│            !spt_store::proc::is_process_alive(waker_pid),\n    │...\n 943│        std::fs::write(perch.join(WAKER_GAVE_UP_FILE), b\"\").unwrap();\n*944│        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 945│        assert_eq!(set.len(), 0, \"the give-up latch suppresses adoption\");\n 946│    }\n 947│\n    │...\n 989│        let params = fast_params();\n*990│        reconcile_once(owlery, &registered, &adapters_dir, &set, &params);\n 991│        assert_eq!(\n 992│            set.len(),\n 993│            1,"},"isError":false,"timestamp":1784292947134}}
{"type":"message","id":"d486ea31","parentId":"b470abfa","timestamp":"2026-07-17T12:55:54.483Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Retrieving daemon log directory and constants**"},{"type":"toolCall","id":"call_R8O8f7ZxJ4i4Zx4X413ShXND|fc_0148993141920bab016a5a265a67b081958bee211f25cbce10","name":"read","arguments":{"i":"Listing runtime home","path":"C:/Users/decid/AppData/Local/spt-core","selector":null}},{"type":"toolCall","id":"call_vcPwWvrEVlB5b9HIczdCPNhZ|fc_0148993141920bab016a5a265a67c081959f34d066e731bfd0","name":"read","arguments":{"i":"Reading stderr log layout","path":"crates/spt-daemon/src/stderrlog.rs","selector":"1-180"}},{"type":"toolCall","id":"call_xE4S2uXmU2MfMhLMyxB5MYn6|fc_0148993141920bab016a5a265a67c881959fe9a42e74f8c977","name":"read","arguments":{"i":"Reading dispatcher polling loop","path":"crates/spt-daemon/src/dispatch.rs","selector":"500-715,1400-1440"}},{"type":"toolCall","id":"call_RutaAi5x2gAPRXnP0SKR1bYP|fc_0148993141920bab016a5a265a67cc81958924270a96e74a8e","name":"read","arguments":{"i":"Reading livehost loop","path":"crates/spt-daemon/src/livehost.rs","selector":"100-180,1015-1120"}},{"type":"toolCall","id":"call_jFyOGZLcCzSYXWlhEs54QG0C|fc_0148993141920bab016a5a265a67d4819596a55dbe80135434","name":"read","arguments":{"i":"Reading shellwake loop","path":"crates/spt-daemon/src/shellwake.rs","selector":"35-90,450-580"}},{"type":"toolCall","id":"call_P6QrPs3jH3T3uzE7A7J915E2|fc_0148993141920bab016a5a265a67d8819582d69e5148a46fc6","name":"read","arguments":{"i":"Reading project writer loop","path":"crates/spt-daemon/src/projwriter.rs","selector":"35-75,590-690"}},{"type":"toolCall","id":"call_gKGNvXPhJtF3jNnkzbdaNd4k|fc_0148993141920bab016a5a265a67dc8195ba22ada59b694289","name":"read","arguments":{"i":"Reading registry pump worker","path":"crates/spt-daemon/src/pump/registry.rs","selector":"1-260"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":27618,"output":327,"cacheRead":62976,"cacheWrite":0,"totalTokens":90921,"reasoningTokens":35,"cost":{"input":0.13809000000000002,"output":0.009810000000000001,"cacheRead":0.031487999999999995,"cacheWrite":0,"total":0.17938800000000002}},"stopReason":"toolUse","timestamp":1784292947175,"responseId":"resp_0148993141920bab016a5a26536f188195a5ef5291322507d3","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a2654836c81959108c4551dd8fc24","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiZa9Bc2rzIN0TMlXp7RwHN9doCySkw_rKpH3dOtAWefPoHNnhw5DGQP4aQnnIbNcFSfWkSPK57tRCQGsaKOzbJ7N8Vgh10AugnGuQnqKgHC9HLjVx6ncFmnM7F2_r4TrrJYqAT55FMPyGCcBExQdqHFPy2wz-C2pmdU8Qe8tVqbO2Cw16pS2Cm52t1f1BAZCp3DCOjmCHCno-SNL1Mw0NoDVdaXJlLGt-t9FDwaMcGDdmxtg9crc6v72sxJ2pkpGaddZ2VHEi4KZhf4cngQbJV-vmIPeIL09Auqs-ZYSPuwk7ecCbVXa08tq9AA0hlOxf4yWAQBCJZ5EuuvmY5GW53nYAQft-3C-eYBULfeyyKqj4U0c6PWbJ7C04t4-KTjGPixCnIAEqd5Wh0iaMcXkeAQC7fmLLRbxs36EpwEHvthULPtrnEniZTN2iE3Iq6dX-Ocbj1DVpFO_u3_ij2E4yoic4GU-OXRixIGwx-jHomrsuMrRCjndYIcEgSPdU07CyZJJ8CTmfgaH6aDfEoeO7fzZR7957w17cWpeaXw7BFqPGy6GJMPzGzogCyyJW3tJk0e04-O-k-uwMKoTG6Ukbs1NY39GLhgIyzNcSzWT98IES0kgl81artqViven2NT9aDjIyGm6Kf33-5Jsg2xcHQoFaIEWeics9GwSXn0iQIQepsdZCX0HbNutwY3qSUmiLz1hu7eiVEYfsl8g3mpcfPIeJiyeowgqSDme0FFVcfrlgAbrK8kKMqPnHI64ZgUDvgKRObdBscTikUB2jEqgRhXHrt67RymROug9bB-K8b0oYu_kdzWfP8EdO3RDWsGJTq0agjXZra1DjzhYTD7Lb76HpmXilBDDwxIuIBOltf0vK7OcJK9RqL_B0C1svNW7dwN4akEdcvIdpw1o-iFpAUJPu7LiAc5E2YqflSwEGwYsmj-bEfV8ihGvtDKU9s88ZwEqZQ0xJTcEjqd4_9fxeFFBnT-ZYZICRQ0SKjKKkQv-4lxCZ2MgVoY-OIA-e89YWelNiJ1wTF3dbrA27VnFhVjlCm-JFFfdaeFq7BN3q64iA4R2glDlZLU3Pu5L3RxUoWq1q_t6hl09d2Bo2AKUf1g-w==","summary":[{"type":"summary_text","text":"**Retrieving daemon log directory and constants**"}]},{"id":"fc_0148993141920bab016a5a265a67b081958bee211f25cbce10","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing runtime home\",\"path\":\"C:/Users/decid/AppData/Local/spt-core\",\"selector\":null}","call_id":"call_R8O8f7ZxJ4i4Zx4X413ShXND","name":"read"},{"id":"fc_0148993141920bab016a5a265a67c081959f34d066e731bfd0","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stderr log layout\",\"path\":\"crates/spt-daemon/src/stderrlog.rs\",\"selector\":\"1-180\"}","call_id":"call_vcPwWvrEVlB5b9HIczdCPNhZ","name":"read"},{"id":"fc_0148993141920bab016a5a265a67c881959fe9a42e74f8c977","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher polling loop\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"500-715,1400-1440\"}","call_id":"call_xE4S2uXmU2MfMhLMyxB5MYn6","name":"read"},{"id":"fc_0148993141920bab016a5a265a67cc81958924270a96e74a8e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading livehost loop\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":\"100-180,1015-1120\"}","call_id":"call_RutaAi5x2gAPRXnP0SKR1bYP","name":"read"},{"id":"fc_0148993141920bab016a5a265a67d4819596a55dbe80135434","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading shellwake loop\",\"path\":\"crates/spt-daemon/src/shellwake.rs\",\"selector\":\"35-90,450-580\"}","call_id":"call_jFyOGZLcCzSYXWlhEs54QG0C","name":"read"},{"id":"fc_0148993141920bab016a5a265a67d8819582d69e5148a46fc6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project writer loop\",\"path\":\"crates/spt-daemon/src/projwriter.rs\",\"selector\":\"35-75,590-690\"}","call_id":"call_P6QrPs3jH3T3uzE7A7J915E2","name":"read"},{"id":"fc_0148993141920bab016a5a265a67dc8195ba22ada59b694289","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry pump worker\",\"path\":\"crates/spt-daemon/src/pump/registry.rs\",\"selector\":\"1-260\"}","call_id":"call_gKGNvXPhJtF3jNnkzbdaNd4k","name":"read"}]},"duration":7307.128299996257,"ttft":1354.7047999948263,"contextSnapshot":{"promptTokens":90594,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_R8O8f7ZxJ4i4Zx4X413ShXND|fc_0148993141920bab016a5a265a67b081958bee211f25cbce10","toolName":"read","startedAt":"2026-07-17T12:55:54.483Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core"},"intent":"Listing runtime home"},"id":"32f4a19f","parentId":"d486ea31","timestamp":"2026-07-17T12:55:54.483Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_vcPwWvrEVlB5b9HIczdCPNhZ|fc_0148993141920bab016a5a265a67c081959f34d066e731bfd0","toolName":"read","startedAt":"2026-07-17T12:55:54.483Z","args":{"path":"crates/spt-daemon/src/stderrlog.rs"},"intent":"Reading stderr log layout"},"id":"695c53a0","parentId":"32f4a19f","timestamp":"2026-07-17T12:55:54.483Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_xE4S2uXmU2MfMhLMyxB5MYn6|fc_0148993141920bab016a5a265a67c881959fe9a42e74f8c977","toolName":"read","startedAt":"2026-07-17T12:55:54.484Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher polling loop"},"id":"67be60ae","parentId":"695c53a0","timestamp":"2026-07-17T12:55:54.484Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_RutaAi5x2gAPRXnP0SKR1bYP|fc_0148993141920bab016a5a265a67cc81958924270a96e74a8e","toolName":"read","startedAt":"2026-07-17T12:55:54.484Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Reading livehost loop"},"id":"d6dfdada","parentId":"67be60ae","timestamp":"2026-07-17T12:55:54.484Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_jFyOGZLcCzSYXWlhEs54QG0C|fc_0148993141920bab016a5a265a67d4819596a55dbe80135434","toolName":"read","startedAt":"2026-07-17T12:55:54.484Z","args":{"path":"crates/spt-daemon/src/shellwake.rs"},"intent":"Reading shellwake loop"},"id":"c033cab3","parentId":"d6dfdada","timestamp":"2026-07-17T12:55:54.484Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_P6QrPs3jH3T3uzE7A7J915E2|fc_0148993141920bab016a5a265a67d8819582d69e5148a46fc6","toolName":"read","startedAt":"2026-07-17T12:55:54.484Z","args":{"path":"crates/spt-daemon/src/projwriter.rs"},"intent":"Reading project writer loop"},"id":"6bcf5046","parentId":"c033cab3","timestamp":"2026-07-17T12:55:54.484Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gKGNvXPhJtF3jNnkzbdaNd4k|fc_0148993141920bab016a5a265a67dc8195ba22ada59b694289","toolName":"read","startedAt":"2026-07-17T12:55:54.484Z","args":{"path":"crates/spt-daemon/src/pump/registry.rs"},"intent":"Reading registry pump worker"},"id":"9862970f","parentId":"6bcf5046","timestamp":"2026-07-17T12:55:54.484Z"}
{"type":"message","id":"80163de4","parentId":"9862970f","timestamp":"2026-07-17T12:55:54.506Z","message":{"role":"toolResult","toolCallId":"call_jFyOGZLcCzSYXWlhEs54QG0C|fc_0148993141920bab016a5a265a67d4819596a55dbe80135434","toolName":"read","content":[{"type":"text","text":"use spt_runtime::registry::AdapterRecord;\nuse spt_store::shellinfo::{self, SHELL_STATUS_OFFLINE};\n\n/// The wake opcode (documented in `docs/MANIFEST.md` §Shell adapters): a\n/// wake-watcher exiting with **86** fires the wake resolution; every other\n/// exit is a crash.\npub const WAKE_OPCODE: i32 = 86;\n\n/// The running watcher's OS pid, parked on the shell perch — the\n/// one-watcher-per-instance lock and the cross-daemon-restart kill handle.\npub const WAKER_PID_FILE: &str = \"waker.pid\";\n\n/// The give-up latch: present ⇒ the watcher crash-looped past its budget and\n/// the reconciler must NOT restart it. Cleared by the next shell activity\n/// (any (re)launch — [`crate::shellhost::launch_shell`]).\npub const WAKER_GAVE_UP_FILE: &str = \"waker.gaveup\";\n\n/// Watcher supervision knobs (injectable for tests; defaults are production).\n#[derive(Debug, Clone, Copy)]\npub struct WakeParams {\n    /// First-crash respawn delay; doubles per consecutive crash.\n    pub backoff_base_ms: u64,\n    /// Backoff ceiling.\n    pub backoff_cap_ms: u64,\n    /// Consecutive crash-exits before the give-up latch drops.\n    pub give_up_after: u32,\n}\n\nimpl Default for WakeParams {\n    fn default() -> Self {\n        Self {\n            backoff_base_ms: 1_000,\n            backoff_cap_ms: 60_000,\n            give_up_after: 6,\n        }\n    }\n}\n\n/// Exponential backoff for `failures` consecutive crash-exits:\n/// `base × 2^(failures-1)`, saturating at the cap (the\n/// `spt-net::pairing::ratelimit` recipe). Zero failures ⇒ no wait.\n// [impl->REQ-SHELL-2]\npub fn backoff_ms(params: &WakeParams, failures: u32) -> u64 {\n    if failures == 0 {\n        return 0;\n    }\n    params\n        .backoff_base_ms\n        .saturating_mul(1u64 << (failures - 1).min(20))\n        .min(params.backoff_cap_ms)\n}\n\n/// The live watcher registry: one supervision thread per offline instance,\n/// keyed `owner/shell_id`. Shared between the daemon's reconcile loop and\n/// anything that must stop a watcher.\n#[derive(Default)]\n…\nfn fill_wake_command(\n…\n) -> Result<Vec<String>, String> {\n…\n    let tokens =\n        spt_runtime::runtime::fill_template_tokens(wake_command, &keys).map_err(|e| e.to_string())?;\n    if tokens.is_empty() {\n        return Err(\"empty wake_command\".into());\n    }\n    Ok(tokens)\n}\n\n/// One reconcile sweep — the invariant holder for the online/offline mutual\n/// exclusivity (CONTEXT: \"spt-core flips between them\"):\n///\n/// - **offline + `wake_command` + no give-up latch + no live watcher** ⇒\n///   kill any orphaned waker pid (a dead daemon's leftover), then start a\n///   supervision thread.\n/// - **not offline (onlined / torn down / deregistered) + live watcher** ⇒\n///   stop it (flag + kill).\n///\n/// Runs at daemon boot and every tick — lifecycle flips happen in CLI-process\n/// library code, so the *reconciler* holds the invariant, not the flipping\n/// caller; a flip is at most one tick stale.\n// [impl->REQ-SHELL-2]\npub fn reconcile_once(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n    set: &Arc<WakeSet>,\n    params: &WakeParams,\n) {\n    // Stop side first: watchers whose instance is gone or no longer eligible.\n    let live: Vec<(String, String)> = {\n        let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.retain(|_, h| !h.thread.is_finished());\n        map.keys().cloned().collect()\n    };\n    for (owner, shell_id) in live {\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n        let still_eligible = shellinfo::read_shell_info(&perch)\n            .map(|i| i.status == SHELL_STATUS_OFFLINE)\n            .unwrap_or(false);\n        if !still_eligible {\n            set.stop_watcher(owlery, &owner, &shell_id);\n        }\n    }\n\n    // Start side: every offline instance with a wake_command and headroom.\n    for owner in spt_store::perch::list_self_perch_ids(owlery) {\n        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\n            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\n                continue;\n            }\n            let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {\n                continue; // deregistered adapter: nothing to run\n            };\n            let Some(wake_command) = shell.wake_command.as_deref() else {\n                continue;\n            };\n            let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n            if perch.join(WAKER_GAVE_UP_FILE).exists() {\n                continue; // crash-latched until the next shell activity\n            }\n            // Adopt cleanly: a dead daemon's watcher must not double-run.\n            kill_waker_at(&perch);\n            let tokens = match fill_wake_command(&shell_id, &info.adapter_name, wake_command) {\n                Ok(t) => t,\n                Err(e) => {\n                    eprintln!(\"WAKER_TEMPLATE:{owner}/{shell_id}: {e}\");\n                    continue;\n                }\n            };\n            let stop = Arc::new(AtomicBool::new(false));\n            let handle = {\n                let stop = Arc::clone(&stop);\n                let owlery = owlery.to_path_buf();\n                let owner = owner.clone();\n                let shell_id = shell_id.clone();\n                let adapter_name = info.adapter_name.clone();\n                let params = *params;\n                std::thread::spawn(move || {\n                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\n                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\n                    });\n                })\n            };\n            set.insert(\n                &owner,\n                &shell_id,\n                WatcherHandle {\n                    stop,\n                    thread: handle,\n                },\n            );\n        }\n    }\n}\n\n/// The reconcile cadence (ms): lifecycle flips land in CLI processes, so the\n/// daemon's loop is the invariant holder — a flip is at most one tick stale.\npub const RECONCILE_INTERVAL_MS: u64 = 5_000;\n\n/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\n/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\n/// is re-read each sweep (adapter add/remove lands between ticks).\n// [impl->REQ-SHELL-2]\npub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(WakeSet::new());\n        let params = WakeParams::default();\n        while !stop.load(Ordering::SeqCst) {\n            let owlery = spt_store::perch::owlery_dir();\n            let adapters_dir = spt_store::perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};\n\n    fn fast_params() -> WakeParams {\n        WakeParams {\n            backoff_base_ms: 10,\n…\n        }\n    }\n…\n}"}],"details":{"displayContent":{"text":"use spt_runtime::registry::AdapterRecord;\nuse spt_store::shellinfo::{self, SHELL_STATUS_OFFLINE};\n\n/// The wake opcode (documented in `docs/MANIFEST.md` §Shell adapters): a\n/// wake-watcher exiting with **86** fires the wake resolution; every other\n/// exit is a crash.\npub const WAKE_OPCODE: i32 = 86;\n\n/// The running watcher's OS pid, parked on the shell perch — the\n/// one-watcher-per-instance lock and the cross-daemon-restart kill handle.\npub const WAKER_PID_FILE: &str = \"waker.pid\";\n\n/// The give-up latch: present ⇒ the watcher crash-looped past its budget and\n/// the reconciler must NOT restart it. Cleared by the next shell activity\n/// (any (re)launch — [`crate::shellhost::launch_shell`]).\npub const WAKER_GAVE_UP_FILE: &str = \"waker.gaveup\";\n\n/// Watcher supervision knobs (injectable for tests; defaults are production).\n#[derive(Debug, Clone, Copy)]\npub struct WakeParams {\n    /// First-crash respawn delay; doubles per consecutive crash.\n    pub backoff_base_ms: u64,\n    /// Backoff ceiling.\n    pub backoff_cap_ms: u64,\n    /// Consecutive crash-exits before the give-up latch drops.\n    pub give_up_after: u32,\n}\n\nimpl Default for WakeParams {\n    fn default() -> Self {\n        Self {\n            backoff_base_ms: 1_000,\n            backoff_cap_ms: 60_000,\n            give_up_after: 6,\n        }\n    }\n}\n\n/// Exponential backoff for `failures` consecutive crash-exits:\n/// `base × 2^(failures-1)`, saturating at the cap (the\n/// `spt-net::pairing::ratelimit` recipe). Zero failures ⇒ no wait.\n// [impl->REQ-SHELL-2]\npub fn backoff_ms(params: &WakeParams, failures: u32) -> u64 {\n    if failures == 0 {\n        return 0;\n    }\n    params\n        .backoff_base_ms\n        .saturating_mul(1u64 << (failures - 1).min(20))\n        .min(params.backoff_cap_ms)\n}\n\n/// The live watcher registry: one supervision thread per offline instance,\n/// keyed `owner/shell_id`. Shared between the daemon's reconcile loop and\n/// anything that must stop a watcher.\n#[derive(Default)]\n…\nfn fill_wake_command(\n…\n) -> Result<Vec<String>, String> {\n…\n    let tokens =\n        spt_runtime::runtime::fill_template_tokens(wake_command, &keys).map_err(|e| e.to_string())?;\n    if tokens.is_empty() {\n        return Err(\"empty wake_command\".into());\n    }\n    Ok(tokens)\n}\n\n/// One reconcile sweep — the invariant holder for the online/offline mutual\n/// exclusivity (CONTEXT: \"spt-core flips between them\"):\n///\n/// - **offline + `wake_command` + no give-up latch + no live watcher** ⇒\n///   kill any orphaned waker pid (a dead daemon's leftover), then start a\n///   supervision thread.\n/// - **not offline (onlined / torn down / deregistered) + live watcher** ⇒\n///   stop it (flag + kill).\n///\n/// Runs at daemon boot and every tick — lifecycle flips happen in CLI-process\n/// library code, so the *reconciler* holds the invariant, not the flipping\n/// caller; a flip is at most one tick stale.\n// [impl->REQ-SHELL-2]\npub fn reconcile_once(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n    set: &Arc<WakeSet>,\n    params: &WakeParams,\n) {\n    // Stop side first: watchers whose instance is gone or no longer eligible.\n    let live: Vec<(String, String)> = {\n        let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.retain(|_, h| !h.thread.is_finished());\n        map.keys().cloned().collect()\n    };\n    for (owner, shell_id) in live {\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n        let still_eligible = shellinfo::read_shell_info(&perch)\n            .map(|i| i.status == SHELL_STATUS_OFFLINE)\n            .unwrap_or(false);\n        if !still_eligible {\n            set.stop_watcher(owlery, &owner, &shell_id);\n        }\n    }\n\n    // Start side: every offline instance with a wake_command and headroom.\n    for owner in spt_store::perch::list_self_perch_ids(owlery) {\n        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\n            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\n                continue;\n            }\n            let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {\n                continue; // deregistered adapter: nothing to run\n            };\n            let Some(wake_command) = shell.wake_command.as_deref() else {\n                continue;\n            };\n            let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n            if perch.join(WAKER_GAVE_UP_FILE).exists() {\n                continue; // crash-latched until the next shell activity\n            }\n            // Adopt cleanly: a dead daemon's watcher must not double-run.\n            kill_waker_at(&perch);\n            let tokens = match fill_wake_command(&shell_id, &info.adapter_name, wake_command) {\n                Ok(t) => t,\n                Err(e) => {\n                    eprintln!(\"WAKER_TEMPLATE:{owner}/{shell_id}: {e}\");\n                    continue;\n                }\n            };\n            let stop = Arc::new(AtomicBool::new(false));\n            let handle = {\n                let stop = Arc::clone(&stop);\n                let owlery = owlery.to_path_buf();\n                let owner = owner.clone();\n                let shell_id = shell_id.clone();\n                let adapter_name = info.adapter_name.clone();\n                let params = *params;\n                std::thread::spawn(move || {\n                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\n                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\n                    });\n                })\n            };\n            set.insert(\n                &owner,\n                &shell_id,\n                WatcherHandle {\n                    stop,\n                    thread: handle,\n                },\n            );\n        }\n    }\n}\n\n/// The reconcile cadence (ms): lifecycle flips land in CLI processes, so the\n/// daemon's loop is the invariant holder — a flip is at most one tick stale.\npub const RECONCILE_INTERVAL_MS: u64 = 5_000;\n\n/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\n/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\n/// is re-read each sweep (adapter add/remove lands between ticks).\n// [impl->REQ-SHELL-2]\npub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(WakeSet::new());\n        let params = WakeParams::default();\n        while !stop.load(Ordering::SeqCst) {\n            let owlery = spt_store::perch::owlery_dir();\n            let adapters_dir = spt_store::perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};\n\n    fn fast_params() -> WakeParams {\n        WakeParams {\n            backoff_base_ms: 10,\n…\n        }\n    }\n…\n}","startLine":35,"lineNumbers":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,null,435,null,439,null,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,null,583,584,null,1000]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\shellwake.rs"}}},"isError":false,"timestamp":1784292954505}}
{"type":"message","id":"a947d4d9","parentId":"80163de4","timestamp":"2026-07-17T12:55:54.506Z","message":{"role":"toolResult","toolCallId":"call_RutaAi5x2gAPRXnP0SKR1bYP|fc_0148993141920bab016a5a265a67cc81958924270a96e74a8e","toolName":"read","content":[{"type":"text","text":"impl LiveSet {\n…\n    fn insert(&self, id: &str, handle: HostedLife) {\n        let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.insert(id.to_string(), handle);\n    }\n\n    /// The currently-tabled ids (finished pruned) — the stop-side reconcile input.\n    fn ids(&self) -> Vec<String> {\n        let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.retain(|_, h| !h.thread.is_finished());\n        map.keys().cloned().collect()\n    }\n\n    /// Un-host one lifecycle: trip its stop flag, join the driver, de-table. The\n    /// pulse loop checks the flag each sleep-slice, so the join is prompt. We do\n    /// NOT re-stamp `offline` — the perch already left the online set (graceful\n    /// signoff cleared it, or the perch is gone); a brain *crash* deliberately\n    /// leaves `status=online` so the next brain rehydrates it (CONTEXT:194).\n    fn stop_host(&self, id: &str) {\n        let handle = {\n            let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n            map.remove(id)\n        };\n        if let Some(h) = handle {\n            h.stop.store(true, Ordering::SeqCst);\n            let _ = h.thread.join();\n            // F-030 W3: nothing detached to reap — the per-event psyche driver spawns\n            // no resident child, so joining the driver thread + de-tabling above is the\n            // whole un-host (the resident-psyche handle-reap + orphan-reap retired with\n            // the residency machinery). Un-hosting a genuinely-offline endpoint is legit.\n        }\n    }\n}\n\n/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n///\n/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\n/// - **host** (online ∧ ¬tabled) — spawn the Psyche + start the driver.\n/// - **leave-alone** (online ∧ tabled).\n///\n/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are\n/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.\n// [impl->REQ-DAEMON-1]\npub fn reconcile_once(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n    set: &Arc<LiveSet>,\n    cfg: &DaemonConfig,\n    reason: StartReason,\n) {\n    // Stop side first: hosted endpoints that DEFINITIVELY left the online set —\n    // trip the flag, join, de-table. Un-host on a definitive departure ONLY, never\n    // on a TRANSIENT read failure (M11-W0.4 (ii)): a momentarily-unreadable\n    // info.json must not stop+respawn the driver (Psyche churn on a disk blip). The\n    // discriminator is the perch DIR:\n    //   - dir gone        → torn down (teardown removed the perch) → un-host;\n    //   - dir present, read_info Some(status≠online) → signed-off/offline → un-host;\n    //   - dir present, read_info None (transient/torn read) → LEAVE the driver, retry.\n    // [impl->REQ-DAEMON-1]\n    for id in set.ids() {\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n        let unhost = if !perch.exists() {\n            true // the perch dir is gone — torn down\n        } else {\n            match spt_store::info::read_info(&perch) {\n                Some(info) => info.status.as_deref() != Some(STATUS_ONLINE),\n                None => false, // dir present but unreadable: transient → keep hosting\n            }\n        };\n        if unhost {\n            set.stop_host(&id);\n            continue;\n        }\n        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\n        // with the resident psyche (a psyche is now a bounded per-event turn, not a\n        // process to confirm resident / rate-limit / reap). A psyche that cannot work\n        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\n        // stamps `psyche_host_error` on the PARENT — psyche fields only, NEVER the\n…\n    }\n…\n}\n…\n/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).\nfn fresh_live_bin_old(live_bin: &Path) -> PathBuf {\n    let base = live_bin.with_file_name(\".live-bin.old\");\n    if !base.exists() {\n        return base;\n    }\n    for n in 1u64.. {\n        let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));\n        if !candidate.exists() {\n            return candidate;\n        }\n    }\n    unreachable!(\"an unbounded search for a free .live-bin.old-N name always terminates\")\n}\n\n/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n/// config are re-read each sweep (adapter / pulse-period changes land between\n/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n/// for symmetry — the threads die with the brain process and the next brain\n/// rehydrates from disk.\n// [impl->REQ-DAEMON-1]\npub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(LiveSet::new());\n        {\n            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n            // BEFORE the first reconcile, bury any pre-W3 psyche WRAPPER a cross-version\n            // upgrade left ALIVE-but-hung (it registered its `<id>-psyche` ready perch then\n            // blocked forever on `spt ready --once`; the per-event driver never delivers to\n            // it). Fires exactly once at brain start (never per-reconcile) — the retired\n            // residency machinery's corpse-burial, not its resurrection.\n            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            sweep_legacy_resident_psyches(&owlery, &registered, &adapters_dir);\n            // F-030 W5 ONE-SHOT `.live-bin` GC — ORDERED AFTER the sweep so any wrapper\n            // running FROM the own-copy image is killed first (its dir then unlocks).\n            gc_live_bin_dirs(&owlery);\n            // LIFECYCLE-TRUTH W3 ONE-SHOT daemon-restart endpoint survival\n            // (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL): re-run the harness of every\n            // previously-ONLINE spt-hosted endpoint this (re)start orphaned, BEFORE the\n            // reconcile loop's phantom-clear offlines the stale-online records (the \"was\n            // online\" signal). A brain restart with a surviving broker re-runs nothing\n            // (its sessions are live, not orphaned). Belts inside the gate.\n            // [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\n            resume_restart_orphaned_endpoints(&owlery, &registered, &adapters_dir);\n        }\n        while !stop.load(Ordering::SeqCst) {\n            // TEST-ONLY gate `SPT_LIVEHOST_RECONCILE_DISABLE` (runtime env, DEFAULT\n            // unset = normal production, untouched): skip the reconcile poll+body so an\n            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\n            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\n            // 30s kill, so it never drove the reap) — the exact failure mode the fix\n            // makes the wedge-reap independent of. Runtime env (not cfg(test)): the rig\n            // spawns a real release `spt daemon brain` child cfg(test) can't reach — the\n            // SPT_BRAIN_WRITE_DEADLINE_MS precedent. Still honors `stop` on a tight tick.\n            // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\n            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n                std::thread::sleep(Duration::from_millis(100));\n                continue;\n            }\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            let cfg = DaemonConfig::load();\n            // B2 keystone (REQ-HAZARD-HOSTED-LIVENESS-RECONCILE) + B5 boot-gate\n            // (REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE): clear the status=online\n            // latch for any spt-hosted endpoint whose broker session is gone — and\n            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\n            // so the same-tick stop-side un-hosts the now-offline perch and the\n            // start-side never REVIVES its Psyche. The boot-gate is what stops a\n            // cold start after an unclean stop from spawning N phantom Psyches for N\n            // dead-but-latched perches. Skipped only when the broker is unreachable\n            // (None) — never mass-offline on a hiccup; safe at tick 1 because\n            // run_brain connects to the broker BEFORE this host spawns, so the query\n            // returns the REAL session set: empty at a cold start (every online\n            // controllable perch is a phantom → offlined), the surviving sessions at\n            // a brain restart (live agents stay, only the dead are offlined). The\n            // controllable==Some(true) gate inside keeps relay/legacy perches exempt.\n            // [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\n            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\n            if let Some(live) = query_live_session_endpoints() {\n                reconcile_hosted_liveness(&owlery, &live);\n            }\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n…\n}"}],"details":{"displayContent":{"text":"impl LiveSet {\n…\n    fn insert(&self, id: &str, handle: HostedLife) {\n        let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.insert(id.to_string(), handle);\n    }\n\n    /// The currently-tabled ids (finished pruned) — the stop-side reconcile input.\n    fn ids(&self) -> Vec<String> {\n        let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.retain(|_, h| !h.thread.is_finished());\n        map.keys().cloned().collect()\n    }\n\n    /// Un-host one lifecycle: trip its stop flag, join the driver, de-table. The\n    /// pulse loop checks the flag each sleep-slice, so the join is prompt. We do\n    /// NOT re-stamp `offline` — the perch already left the online set (graceful\n    /// signoff cleared it, or the perch is gone); a brain *crash* deliberately\n    /// leaves `status=online` so the next brain rehydrates it (CONTEXT:194).\n    fn stop_host(&self, id: &str) {\n        let handle = {\n            let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());\n            map.remove(id)\n        };\n        if let Some(h) = handle {\n            h.stop.store(true, Ordering::SeqCst);\n            let _ = h.thread.join();\n            // F-030 W3: nothing detached to reap — the per-event psyche driver spawns\n            // no resident child, so joining the driver thread + de-tabling above is the\n            // whole un-host (the resident-psyche handle-reap + orphan-reap retired with\n            // the residency machinery). Un-hosting a genuinely-offline endpoint is legit.\n        }\n    }\n}\n\n/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n///\n/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\n/// - **host** (online ∧ ¬tabled) — spawn the Psyche + start the driver.\n/// - **leave-alone** (online ∧ tabled).\n///\n/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are\n/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.\n// [impl->REQ-DAEMON-1]\npub fn reconcile_once(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n    set: &Arc<LiveSet>,\n    cfg: &DaemonConfig,\n    reason: StartReason,\n) {\n    // Stop side first: hosted endpoints that DEFINITIVELY left the online set —\n    // trip the flag, join, de-table. Un-host on a definitive departure ONLY, never\n    // on a TRANSIENT read failure (M11-W0.4 (ii)): a momentarily-unreadable\n    // info.json must not stop+respawn the driver (Psyche churn on a disk blip). The\n    // discriminator is the perch DIR:\n    //   - dir gone        → torn down (teardown removed the perch) → un-host;\n    //   - dir present, read_info Some(status≠online) → signed-off/offline → un-host;\n    //   - dir present, read_info None (transient/torn read) → LEAVE the driver, retry.\n    // [impl->REQ-DAEMON-1]\n    for id in set.ids() {\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n        let unhost = if !perch.exists() {\n            true // the perch dir is gone — torn down\n        } else {\n            match spt_store::info::read_info(&perch) {\n                Some(info) => info.status.as_deref() != Some(STATUS_ONLINE),\n                None => false, // dir present but unreadable: transient → keep hosting\n            }\n        };\n        if unhost {\n            set.stop_host(&id);\n            continue;\n        }\n        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\n        // with the resident psyche (a psyche is now a bounded per-event turn, not a\n        // process to confirm resident / rate-limit / reap). A psyche that cannot work\n        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\n        // stamps `psyche_host_error` on the PARENT — psyche fields only, NEVER the\n…\n    }\n…\n}\n…\n/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).\nfn fresh_live_bin_old(live_bin: &Path) -> PathBuf {\n    let base = live_bin.with_file_name(\".live-bin.old\");\n    if !base.exists() {\n        return base;\n    }\n    for n in 1u64.. {\n        let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));\n        if !candidate.exists() {\n            return candidate;\n        }\n    }\n    unreachable!(\"an unbounded search for a free .live-bin.old-N name always terminates\")\n}\n\n/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n/// config are re-read each sweep (adapter / pulse-period changes land between\n/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n/// for symmetry — the threads die with the brain process and the next brain\n/// rehydrates from disk.\n// [impl->REQ-DAEMON-1]\npub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(LiveSet::new());\n        {\n            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n            // BEFORE the first reconcile, bury any pre-W3 psyche WRAPPER a cross-version\n            // upgrade left ALIVE-but-hung (it registered its `<id>-psyche` ready perch then\n            // blocked forever on `spt ready --once`; the per-event driver never delivers to\n            // it). Fires exactly once at brain start (never per-reconcile) — the retired\n            // residency machinery's corpse-burial, not its resurrection.\n            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            sweep_legacy_resident_psyches(&owlery, &registered, &adapters_dir);\n            // F-030 W5 ONE-SHOT `.live-bin` GC — ORDERED AFTER the sweep so any wrapper\n            // running FROM the own-copy image is killed first (its dir then unlocks).\n            gc_live_bin_dirs(&owlery);\n            // LIFECYCLE-TRUTH W3 ONE-SHOT daemon-restart endpoint survival\n            // (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL): re-run the harness of every\n            // previously-ONLINE spt-hosted endpoint this (re)start orphaned, BEFORE the\n            // reconcile loop's phantom-clear offlines the stale-online records (the \"was\n            // online\" signal). A brain restart with a surviving broker re-runs nothing\n            // (its sessions are live, not orphaned). Belts inside the gate.\n            // [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\n            resume_restart_orphaned_endpoints(&owlery, &registered, &adapters_dir);\n        }\n        while !stop.load(Ordering::SeqCst) {\n            // TEST-ONLY gate `SPT_LIVEHOST_RECONCILE_DISABLE` (runtime env, DEFAULT\n            // unset = normal production, untouched): skip the reconcile poll+body so an\n            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\n            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\n            // 30s kill, so it never drove the reap) — the exact failure mode the fix\n            // makes the wedge-reap independent of. Runtime env (not cfg(test)): the rig\n            // spawns a real release `spt daemon brain` child cfg(test) can't reach — the\n            // SPT_BRAIN_WRITE_DEADLINE_MS precedent. Still honors `stop` on a tight tick.\n            // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\n            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n                std::thread::sleep(Duration::from_millis(100));\n                continue;\n            }\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            let cfg = DaemonConfig::load();\n            // B2 keystone (REQ-HAZARD-HOSTED-LIVENESS-RECONCILE) + B5 boot-gate\n            // (REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE): clear the status=online\n            // latch for any spt-hosted endpoint whose broker session is gone — and\n            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\n            // so the same-tick stop-side un-hosts the now-offline perch and the\n            // start-side never REVIVES its Psyche. The boot-gate is what stops a\n            // cold start after an unclean stop from spawning N phantom Psyches for N\n            // dead-but-latched perches. Skipped only when the broker is unreachable\n            // (None) — never mass-offline on a hiccup; safe at tick 1 because\n            // run_brain connects to the broker BEFORE this host spawns, so the query\n            // returns the REAL session set: empty at a cold start (every online\n            // controllable perch is a phantom → offlined), the surviving sessions at\n            // a brain restart (live agents stay, only the dead are offlined). The\n            // controllable==Some(true) gate inside keeps relay/legacy perches exempt.\n            // [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\n            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\n            if let Some(live) = query_live_session_endpoints() {\n                reconcile_hosted_liveness(&owlery, &live);\n            }\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n…\n}","startLine":70,"lineNumbers":[70,null,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,null,185,null,269,null,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,null,2332]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs"}}},"isError":false,"timestamp":1784292954505}}
{"type":"message","id":"69919048","parentId":"a947d4d9","timestamp":"2026-07-17T12:55:54.507Z","message":{"role":"toolResult","toolCallId":"call_R8O8f7ZxJ4i4Zx4X413ShXND|fc_0148993141920bab016a5a265a67b081958bee211f25cbce10","toolName":"read","content":[{"type":"text","text":".\n  - owlery/\n    - hertz/\n    - mobile-gw/\n    - todlando/                                                   just now\n    - lia/                                                        just now\n    - doyle/                                                      just now\n    - webbie/                                                     8m ago\n    - deployah/                                                   8m ago\n    - .registry                                         12.0KB    8m ago\n    - perri/                                                      8m ago\n    - emphasys/                                                   8m ago\n    - chert/                                                      7h ago\n    - … 16 more\n    - sptc-diag-2/                                                3w ago\n  - brain.ready\n  - identity/\n    - epoch\n    - pump-heartbeat.json                               13B       just now\n    - registry/                                                   just now\n    - pump-health.json                                  766B      just now\n    - pump-ops.json                                     5B        just now\n    - peer-addrs.json                                   4.0KB     6m ago\n    - roster.json                                       10.0KB    6m ago\n    - notifs.db                                         52.0KB    8m ago\n    - attachment.json                                   20B       8m ago\n    - cli-ops.json                                      3B        7h ago\n    - visibility.json                                   2.8KB     13h ago\n    - … 8 more\n    - node.key                                          64B       1mo ago\n  - daemon-effects.log                                  1.4MB     just now\n  - index/                                                        1m ago\n    - project-index-stats.json                          395B      1m ago\n    - project-index.json                                5.8KB     1m ago\n    - invalidations/                                              8m ago\n  - deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json  46B       6m ago\n  - daemon.pid                                          5B        8m ago\n  - deadline-e5b62b57-69a0-452c-9c7e-cd3708186344.json  46B       8m ago\n  - deadline-b155a5e6-a87c-416f-b029-d9cbc4ffd83e.json  46B       8m ago\n  - deadline-89cc9038-e5d9-429e-b4a9-40fba8af71ee.json  46B       8m ago\n  - docs/                                                         8m ago\n    - .nojekyll                                         72B       13m ago\n    - 404.html                                          19.2KB    13m ago\n    - ayu-highlight-3fdfc3ac.css                        907B      13m ago\n    - book-c22b7243.js                                  29.8KB    13m ago\n    - cli/                                                        13m ago\n    - clipboard-1626706a.min.js                         10.5KB    13m ago\n    - concepts/                                                   13m ago\n    - css/                                                        13m ago\n    - elasticlunr-ef4e11c1.min.js                       17.6KB    13m ago\n    - favicon-8114d1fc.png                              5.5KB     13m ago\n    - favicon-de23e50b.svg                              1.8KB     13m ago\n    - … 26 more\n    - tomorrow-night-4c0ae647.css                       1.7KB     13m ago\n  - releases/                                                     8m ago\n    - last-outcome.json                                 21B       8m ago\n    - applied.json                                      14B       8m ago\n    - applied-state.json                                32B       8m ago\n    - artifacts/                                                  9m ago\n    - release.json                                      1.1KB     9m ago\n  - logs/                                                         9m ago\n    - daemon.stderr.log                                 518.7KB   just now\n    - daemon.stderr.log.1                               23.0MB    9m ago\n  - bin/                                                          9m ago\n    - spt.exe                                           30.8MB    9m ago\n    - spt.exe.old-64                                    30.6MB    7h ago\n    - spt.exe.old-63                                    30.6MB    11h ago\n    - spt.exe.old-62                                    30.6MB    22h ago\n    - spt.exe.old-61                                    30.6MB    1d ago\n    - spt.exe.old-60                                    30.3MB    1d ago\n    - spt.exe.old-59                                    30.3MB    1d ago\n    - spt.exe.old-58                                    29.8MB    1w ago\n    - spt.exe.old-57                                    29.8MB    1w ago\n    - spt.exe.old-56                                    29.7MB    1w ago\n    - spt.exe.old-55                                    29.8MB    1w ago\n    - … 18 more\n    - spt.exe.old-32                                    28.5MB    3w ago\n  - deadline-9183c374-ac41-4e0a-b478-a8b19f32f855.json  46B       7h ago\n  - daemon.json                                         651B      11h ago\n  - deadline-fc582bea-2d15-4077-b21a-086cbcbe3cee.json  46B       11h ago\n  - recent_home                                         14B       13h ago\n  - recent_home_projects/                                         13h ago\n    - github-com-bigscreenvr-website                    6B        13h ago\n    - github-com-bigscreenvr-spt-bs-core                7B        1d ago\n    - github-com-bigscreenvr-omp-spt                    7B        2d ago\n    - github-com-sabermage-claude-spt                   7B        6d ago\n    - github-com-sabermage-spt-core                     7B        1w ago\n    - scratchpad                                        7B        1w ago\n    - liaison                                           7B        1w ago\n    - github-com-sabermage-spt-mobile                   7B        1w ago\n    - projects                                          7B        1w ago\n    - wakefin3-cwd                                      7B        1w ago\n    - wakefin2-cwd                                      7B        1w ago\n    - … 14 more\n    - github-com-sabermage-spt-claude-code              7B        3w ago\n  - deadline-a2fdb848-6643-4e10-b221-6baee7e91b7b.json  46B       15h ago\n  - deadline-bf353802-556c-46ce-9865-e74a3092bbe9.json  46B       15h ago\n  - deadline-9e0df17e-f217-4446-97a4-f528a56024ba.json  46B       22h ago\n  - deadline-7818eabc-d26c-4a0b-965c-b600016f1cea.json  46B       22h ago\n  - deadline-e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b.json  46B       22h ago\n  - deadline-c1427211-6e8d-4571-aeb8-30d36fa816a6.json  46B       1d ago\n  - deadline-6389a46d-930f-4662-b560-293532307149.json  46B       1d ago\n  - deadline-cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde.json  46B       1d ago\n  - deadline-058dcb6f-1586-47a0-a0cd-0a4a085881ca.json  46B       1d ago\n  - deadline-b4fe0587-e19f-4b78-81a8-c97931c52126.json  46B       1d ago\n  - deadline-59cfcf11-f9d7-4967-a9bc-8892efb0f320.json  46B       1d ago\n  - deadline-019f656e-6a10-7000-8949-19c300a9ae4a.json  46B       2d ago\n  - deadline-019f6560-0096-7000-b53f-7ab1ea3d2bcf.json  46B       2d ago\n  - deadline-3d75265c-0071-44a0-98fa-3d748c66b87f.json  46B       2d ago\n  - deadline-1fae2b4c-9daf-44fc-afe5-06c410ac69b8.json  46B       2d ago\n  - deadline-f4df7cba-aae5-46c6-aa4f-50d2fb874894.json  46B       2d ago\n  - deadline-48d40117-34b1-4da6-b8ca-d86bb9257bcc.json  46B       6d ago\n  - deadline-acf536b2-2832-4253-ba8a-b6f2ade00060.json  46B       6d ago\n  - deadline-ecd15339-2c75-4e4c-ba1a-2c25bd437233.json  46B       6d ago\n  - deadline-f4c1fc0e-de8e-4df0-8416-f01761a944cb.json  46B       6d ago\n  - deadline-5b71855b-82d2-483b-908f-4b2c3f57db84.json  46B       6d ago\n  - deadline-a053d1d6-5b05-4f34-a3ff-15b7269b7675.json  46B       6d ago\n  - deadline-c9c02696-1ec3-4319-8b23-b7f72090fdb3.json  46B       6d ago\n  - deadline-4738b82a-2512-44ea-b542-a7816dc01f46.json  46B       6d ago\n  - deadline-972aa6de-2f09-4a45-8a7c-89eee469fb5f.json  46B       1w ago\n  - deadline-0d3ec7f7-e517-4bf7-8016-4f422d4e8d7d.json  46B       1w ago\n  - deadline-26c49822-00bc-4abe-8be2-91f44b9e4fea.json  46B       1w ago\n  - deadline-6cf22920-8f60-4a09-9b8d-7d46280f9a8c.json  46B       1w ago\n  - deadline-6a623999-3605-40e4-8991-c27d0467ffc0.json  46B       1w ago\n  - deadline-feec8b93-34d3-41da-b2cc-6874150e6916.json  46B       1w ago\n  - deadline-0fe6cad5-3efb-4ced-8031-d9a41e22ff81.json  46B       1w ago\n  - deadline-a54257af-8b81-456c-ba38-85739f7f10e9.json  46B       1w ago\n  - deadline-50b0fc81-455e-4b65-8e93-f7400599c6c6.json  46B       1w ago\n  - deadline-175d35a3-4eca-4ac8-8885-261f29f277ef.json  46B       1w ago\n  - rca-active-20260709-222659/                                   1w ago\n    - status.active.json                                2.3KB     1w ago\n    - daemon.stderr.active.log                          1.2MB     1w ago\n    - keep-rc.ps1                                       219B      1w ago\n    - lia.stdin                                         1B        1w ago\n    - doyle.stdin                                       1B        1w ago\n    - flynn.stdin                                       1B        1w ago\n    - deployah.stdin                                    1B        1w ago\n    - daemon.stderr.log                                 1020.0KB  1w ago\n    - releases.before/                                            1w ago\n    - spt.pre-active.exe                                29.8MB    1w ago\n    - daemon.stderr.log.1                               5.0MB     1w ago\n  - deadline-d1a6c133-f9dc-4619-b4e7-1573677ac68f.json  46B       1w ago\n  - deadline-a5918ea9-d5bf-4657-a6d3-159f6d6634c4.json  46B       1w ago\n  - rca-capture-20260709-215646/                                  1w ago\n    - status.after-apply.json                           2.3KB     1w ago\n    - daemon.stderr.log                                 938.3KB   1w ago\n    - install-and-start.ps1                             964B      1w ago\n    - prepare-and-start.ps1                             2.0KB     1w ago\n    - status.pre.txt                                    1.1KB     1w ago\n    - daemon.stderr.pre.log                             913.8KB   1w ago\n    - releases.before/                                            1w ago\n    - spt.pre-capture.exe                               29.8MB    1w ago\n    - daemon.stderr.log.1                               5.0MB     1w ago\n    - daemon.stderr.pre.log.1                           5.0MB     1w ago\n  - deadline-a2476c7e-db88-40fa-9ec3-ce902985829a.json  46B       1w ago\n  - deadline-21a62f4f-ed92-4d7e-9b82-7831cfe88028.json  46B       1w ago\n  - deadline-812e5b03-e915-4e2e-a1ee-661d33165f74.json  46B       1w ago\n  - deadline-848a1626-51dd-49f2-8336-63a7c1c9ea02.json  46B       1w ago\n  - deadline-b344389f-c6c1-4fb4-953c-bf6eb95d635d.json  46B       1w ago\n  - deadline-9f6809de-dff6-49bd-b83c-fc5e1f455f0e.json  46B       1w ago\n  - adapters/                                                     1w ago\n    - claude-spt/                                                 1d ago\n    - _github/                                                    1d ago\n    - omp-spt/                                                    2d ago\n    - mobile/                                                     1w ago\n    - probe-d1/                                                   2w ago\n    - probe-sptc/                                                 3w ago\n    - active-profiles.toml                              0B        4w ago\n    - probe-spt/                                                  4w ago\n  - deadline-c86c5100-c27b-41ff-a2c0-3f42102676ef.json  46B       1w ago\n  - deadline-586ab982-8ebe-470a-b47a-15332f8edfab.json  46B       1w ago\n  - deadline-6402bb1f-a8b9-46ab-804f-1ebe6272da0a.json  46B       1w ago\n  - deadline-41b1b5f7-6040-4af3-9d83-9336ab847866.json  46B       1w ago\n  - deadline-3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9.json  46B       1w ago\n  - deadline-865cf2a3-f778-49e0-9934-af011cdf38e0.json  46B       1w ago\n  - deadline-ef8f1a4c-b80c-4d35-991d-adeffbad8cd0.json  46B       1w ago\n  - deadline-b317273f-decf-492f-b6d7-a5558a360cdf.json  46B       1w ago\n  - deadline-63fa684a-a93e-4405-a6c5-115f9bccac2a.json  46B       1w ago\n  - deadline-57495b6e-3f65-40bd-b9b7-a7177ccb8a8d.json  46B       1w ago\n  - deadline-2ac55eb7-e705-4c6b-8665-2fcab1cdb922.json  46B       1w ago\n  - deadline-4bc2e259-0e4a-4331-be30-6e6b8230bf2a.json  46B       1w ago\n  - deadline-bbac2312-aca2-4666-95cf-7a0e2144bf3e.json  46B       1w ago\n  - deadline-b76d3b71-a821-490b-bd8d-9b2cf1bf2717.json  46B       1w ago\n  - deadline-df158dbc-6195-4883-90e6-07ce17e09a8e.json  46B       1w ago\n  - deadline-bbd5bbc6-dd2c-4301-9b63-3c61fe194d3b.json  46B       1w ago\n  - deadline-c07f3726-4d6f-4b35-9da2-46772f2938cf.json  46B       1w ago\n  - deadline-41550c80-863e-4c7f-82db-cf1da416289f.json  46B       1w ago\n  - deadline-e6e84eb4-8b78-4a2d-95ff-0cd81e88fd41.json  46B       1w ago\n  - deadline-de244f53-27c7-4ac7-ab09-d2e7c1cd7326.json  46B       1w ago\n  - deadline-13712404-60aa-4dc9-957b-9e854ac0f73d.json  46B       1w ago\n  - deadline-ab18a9b1-56ec-4f34-827c-144947b68957.json  46B       1w ago\n  - deadline-aed3e074-30a9-40a8-87a0-c878bf4bdc48.json  46B       1w ago\n  - deadline-5b3a2381-5e45-4f9a-8543-4c5f5009c468.json  46B       1w ago\n  - deadline-f369c681-9cb1-4990-9c0b-14cd34c4cc03.json  46B       1w ago\n  - deadline-3e4d7e59-28ef-48fc-94cb-4c61c024c306.json  46B       1w ago\n  - tracked/                                                      1w ago\n    - projects/                                                   11h ago\n    - agents/                                                     13h ago\n    - .seed.git/                                                  1d ago\n  - deadline-c153f95c-3776-40c9-8faa-bdc24d5be72f.json  46B       1w ago\n  - deadline-0c1ff292-5b8c-418b-a054-e44271e02abb.json  46B       1w ago\n  - deadline-ce778223-2746-4550-a320-9e98b3077b1c.json  46B       1w ago\n  - deadline-34b67d21-7425-4a6c-b18e-9dd297fde48d.json  46B       1w ago\n  - deadline-perri-probe-part-8654-sess.json            46B       1w ago\n  - deadline-perri-probe-7103-sess.json                 46B       1w ago\n  - deadline-perri-probe-6890-sess.json                 46B       1w ago\n  - deadline-2592511f-8de4-4da3-bbe8-764cffdff6ec.json  46B       1w ago\n  - deadline-55befc10-c2e5-45a6-9675-b732672f58ff.json  46B       1w ago\n  - deadline-ee9948ab-41dc-4cb3-9c09-29a503c96934.json  46B       1w ago\n  - deadline-24991e23-40f2-45a0-8b01-dfb8c95cf193.json  46B       1w ago\n  - deadline-c73433d8-d070-4f7e-b04f-a9be62c4068a.json  46B       1w ago\n  - deadline-6db151cc-515e-4fdf-8fe7-9f98697b588b.json  46B       1w ago\n  - deadline-72f89cf6-7ec0-450a-b68c-4f401db59a61.json  46B       1w ago\n  - deadline-5edb9f02-51b0-448b-a2d3-e3276fe31482.json  46B       1w ago\n  - deadline-b1edf63f-df6b-4d11-bcd7-baa881670279.json  46B       1w ago\n  - deadline-2571ac9e-b6f0-4497-87fc-03f60226b670.json  46B       1w ago\n  - deadline-d5b46b36-ff77-4131-a774-17f6caa2ff35.json  46B       1w ago\n  - deadline-8f826b4f-918e-401c-9a34-b55939a457d1.json  46B       1w ago\n  - deadline-3014282c-3a92-4ee1-a957-3da91c655988.json  46B       1w ago\n  - deadline-4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33.json  46B       1w ago\n  - deadline-05d5e489-e4de-4da7-a6b5-196fcf255595.json  46B       1w ago\n  - deadline-cfe4ff51-5063-4d00-9082-b4ef0a4f0055.json  46B       1w ago\n  - deadline-38fd4368-0e40-4529-9873-7e2689ec742c.json  46B       1w ago\n  - deadline-e253b012-99d0-4d6a-90ed-e355ba7aa943.json  46B       1w ago\n  - deadline-26c873b1-8e04-4115-914c-01b58ea5eb1d.json  46B       1w ago\n  - deadline-7b0b8a9f-93c7-465e-815b-97ac66317ea6.json  46B       1w ago\n  - deadline-b1a4e926-51d5-4694-a90c-5ee9cf8b5fe0.json  46B       1w ago\n  - deadline-8dddccae-2828-4444-916e-3b86d40f756d.json  46B       1w ago\n  - deadline-e5298c2b-b27a-4d32-8e40-2561ad7f3e69.json  46B       1w ago\n  - deadline-aff0686f-5e3a-4b06-9a13-1711e08d9eeb.json  46B       1w ago\n  - deadline-a1d44555-6ad1-42ca-b31f-c5bc04519661.json  46B       1w ago\n  - deadline-1db26ea1-644e-4575-bd13-a7e537955e06.json  46B       1w ago\n  - deadline-3c5986e4-e9be-46c4-ace9-5972b792830c.json  46B       1w ago\n  - deadline-5df2ce6f-084f-4c05-8e8b-ca5e88786834.json  46B       1w ago\n  - deadline-1e24baa1-1331-477d-85d1-dd6c96ec3d87.json  46B       1w ago\n  - deadline-e00167d2-1084-4236-80e1-b33f3ee97ae8.json  46B       1w ago\n  - deadline-eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0.json  46B       1w ago\n  - deadline-5732bc46-a91e-4765-ab85-757840c94e2e.json  46B       1w ago\n  - deadline-b9624c1b-acf9-4a6e-8e45-f2edeeddb18f.json  46B       1w ago\n  - deadline-0c79dd7e-fc2d-4e83-a8bd-5fd5ac7cfa0f.json  46B       1w ago\n  - deadline-a4be0ceb-e25d-41f6-9fce-95d9a0ad7172.json  46B       1w ago\n  - deadline-0506ad00-d01a-4720-afa9-a2b3e57dd571.json  46B       1w ago\n  - deadline-5b2e11d9-da07-4d8e-bdc8-04e4fb6f4232.json  46B       1w ago\n  - deadline-d77dacb8-2a05-4746-afea-b9527694fef9.json  46B       1w ago\n  - deadline-31ab7188-42f3-40aa-8778-bbbf916c311c.json  46B       1w ago\n  - deadline-cdce0ff6-632f-4751-a4b0-df3b57efd630.json  46B       1w ago\n  - deadline-8dfd81d4-fd75-4053-9697-fbfc3e6704a6.json  46B       1w ago\n  - deadline-541feaa5-e4f9-48e7-861b-c16fe8c491fc.json  46B       1w ago\n  - deadline-af8cba35-c4f9-4650-b484-30b8c5bfc612.json  46B       1w ago\n  - deadline-2f1b4008-6670-44f7-80ba-0c83828ee2dd.json  46B       1w ago\n  - deadline-ca522b38-7bd4-4aa9-8af3-410071ed1c91.json  46B       1w ago\n  - deadline-846232c7-a158-43bf-96b1-e17292cb3ba4.json  46B       1w ago\n  - deadline-38a66381-e295-4128-806a-e615de6c66a3.json  46B       1w ago\n  - deadline-ed5c0335-2e7e-4112-92e3-bf1cf4107815.json  46B       1w ago\n  - deadline-09e80411-99a1-4b37-a42a-5a689eddc588.json  46B       1w ago\n  - deadline-423b77c8-4472-4a47-a038-f9f6ed43638c.json  46B       1w ago\n  - deadline-a5a0c4fa-d131-48e6-b01e-2884f5b627c8.json  46B       2w ago\n  - deadline-357331ba-1d9b-4bcb-9a83-1b5e394501a3.json  46B       2w ago\n  - deadline-0893ef24-9c92-4923-86c3-80bef883c917.json  46B       2w ago\n  - deadline-256a16b0-2c32-4f8a-83f7-4b52fc5ade8b.json  46B       2w ago\n  - deadline-bc89bb13-5e82-4ede-8438-7163669fc409.json  46B       2w ago\n  - deadline-830359e9-78c0-4242-b42c-184f73ee4bee.json  46B       2w ago\n  - deadline-46fa9ef6-2a28-4bb1-bf1b-c092a80e9334.json  46B       2w ago\n  - deadline-4383bc99-1600-4674-84d6-fdb1cb129383.json  46B       2w ago\n  - deadline-e7f84ca4-6db8-4f74-b4a1-932447f8d42f.json  46B       2w ago\n  - deadline-da7095c7-bf58-4ecd-aed2-cd60b4aa4688.json  46B       2w ago\n  - deadline-79897770-6705-4953-a6fb-b3668911d03f.json  46B       2w ago\n  - deadline-00539523-578e-43b6-863c-36e10aa52e9f.json  46B       2w ago\n  - deadline-a19521de-18cf-472d-9d26-b0c1b10079fa.json  46B       2w ago\n  - deadline-f8dceddf-5904-41a9-8589-7d454470450f.json  46B       2w ago\n  - deadline-b073fa34-d478-47ea-923e-eb516961692c.json  46B       2w ago\n  - deadline-75801e35-d5a1-41cf-9032-d10d952ee31d.json  46B       2w ago\n  - deadline-d84df205-6f96-4379-ad7a-c5fa1067aa46.json  46B       2w ago\n  - deadline-22059a21-1697-4d5b-982a-b16d8c34ca1b.json  46B       3w ago\n  - deadline-42a8f619-a244-4ec8-a789-4fea91b4dd0f.json  46B       3w ago\n  - deadline-f2b01e45-8877-47cf-b1b2-2255537a5064.json  46B       3w ago\n  - deadline-3fbcb54b-4ba9-49c8-aa8d-8bd77d6abb9f.json  46B       3w ago\n  - deadline-a3150358-0e7a-43e5-9c55-2f403e9a9f89.json  46B       3w ago\n  - deadline-d29be75d-e600-45ba-b72c-a20b07d3f796.json  46B       3w ago\n  - deadline-11e14202-6396-4753-b96e-8b0001c257fd.json  46B       3w ago\n  - deadline-5c0e764f-8438-4e1e-a1ed-223d011787c2.json  46B       3w ago\n  - deadline-3d745af6-5526-48a7-8d00-b22e026e5d5a.json  46B       3w ago\n  - deadline-0a756fdb-553e-49cf-9b1b-a9735509e82c.json  46B       3w ago\n  - deadline-45f475d9-580a-4d7d-99a9-b0409bd6db50.json  46B       3w ago\n  - deadline-d2fc1161-7232-4acc-aa96-a8f84501f6a1.json  46B       3w ago\n  - deadline-c1f91d1f-6461-4e64-8e2d-1ffa4ddce223.json  46B       3w ago\n  - deadline-0e17ca0e-2c68-4ab4-ac7d-2e01a5692335.json  46B       3w ago\n  - deadline-1a34c384-8c56-4668-b69a-88c31871bfd7.json  46B       3w ago\n  - deadline-w3accept-sess.json                         46B       3w ago\n  - deadline-a8655f3e-6789-4ffe-9991-dbfd52cb17d5.json  46B       3w ago\n  - deadline-99289e37-91d2-44a3-8036-d8355bb7ee41.json  46B       3w ago\n  - deadline-d0069c30-1c9e-4945-84fb-2fb4a761c378.json  46B       3w ago\n  - deadline-d9d204e9-4478-4c64-93f2-8c655b46a400.json  46B       3w ago\n  - deadline-3c06ca8f-1c31-48ee-9f23-a7f02cdd2b3a.json  46B       3w ago\n  - deadline-89bd9997-1361-4c96-9e6a-d3c052d043e9.json  46B       3w ago\n  - deadline-6f17cd45-a726-4db9-9e71-674fe685127a.json  46B       3w ago\n  - deadline-aab7a56c-337a-4b5a-9f21-1168eecd91ed.json  46B       3w ago\n  - deadline-0143c72a-a37c-4379-925a-78b98dc0b6a1.json  46B       3w ago\n  - deadline-e9da2ade-1ec1-46a5-af55-b8ea7bba07b1.json  46B       3w ago\n  - deadline-d49a856f-9179-4f41-bb56-4677dd61f4d7.json  46B       3w ago\n  - deadline-0ab9e25c-9efb-4ea2-9d01-c8a5af789da2.json  46B       3w ago\n  - deadline-42dec991-8847-4431-9759-56054d8fe995.json  46B       3w ago\n  - deadline-25910720-a6fe-47f9-9fcb-f20b37ddf380.json  46B       3w ago\n  - deadline-6f0d7d08-c612-4e76-af9d-30162fbfa888.json  46B       3w ago\n  - deadline-7ec9e7af-80e6-4a17-84dc-7ccead37fb10.json  46B       3w ago\n  - deadline-a2dcaf03-497d-46b2-ad8c-564a62c721b7.json  46B       3w ago\n  - deadline-6fa416e6-7d98-4302-b6a4-92f680368ff4.json  46B       3w ago\n  - deadline-9813340f-23fe-47bc-bc9d-33efa6379d22.json  46B       3w ago\n  - deadline-8b72a06d-789d-42b5-a4ab-c096f4dc727e.json  46B       3w ago\n  - deadline-2aef618b-d4fd-4898-8f87-1e377f834665.json  46B       3w ago\n  - deadline-b247eae3-585b-4134-aa61-3175a5ba14c8.json  46B       3w ago\n  - deadline-3a643e8d-c1b8-49e6-9b0f-a05f43241855.json  46B       3w ago\n  - deadline-874eb5be-6056-4f45-8994-98a6690945c7.json  46B       4w ago\n  - deadline-e187968c-fce7-432c-8b57-e74e85e3da0f.json  46B       4w ago\n  - deadline-ad2d8b5c-3705-4228-b6c3-cf3f71c4312e.json  46B       4w ago\n  - deadline-47eca31b-1f52-4bd4-bf2d-c0ab8867aa7d.json  46B       4w ago\n  - deadline-2c091e21-d254-4a19-a1f5-5c08f643ce9a.json  46B       4w ago\n  - deadline-b4692448-61d3-42cd-b32f-e9fd800ba10c.json  46B       4w ago\n  - deadline-2a031493-6c0f-48aa-9acd-7c05a846e91d.json  46B       4w ago\n  - deadline-9caa9805-f841-4a5c-9789-da602ec9f3ae.json  46B       4w ago\n  - deadline-a27284ab-73f0-4c3c-9e9c-6ce53fba1475.json  46B       4w ago\n  - deadline-e206d5b5-8665-4d1c-829c-4e11e371725b.json  46B       4w ago\n  - deadline-218f8222-76ce-4dfa-a3ad-3576c106ebf4.json  46B       4w ago\n  - deadline-8e8eb861-a92b-4bd7-ba9a-f5310c1c3303.json  46B       4w ago\n  - deadline-25becfc2-6842-45c5-b871-2604b491d905.json  46B       4w ago\n  - deadline-4b0425a1-819f-44d0-9032-61fd1d546353.json  46B       4w ago\n  - deadline-testsid-perri123.json                      46B       4w ago\n  - deadline-sptc-dogfood-sess.json                     46B       1mo ago\n  - deadline-sptc-v091-live-sess.json                   46B       1mo ago\n  - deadline-rt-14188-sess.json                         46B       1mo ago\n  - deadline-rt-102212-sess.json                        46B       1mo ago\n  - deadline-2799e403-40ce-49e3-be61-e3f1ad0355ac.json  46B       1mo ago\n  - deadline-sptc-reval2-2634-sess.json                 46B       1mo ago\n  - deadline-sptc-f010b-3403-sess.json                  46B       1mo ago\n  - deadline-sptc-f010-2967-sess.json                   46B       1mo ago\n  - deadline-sptc-ci-v08c-sess.json                     46B       1mo ago\n  - deadline-sptc-nointerim-24539-sess.json             46B       1mo ago\n  - deadline-sptc-diag-host-sess.json                   46B       1mo ago\n  - deadline-sptc-ci-liverelay-40306-sess.json          46B       1mo ago\n  - deadline-sptc-ci-liverelay-27377-sess.json          46B       1mo ago\n  - deadline-sptc-diag-life-sess.json                   46B       1mo ago\n  - deadline-sptc-diag-host2-sess.json                  46B       1mo ago\n  - deadline-sptc-reval-f009-1643-sess.json             46B       1mo ago\n  - deadline-sptc-uniq-24156-1781652991-sess.json       46B       1mo ago\n  - deadline-sptc-fix-life-sess.json                    46B       1mo ago\n  - deadline-sptc-fresh-life-sess.json                  46B       1mo ago\n  - deadline-sptc-ci-diag-sess.json                     46B       1mo ago\n  - deadline-sptc-ci-v08-sess.json                      46B       1mo ago\n  - deadline-sptc-ci-diag2-sess.json                    46B       1mo ago\n  - deadline-sptc-ci-liverelay-24320-sess.json          46B       1mo ago\n  - deadline-sptc-ci-v08b-sess.json                     46B       1mo ago\n  - deadline-sptc-ci-v08d-sess.json                     46B       1mo ago\n  - deadline-sptc-ci-liverelay-sess.json                46B       1mo ago\n  - deadline-sptc-argv-cap-sess.json                    46B       1mo ago\n  - scratch/                                                      1mo ago\n    - pump/                                                       just now\n    - net/                                                        1w ago\n  - context/                                                      1mo ago\n    - .seed.git/                                                  1mo ago\n\n[1 results limit reached. Use limit=2 for more]"}],"details":{"isDirectory":true,"resolvedPath":"C:\\Users\\decid\\AppData\\Local\\spt-core","meta":{"source":{"type":"path","value":"C:\\Users\\decid\\AppData\\Local\\spt-core"},"limits":{"resultLimit":{"reached":1,"suggestion":2}}}},"isError":false,"timestamp":1784292954507}}
{"type":"message","id":"2c74f6ce","parentId":"69919048","timestamp":"2026-07-17T12:55:54.520Z","message":{"role":"toolResult","toolCallId":"call_xE4S2uXmU2MfMhLMyxB5MYn6|fc_0148993141920bab016a5a265a67c881959fe9a42e74f8c977","toolName":"read","content":[{"type":"text","text":"/// (the daemon spawns it on its own); workers detach (each ends with its\n/// stream).\npub fn run_dispatch_loop(\n    broker_name: &str,\n    paths: &DispatchPaths,\n    registry: Arc<RegistryHost>,\n    stop: &AtomicBool,\n    poll: Duration,\n) -> io::Result<()> {\n    let mut brain = connect(broker_name)?;\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n    // abandoned a stream on the first transient failure.\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\n    // loop emits carries it, so per-generation attach/poison censuses line up.\n    let generation = now_ms();\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\n    // with workers so a seat-blocked retry paces on it.\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\n    // with a large backlog) claims at most this many rows per poll — the\n    // rest wait for the next tick, batching the cold enumeration instead of\n    // spawning one thread per row. No claim lock is held across any I/O:\n    // enumeration runs lock-free, the claim map is touched in short scopes.\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n    while !stop.load(Ordering::Relaxed) {\n        if breaker.lock().unwrap().open(Instant::now()) {\n            // Circuit open: a poisoned replay just happened — pause ALL\n            // claiming for the window instead of hammering the wedged conn\n            // with fresh replay subscribers (Amendment fix 5).\n            thread::sleep(poll);\n            continue;\n        }\n        let reply = brain.net_streams()?;\n        for s in reply.streams {\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\n            // invisible until its first write anyway — gotcha #6 — but the\n            // next_seq guard also skips a row whose pump hasn't appended yet).\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\n            if s.initiated_locally || s.next_seq == 0 {\n                continue;\n            }\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\n                break; // pool full: the rest of the table waits for the next poll\n            }\n            let attempts = {\n                let mut c = claims.lock().unwrap();\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\n                    Some(attempts) => {\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\n                        attempts\n                    }\n                    None => continue,\n                }\n            };\n            let name = broker_name.to_string();\n            let origin = s.remote_id_hex.clone();\n            let stream_id = s.stream_id;\n            let conn_id = s.conn_id;\n            let floor_seq = s.floor_seq;\n            let finished = s.finished;\n            let p = paths.clone();\n            let reg = Arc::clone(&registry);\n            let claims_done = Arc::clone(&claims);\n            let breaker_done = Arc::clone(&breaker);\n            let pool = Arc::clone(&active_workers);\n            pool.fetch_add(1, Ordering::Relaxed);\n            thread::spawn(move || {\n                let started = Instant::now();\n                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n                pool.fetch_sub(1, Ordering::Relaxed);\n                let outcome = report.outcome;\n                let elapsed_ms = started.elapsed().as_millis();\n                if let DispatchOutcome::Served(detail) = &outcome {\n                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\n                    // this stream's exchange is over — take its row out of\n                    // every FUTURE dispatcher generation's enumeration (the\n                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\n                    // an older broker without the verb answers error (KH-2.3)\n                    // and the row retires when the broker cycles.\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire(stream_id);\n                    }\n                    // Breaker reset = REAL progress only (gate round 1): a row\n                    // that vanished before serve proves nothing about the\n                    // wedge — a sibling's row-gone would close the breaker\n                    // AND zero its doubling ladder mid-wedge. A real serve\n                    // (including a finished-attach retirement) resets.\n                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n                    if !detail.contains(\"terminal pre-serve\") {\n                        breaker_done.lock().unwrap().reset();\n                    }\n                } else {\n                    // Keyed worker-outcome record (Amendment fix 9) — the\n                    // legacy DISPATCH:<id> token is kept as a prefix so\n                    // existing field greps keep matching.\n                    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n                    eprintln!(\"DISPATCH:{stream_id}:{outcome:?}\");\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"worker-outcome\",\n                            &format!(\n                                \"{outcome:?} elapsed_ms={elapsed_ms} endpoint={}\",\n                                report.endpoint.as_deref().unwrap_or(\"-\")\n                            ),\n                        )\n                    );\n                }\n                // Seat-blocked failures trip the GLOBAL breaker; the claim\n                // requeue paces on the breaker window (never burning the\n                // bounded transient budget — T5's recovery discriminator).\n                let breaker_window = match &outcome {\n                    DispatchOutcome::Failed(msg)\n                        if classify_failure(msg) == FailClass::SeatBlocked =>\n                    {\n                        let mut b = breaker_done.lock().unwrap();\n                        let window = b.trip(Instant::now());\n                        eprintln!(\n                            \"{}\",\n                            dispatch_event(\n                                generation,\n                                stream_id,\n                                None,\n                                attempts,\n                                conn_id,\n                                \"breaker-trip\",\n                                &format!(\"window_ms={}\", window.as_millis()),\n                            )\n                        );\n                        window\n                    }\n                    _ => Duration::ZERO,\n                };\n                let (state, retire_terminal) = outcome_transition(\n                    &outcome,\n                    report.family,\n                    attempts,\n                    Instant::now(),\n                    breaker_window,\n                );\n                // One-way strike budget spent (ADR-0040 decision 4): retire\n                // the row TERMINAL — physically, loudly. A poisoned feed\n                // replay must never remain redispatchable across dispatcher\n                // generations; the next pump round re-advertises everything.\n                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\n                if retire_terminal {\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\n                    }\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"oneway-strike-retire\",\n                            &format!(\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\n                                 advertisement round recovers\"\n                            ),\n                        )\n                    );\n                }\n                let mut c = claims_done.lock().unwrap();\n                c.insert(stream_id, state);\n            });\n        }\n        thread::sleep(poll);\n    }\n    Ok(())\n}\n\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\n/// table claims at most this many rows per poll tick.\nconst MAX_DISPATCH_WORKERS: usize = 8;\n\n/// PURE pool gate (Amendment fix 7): may the loop claim another row right\n/// now? The cold-enumeration break rides this — a refresh with a large\n/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest\n/// wait for the next tick (batched, never one thread per row).\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\nfn pool_has_room(active: usize) -> bool {\n    active < MAX_DISPATCH_WORKERS\n}\n\n/// Connect a fresh brain IPC client (retrying through broker startup).\nfn connect(broker_name: &str) -> io::Result<Brain> {\n    let mut last = io::Error::other(\"broker never answered\");\n    for _ in 0..300 {\n        match Brain::cold_start(broker_name, now_ms()) {\n            Ok(b) => return Ok(b),\n            Err(e) => last = e,\n        }\n        thread::sleep(Duration::from_millis(10));\n    }\n    Err(last)\n}\n\nfn now_ms() -> u64 {\n    std::time::SystemTime::now()\n        .duration_since(std::time::UNIX_EPOCH)\n        .map(|d| d.as_millis() as u64)\n        .unwrap_or(0)\n}\n…\nfn serve_wan_feed(\n…\n) -> DispatchOutcome {\n…\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n…\n            }) if sid == stream_id => {\n                for msg in decoder.push(&bytes) {\n…\n                    if !replied {\n…\n                    }\n                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n                return DispatchOutcome::Served(format!(\"wan feed: {handled} record(s)\"));\n            }\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n            Ok(_) => {}\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\n        }\n    }\n}\n\n/// Spawn the dispatcher on its own thread against the canonical broker\n/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\npub fn spawn_dispatcher(\n    broker_name: String,\n    registry: Arc<RegistryHost>,\n    stop: Arc<AtomicBool>,\n) -> thread::JoinHandle<()> {\n    thread::spawn(move || {\n        let paths = DispatchPaths::production();\n        if let Err(e) =\n            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n        {\n            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use serde_json::json;\n\n    // [unit->REQ-NET-1] the demux table: every family's first record\n    // classifies correctly, including the `request` kind collision.\n    #[test]\n    fn classifies_every_family_by_first_line_shape() {\n        let sync = json!({\"kind\": \"request\", \"sync_id\": \"pull-1\", \"refs\": [], \"have_tips\": {}});\n        assert_eq!(classify_first_line(&sync), StreamFamily::Sync);\n…\n    }\n…\n}"}],"details":{"displayContent":{"text":"/// (the daemon spawns it on its own); workers detach (each ends with its\n/// stream).\npub fn run_dispatch_loop(\n    broker_name: &str,\n    paths: &DispatchPaths,\n    registry: Arc<RegistryHost>,\n    stop: &AtomicBool,\n    poll: Duration,\n) -> io::Result<()> {\n    let mut brain = connect(broker_name)?;\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n    // abandoned a stream on the first transient failure.\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\n    // loop emits carries it, so per-generation attach/poison censuses line up.\n    let generation = now_ms();\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\n    // with workers so a seat-blocked retry paces on it.\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\n    // with a large backlog) claims at most this many rows per poll — the\n    // rest wait for the next tick, batching the cold enumeration instead of\n    // spawning one thread per row. No claim lock is held across any I/O:\n    // enumeration runs lock-free, the claim map is touched in short scopes.\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n    while !stop.load(Ordering::Relaxed) {\n        if breaker.lock().unwrap().open(Instant::now()) {\n            // Circuit open: a poisoned replay just happened — pause ALL\n            // claiming for the window instead of hammering the wedged conn\n            // with fresh replay subscribers (Amendment fix 5).\n            thread::sleep(poll);\n            continue;\n        }\n        let reply = brain.net_streams()?;\n        for s in reply.streams {\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\n            // invisible until its first write anyway — gotcha #6 — but the\n            // next_seq guard also skips a row whose pump hasn't appended yet).\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\n            if s.initiated_locally || s.next_seq == 0 {\n                continue;\n            }\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\n                break; // pool full: the rest of the table waits for the next poll\n            }\n            let attempts = {\n                let mut c = claims.lock().unwrap();\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\n                    Some(attempts) => {\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\n                        attempts\n                    }\n                    None => continue,\n                }\n            };\n            let name = broker_name.to_string();\n            let origin = s.remote_id_hex.clone();\n            let stream_id = s.stream_id;\n            let conn_id = s.conn_id;\n            let floor_seq = s.floor_seq;\n            let finished = s.finished;\n            let p = paths.clone();\n            let reg = Arc::clone(&registry);\n            let claims_done = Arc::clone(&claims);\n            let breaker_done = Arc::clone(&breaker);\n            let pool = Arc::clone(&active_workers);\n            pool.fetch_add(1, Ordering::Relaxed);\n            thread::spawn(move || {\n                let started = Instant::now();\n                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n                pool.fetch_sub(1, Ordering::Relaxed);\n                let outcome = report.outcome;\n                let elapsed_ms = started.elapsed().as_millis();\n                if let DispatchOutcome::Served(detail) = &outcome {\n                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\n                    // this stream's exchange is over — take its row out of\n                    // every FUTURE dispatcher generation's enumeration (the\n                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\n                    // an older broker without the verb answers error (KH-2.3)\n                    // and the row retires when the broker cycles.\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire(stream_id);\n                    }\n                    // Breaker reset = REAL progress only (gate round 1): a row\n                    // that vanished before serve proves nothing about the\n                    // wedge — a sibling's row-gone would close the breaker\n                    // AND zero its doubling ladder mid-wedge. A real serve\n                    // (including a finished-attach retirement) resets.\n                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n                    if !detail.contains(\"terminal pre-serve\") {\n                        breaker_done.lock().unwrap().reset();\n                    }\n                } else {\n                    // Keyed worker-outcome record (Amendment fix 9) — the\n                    // legacy DISPATCH:<id> token is kept as a prefix so\n                    // existing field greps keep matching.\n                    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n                    eprintln!(\"DISPATCH:{stream_id}:{outcome:?}\");\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"worker-outcome\",\n                            &format!(\n                                \"{outcome:?} elapsed_ms={elapsed_ms} endpoint={}\",\n                                report.endpoint.as_deref().unwrap_or(\"-\")\n                            ),\n                        )\n                    );\n                }\n                // Seat-blocked failures trip the GLOBAL breaker; the claim\n                // requeue paces on the breaker window (never burning the\n                // bounded transient budget — T5's recovery discriminator).\n                let breaker_window = match &outcome {\n                    DispatchOutcome::Failed(msg)\n                        if classify_failure(msg) == FailClass::SeatBlocked =>\n                    {\n                        let mut b = breaker_done.lock().unwrap();\n                        let window = b.trip(Instant::now());\n                        eprintln!(\n                            \"{}\",\n                            dispatch_event(\n                                generation,\n                                stream_id,\n                                None,\n                                attempts,\n                                conn_id,\n                                \"breaker-trip\",\n                                &format!(\"window_ms={}\", window.as_millis()),\n                            )\n                        );\n                        window\n                    }\n                    _ => Duration::ZERO,\n                };\n                let (state, retire_terminal) = outcome_transition(\n                    &outcome,\n                    report.family,\n                    attempts,\n                    Instant::now(),\n                    breaker_window,\n                );\n                // One-way strike budget spent (ADR-0040 decision 4): retire\n                // the row TERMINAL — physically, loudly. A poisoned feed\n                // replay must never remain redispatchable across dispatcher\n                // generations; the next pump round re-advertises everything.\n                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\n                if retire_terminal {\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\n                    }\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"oneway-strike-retire\",\n                            &format!(\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\n                                 advertisement round recovers\"\n                            ),\n                        )\n                    );\n                }\n                let mut c = claims_done.lock().unwrap();\n                c.insert(stream_id, state);\n            });\n        }\n        thread::sleep(poll);\n    }\n    Ok(())\n}\n\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\n/// table claims at most this many rows per poll tick.\nconst MAX_DISPATCH_WORKERS: usize = 8;\n\n/// PURE pool gate (Amendment fix 7): may the loop claim another row right\n/// now? The cold-enumeration break rides this — a refresh with a large\n/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest\n/// wait for the next tick (batched, never one thread per row).\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\nfn pool_has_room(active: usize) -> bool {\n    active < MAX_DISPATCH_WORKERS\n}\n\n/// Connect a fresh brain IPC client (retrying through broker startup).\nfn connect(broker_name: &str) -> io::Result<Brain> {\n    let mut last = io::Error::other(\"broker never answered\");\n    for _ in 0..300 {\n        match Brain::cold_start(broker_name, now_ms()) {\n            Ok(b) => return Ok(b),\n            Err(e) => last = e,\n        }\n        thread::sleep(Duration::from_millis(10));\n    }\n    Err(last)\n}\n\nfn now_ms() -> u64 {\n    std::time::SystemTime::now()\n        .duration_since(std::time::UNIX_EPOCH)\n        .map(|d| d.as_millis() as u64)\n        .unwrap_or(0)\n}\n…\nfn serve_wan_feed(\n…\n) -> DispatchOutcome {\n…\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n…\n            }) if sid == stream_id => {\n                for msg in decoder.push(&bytes) {\n…\n                    if !replied {\n…\n                    }\n                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n                return DispatchOutcome::Served(format!(\"wan feed: {handled} record(s)\"));\n            }\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n            Ok(_) => {}\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\n        }\n    }\n}\n\n/// Spawn the dispatcher on its own thread against the canonical broker\n/// socket — the daemon-boot entry ([`crate::daemon::Daemon::run`]).\npub fn spawn_dispatcher(\n    broker_name: String,\n    registry: Arc<RegistryHost>,\n    stop: Arc<AtomicBool>,\n) -> thread::JoinHandle<()> {\n    thread::spawn(move || {\n        let paths = DispatchPaths::production();\n        if let Err(e) =\n            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n        {\n            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use serde_json::json;\n\n    // [unit->REQ-NET-1] the demux table: every family's first record\n    // classifies correctly, including the `request` kind collision.\n    #[test]\n    fn classifies_every_family_by_first_line_shape() {\n        let sync = json!({\"kind\": \"request\", \"sync_id\": \"pull-1\", \"refs\": [], \"have_tips\": {}});\n        assert_eq!(classify_first_line(&sync), StreamFamily::Sync);\n…\n    }\n…\n}","startLine":500,"lineNumbers":[500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,null,1360,null,1366,null,1373,1374,1375,null,1379,1380,null,1389,null,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,null,1468,null,1919]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784292954520}}
{"type":"message","id":"9eca3fb5","parentId":"2c74f6ce","timestamp":"2026-07-17T12:55:54.528Z","message":{"role":"toolResult","toolCallId":"call_P6QrPs3jH3T3uzE7A7J915E2|fc_0148993141920bab016a5a265a67d8819582d69e5148a46fc6","toolName":"read","content":[{"type":"text","text":"\nuse serde::{Deserialize, Serialize};\n\nuse spt_store::branchstore::BranchStore;\nuse spt_store::contextstore::{self, PROJECT_CONTEXT_FILE};\nuse spt_store::info;\nuse spt_store::perch;\nuse spt_store::projderive;\nuse spt_store::projindex::{self, AbsentReason, EndpointProject, IndexRead, ProjectIndex};\nuse spt_store::projinval::{self, Coalesced};\nuse spt_store::sessions;\n\nuse crate::brain::now_ms;\n\n/// Queue poll cadence (a single `read_dir` — pure file I/O). Runtime-env\n/// overridable for int rigs (`SPT_PROJINDEX_POLL_MS`), never for production.\nconst POLL_MS: u64 = 500;\n/// Debounce window after the first observed event — a burst (an adapter\n/// stampede, a multi-endpoint rename) coalesces into ONE reconcile.\nconst DEBOUNCE_MS: u64 = 250;\n/// The low-frequency periodic FULL reconcile — the backstop that catches a\n/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\nconst PERIODIC_MS: u64 = 300_000;\n\n/// The complexity counters — the deterministic CI gate surface (gate ruling:\n/// counters gate, wall-clock is manual acceptance only).\n#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]\npub struct CycleCounters {\n    /// Branch enumerations this cycle (contract: exactly 1 when the store exists).\n    pub branch_enumerations: u64,\n    /// Tree scans this cycle (contract: ≤1 per CHANGED `p-*` branch).\n    pub tree_scans: u64,\n    /// cwd derivations this cycle (contract: ≤1 per distinct normalized cwd).\n    pub derivations: u64,\n}\n\nimpl CycleCounters {\n    fn add_to(&self, total: &mut CycleCounters) {\n        total.branch_enumerations += self.branch_enumerations;\n        total.tree_scans += self.tree_scans;\n        total.derivations += self.derivations;\n    }\n}\n…\nfn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n    for anc in dir.ancestors() {\n…\n    }\n    None\n}\n\n/// (mtime epoch-ms, len) of a marker file — the cheap identity stamp.\nfn stamp_of(p: &Path) -> Option<(u64, u64)> {\n    let meta = std::fs::metadata(p).ok()?;\n    let mtime = meta\n        .modified()\n        .ok()?\n        .duration_since(std::time::UNIX_EPOCH)\n        .ok()?\n        .as_millis() as u64;\n    Some((mtime, meta.len()))\n}\n\nfn env_ms(name: &str, default: u64) -> u64 {\n    std::env::var(name)\n        .ok()\n        .and_then(|v| v.parse().ok())\n        .unwrap_or(default)\n}\n\n/// Spawn the brain's index-writer host: ONE thread (single-flight by\n/// construction) that loads the persisted index, runs the boot reconcile\n/// (fingerprint-gated: a warm start with an unchanged generation scans\n/// nothing), then drains + debounces + coalesces the invalidation queue and\n/// runs the periodic full backstop until `stop`. Mirrors\n/// `livehost::spawn_live_host`; the thread dies with the brain and the next\n/// brain rehydrates from the persisted index (ready without warm).\n// [impl->REQ-PROJECT-INDEX-WRITER]\n// [impl->REQ-PROJECT-INDEX-INVALIDATION]\npub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\n        // untouched): rigs that need a writer-silent daemon set it — the\n        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\n        if std::env::var_os(\"SPT_PROJINDEX_DISABLE\").is_some() {\n            return;\n        }\n        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\n        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\n        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\n\n        let mut engine = WriterEngine::new(WriterPaths::production());\n        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\n\n        // Boot reconcile: global but NOT forced — a warm start over an\n        // unchanged store exits without a scan (the cold/warm start gate).\n        let boot = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n        let boot = Coalesced { global: true, ..boot };\n        if let Err(e) = engine.reconcile(&boot, false) {\n            engine.record_failure(e);\n        }\n\n        let mut since_periodic = Duration::ZERO;\n        while !stop.load(Ordering::SeqCst) {\n            // Sleep one poll slice (sliced so a stop lands promptly).\n            let mut left = poll.as_millis() as u64;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n            if stop.load(Ordering::SeqCst) {\n                break;\n            }\n            since_periodic += poll;\n\n            let due_periodic = since_periodic >= periodic;\n            let has_events = projinval::pending_at(&engine.paths.invalidations_dir);\n            if !has_events && !due_periodic {\n                continue;\n            }\n\n            if has_events {\n                // Debounce: let the burst land, then drain it ALL — the\n                // coalescing window (multiple invalidations → one refresh).\n                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n                std::thread::sleep(debounce);\n                engine.stats.pending_refresh = true;\n                engine.write_stats();\n            }\n            let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n            if due_periodic {\n                since_periodic = Duration::ZERO;\n            }\n            let req = if due_periodic { Coalesced { global: true, ..req } } else { req };\n            if req.is_empty() && !due_periodic {\n                continue; // a racer consumed it (never happens in production)\n            }\n            if let Err(e) = engine.reconcile(&req, due_periodic) {\n                engine.record_failure(e);\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n…\n}"}],"details":{"displayContent":{"text":"\nuse serde::{Deserialize, Serialize};\n\nuse spt_store::branchstore::BranchStore;\nuse spt_store::contextstore::{self, PROJECT_CONTEXT_FILE};\nuse spt_store::info;\nuse spt_store::perch;\nuse spt_store::projderive;\nuse spt_store::projindex::{self, AbsentReason, EndpointProject, IndexRead, ProjectIndex};\nuse spt_store::projinval::{self, Coalesced};\nuse spt_store::sessions;\n\nuse crate::brain::now_ms;\n\n/// Queue poll cadence (a single `read_dir` — pure file I/O). Runtime-env\n/// overridable for int rigs (`SPT_PROJINDEX_POLL_MS`), never for production.\nconst POLL_MS: u64 = 500;\n/// Debounce window after the first observed event — a burst (an adapter\n/// stampede, a multi-endpoint rename) coalesces into ONE reconcile.\nconst DEBOUNCE_MS: u64 = 250;\n/// The low-frequency periodic FULL reconcile — the backstop that catches a\n/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\nconst PERIODIC_MS: u64 = 300_000;\n\n/// The complexity counters — the deterministic CI gate surface (gate ruling:\n/// counters gate, wall-clock is manual acceptance only).\n#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]\npub struct CycleCounters {\n    /// Branch enumerations this cycle (contract: exactly 1 when the store exists).\n    pub branch_enumerations: u64,\n    /// Tree scans this cycle (contract: ≤1 per CHANGED `p-*` branch).\n    pub tree_scans: u64,\n    /// cwd derivations this cycle (contract: ≤1 per distinct normalized cwd).\n    pub derivations: u64,\n}\n\nimpl CycleCounters {\n    fn add_to(&self, total: &mut CycleCounters) {\n        total.branch_enumerations += self.branch_enumerations;\n        total.tree_scans += self.tree_scans;\n        total.derivations += self.derivations;\n    }\n}\n…\nfn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n    for anc in dir.ancestors() {\n…\n    }\n    None\n}\n\n/// (mtime epoch-ms, len) of a marker file — the cheap identity stamp.\nfn stamp_of(p: &Path) -> Option<(u64, u64)> {\n    let meta = std::fs::metadata(p).ok()?;\n    let mtime = meta\n        .modified()\n        .ok()?\n        .duration_since(std::time::UNIX_EPOCH)\n        .ok()?\n        .as_millis() as u64;\n    Some((mtime, meta.len()))\n}\n\nfn env_ms(name: &str, default: u64) -> u64 {\n    std::env::var(name)\n        .ok()\n        .and_then(|v| v.parse().ok())\n        .unwrap_or(default)\n}\n\n/// Spawn the brain's index-writer host: ONE thread (single-flight by\n/// construction) that loads the persisted index, runs the boot reconcile\n/// (fingerprint-gated: a warm start with an unchanged generation scans\n/// nothing), then drains + debounces + coalesces the invalidation queue and\n/// runs the periodic full backstop until `stop`. Mirrors\n/// `livehost::spawn_live_host`; the thread dies with the brain and the next\n/// brain rehydrates from the persisted index (ready without warm).\n// [impl->REQ-PROJECT-INDEX-WRITER]\n// [impl->REQ-PROJECT-INDEX-INVALIDATION]\npub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\n        // untouched): rigs that need a writer-silent daemon set it — the\n        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\n        if std::env::var_os(\"SPT_PROJINDEX_DISABLE\").is_some() {\n            return;\n        }\n        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\n        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\n        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\n\n        let mut engine = WriterEngine::new(WriterPaths::production());\n        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\n\n        // Boot reconcile: global but NOT forced — a warm start over an\n        // unchanged store exits without a scan (the cold/warm start gate).\n        let boot = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n        let boot = Coalesced { global: true, ..boot };\n        if let Err(e) = engine.reconcile(&boot, false) {\n            engine.record_failure(e);\n        }\n\n        let mut since_periodic = Duration::ZERO;\n        while !stop.load(Ordering::SeqCst) {\n            // Sleep one poll slice (sliced so a stop lands promptly).\n            let mut left = poll.as_millis() as u64;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n            if stop.load(Ordering::SeqCst) {\n                break;\n            }\n            since_periodic += poll;\n\n            let due_periodic = since_periodic >= periodic;\n            let has_events = projinval::pending_at(&engine.paths.invalidations_dir);\n            if !has_events && !due_periodic {\n                continue;\n            }\n\n            if has_events {\n                // Debounce: let the burst land, then drain it ALL — the\n                // coalescing window (multiple invalidations → one refresh).\n                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n                std::thread::sleep(debounce);\n                engine.stats.pending_refresh = true;\n                engine.write_stats();\n            }\n            let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n            if due_periodic {\n                since_periodic = Duration::ZERO;\n            }\n            let req = if due_periodic { Coalesced { global: true, ..req } } else { req };\n            if req.is_empty() && !due_periodic {\n                continue; // a racer consumed it (never happens in production)\n            }\n            if let Err(e) = engine.reconcile(&req, due_periodic) {\n                engine.record_failure(e);\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n…\n}","startLine":35,"lineNumbers":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,null,581,582,null,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,null,1269]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\projwriter.rs"}}},"isError":false,"timestamp":1784292954528}}
{"type":"message","id":"2bad2491","parentId":"9eca3fb5","timestamp":"2026-07-17T12:55:54.532Z","message":{"role":"toolResult","toolCallId":"call_vcPwWvrEVlB5b9HIczdCPNhZ|fc_0148993141920bab016a5a265a67c081959f34d066e731bfd0","toolName":"read","content":[{"type":"text","text":"//! Persistent daemon stderr (LIFECYCLE-TRUTH W3, REQ-DAEMON-STDERR-PERSIST).\n//!\n//! A detached daemon nulls its stdio (`Stdio::null()` at spawn, or the\n//! [`null_std_handles_if_detached_in_fact`](crate::daemon::null_std_handles_if_detached_in_fact)\n//! undrained-pipe defense) — so every `eprintln!` diagnostic the broker and brain\n//! emit goes to `/dev/null`. The 2026-07-06/07 incident window left ZERO logs; both\n//! RCAs ran blind and had to recreate everything from rigs. This module gives the\n//! daemon a durable place to write instead: at startup each process REDIRECTS ITS\n//! OWN stderr to a rotating, size-capped file under `SPT_HOME/logs`, opened\n//! **in-process** — never an inherited or piped handle (`REQ-HAZARD-DETACHED-DAEMON-STDIO`\n//! / KH 5.6: a detached child inheriting a caller's pipe BLOCKS when the pipe fills;\n//! a disk file never blocks, which is exactly why the existing null-guard already\n//! keeps a file stderr alive).\n//!\n//! Redirecting the process stderr FD (not swapping every call site) captures all\n//! existing `eprintln!` output unchanged. Rotation is at INSTALL (each process\n//! start / brain generation): the file is stamped with the role + generation, and\n//! a current file already at the cap is rolled to `.1` (older dropped) so the log\n//! stays bounded at `KEEP × CAP` across restarts. A single very-long-lived\n//! generation writing past the cap keeps appending until its next restart — the\n//! primary contract is capture-not-null; a hard within-generation live cap is a\n//! documented follow-up, not this slice.\n// [impl->REQ-DAEMON-STDERR-PERSIST]\n// [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\n\nuse std::io::Write;\nuse std::path::{Path, PathBuf};\n\n/// The per-file size cap (bytes). At install a current file already ≥ this rolls.\npub const STDERR_LOG_CAP: u64 = 5 * 1024 * 1024;\n/// How many files to keep (the current file + `KEEP-1` rolled backups) — 2×5 MB.\npub const STDERR_LOG_KEEP: usize = 2;\n/// The log basename under `SPT_HOME/logs`.\npub const STDERR_LOG_BASENAME: &str = \"daemon.stderr.log\";\n\n/// The `SPT_HOME/logs` directory holding the daemon stderr log(s).\npub fn stderr_log_dir() -> PathBuf {\n    spt_store::perch::spt_home().join(\"logs\")\n}\n\n/// The current daemon stderr log path (`SPT_HOME/logs/daemon.stderr.log`).\npub fn stderr_log_path() -> PathBuf {\n    stderr_log_dir().join(STDERR_LOG_BASENAME)\n}\n\n/// The rolled path for backup index `n` (1-based): `daemon.stderr.log.1`, `.2`, …\nfn rolled_path(dir: &Path, n: usize) -> PathBuf {\n    dir.join(format!(\"{STDERR_LOG_BASENAME}.{n}\"))\n}\n\n/// Whether a current file of `current_size` bytes must roll before more is written,\n/// given `cap`. Pure — the rotation-decision kernel. `cap == 0` disables rotation\n/// (never rolls) so a caller can opt out without a branch. A file exactly AT the cap\n/// rolls (the next write would exceed it).\n// [impl->REQ-DAEMON-STDERR-PERSIST]\npub fn should_roll(current_size: u64, cap: u64) -> bool {\n    cap != 0 && current_size >= cap\n}\n\n/// Roll the log files under `dir`, keeping at most `keep` total (`keep-1` backups):\n/// drop the oldest, shift `.n → .n+1`, and move the current file to `.1`. Best-effort\n/// per rename (a missing intermediate is simply skipped) so a partial prior roll\n/// self-heals. `keep == 0` or `keep == 1` keeps NO backups (the current file is just\n/// removed to start fresh). Pure over the filesystem — unit-tested against a temp dir.\n// [impl->REQ-DAEMON-STDERR-PERSIST]\npub fn roll_files(dir: &Path, keep: usize) {\n    // Drop the oldest backup we would otherwise shift into (index keep-1 → keep).\n    if keep >= 1 {\n        let _ = std::fs::remove_file(rolled_path(dir, keep - 1));\n    } else {\n        let _ = std::fs::remove_file(rolled_path(dir, 0));\n    }\n    // Shift .n → .n+1 from the second-oldest down to .1 (descending so nothing\n    // clobbers an un-shifted file).\n    for n in (1..keep.saturating_sub(1)).rev() {\n        let _ = std::fs::rename(rolled_path(dir, n), rolled_path(dir, n + 1));\n    }\n    let current = dir.join(STDERR_LOG_BASENAME);\n    if keep >= 2 {\n        let _ = std::fs::rename(&current, rolled_path(dir, 1));\n    } else {\n        // No backups kept: just clear the current file.\n        let _ = std::fs::remove_file(&current);\n    }\n}\n\n/// A generation/role stamp header line written at each install so an operator can\n/// tell which process + generation wrote the following diagnostics.\nfn stamp_line(role: &str, generation: u64) -> String {\n    format!(\n        \"=== spt {role} stderr — generation {generation} — pid {} ===\",\n        std::process::id()\n    )\n}\n\n/// Redirect THIS process's stderr FD to `file`, opened in-process (never inherited /\n/// piped). Windows: `SetStdHandle(STD_ERROR_HANDLE, handle)`; Unix: `dup2(fd, 2)`.\n/// The `file` handle is leaked (`forget`) so it outlives this call — the OS keeps\n/// stderr pointed at it for the process lifetime. Best-effort: a redirect failure is\n/// non-fatal (diagnostics simply keep going to the prior sink).\nfn redirect_stderr_to(file: std::fs::File) {\n    #[cfg(windows)]\n    {\n        use std::os::windows::io::AsRawHandle;\n        extern \"system\" {\n            fn SetStdHandle(which: u32, handle: isize) -> i32;\n        }\n        const STD_ERROR_HANDLE: u32 = 0xFFFF_FFF4;\n        // SAFETY: a scalar kernel32 set of the std-error slot to a live file handle\n        // (the sanctioned FILE stderr the null-guard already treats as safe).\n        unsafe {\n            let _ = SetStdHandle(STD_ERROR_HANDLE, file.as_raw_handle() as isize);\n        }\n        std::mem::forget(file); // keep the handle alive for the process lifetime\n    }\n    #[cfg(unix)]\n    {\n        use std::os::unix::io::AsRawFd;\n        // SAFETY: dup2 onto STDERR_FILENO (2) from a live open file fd; a copy is\n        // installed at 2 and the original fd is then closed on drop (dup2 duplicates).\n        unsafe {\n            let _ = libc::dup2(file.as_raw_fd(), libc::STDERR_FILENO);\n        }\n        drop(file); // fd 2 is now an independent duplicate\n    }\n}\n\n/// Install the persistent stderr sink for THIS process (broker at `daemon run`,\n/// brain at `daemon brain`): create `SPT_HOME/logs`, roll the current file if it is\n/// already at the cap, open it for append, write the `role`/`generation` stamp, and\n/// redirect this process's stderr to it. Best-effort throughout — any failure leaves\n/// stderr on its prior sink and is itself reported to the prior stderr, never a\n/// panic (a logging setup must never brick the daemon). Returns the log path on a\n/// successful redirect, `None` otherwise.\n// [impl->REQ-DAEMON-STDERR-PERSIST]\npub fn install(role: &str, generation: u64) -> Option<PathBuf> {\n    let dir = stderr_log_dir();\n    if let Err(e) = std::fs::create_dir_all(&dir) {\n        eprintln!(\"STDERR_PERSIST_SKIP: could not create {}: {e}\", dir.display());\n        return None;\n    }\n    let path = stderr_log_path();\n    // Roll a current file already at the cap (bounds growth across restarts).\n    let size = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0);\n    if should_roll(size, STDERR_LOG_CAP) {\n        roll_files(&dir, STDERR_LOG_KEEP);\n    }\n    let mut file = match std::fs::OpenOptions::new().create(true).append(true).open(&path) {\n        Ok(f) => f,\n        Err(e) => {\n            eprintln!(\"STDERR_PERSIST_SKIP: could not open {}: {e}\", path.display());\n            return None;\n        }\n    };\n    // Stamp the header on the PRE-redirect handle (a plain write; the redirect below\n    // then points the process stderr at the same file for every later eprintln!).\n    let _ = writeln!(file, \"{}\", stamp_line(role, generation));\n    let _ = file.flush();\n    redirect_stderr_to(file);\n    Some(path)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    // [unit->REQ-DAEMON-STDERR-PERSIST] the rotation-decision kernel: a file at OR\n    // over the cap rolls; under does not; cap 0 disables (never rolls, an opt-out).\n    #[test]\n    fn should_roll_at_or_over_cap_only() {\n        assert!(!should_roll(0, STDERR_LOG_CAP), \"empty never rolls\");\n        assert!(!should_roll(STDERR_LOG_CAP - 1, STDERR_LOG_CAP), \"just under never rolls\");\n        assert!(should_roll(STDERR_LOG_CAP, STDERR_LOG_CAP), \"exactly at cap rolls\");\n        assert!(should_roll(STDERR_LOG_CAP + 1, STDERR_LOG_CAP), \"over cap rolls\");\n        assert!(!should_roll(u64::MAX, 0), \"cap 0 disables rotation\");\n    }\n\n    // [unit->REQ-DAEMON-STDERR-PERSIST] roll keeps at most KEEP files: the current\n    // file moves to .1, a pre-existing .1 drops (KEEP=2 → current + one backup), and\n    // the content is preserved across the roll (the backup holds the OLD current).\n    #[test]\n    fn roll_keeps_bounded_generations_and_preserves_current() {\n        let dir = tempfile::tempdir().unwrap();\n…\n    }\n…\n}\n\n[Showing lines 1-183 of 232. Use :184 to continue]"}],"details":{"truncation":{"content":"//! Persistent daemon stderr (LIFECYCLE-TRUTH W3, REQ-DAEMON-STDERR-PERSIST).\r\n//!\r\n//! A detached daemon nulls its stdio (`Stdio::null()` at spawn, or the\r\n//! [`null_std_handles_if_detached_in_fact`](crate::daemon::null_std_handles_if_detached_in_fact)\r\n//! undrained-pipe defense) — so every `eprintln!` diagnostic the broker and brain\r\n//! emit goes to `/dev/null`. The 2026-07-06/07 incident window left ZERO logs; both\r\n//! RCAs ran blind and had to recreate everything from rigs. This module gives the\r\n//! daemon a durable place to write instead: at startup each process REDIRECTS ITS\r\n//! OWN stderr to a rotating, size-capped file under `SPT_HOME/logs`, opened\r\n//! **in-process** — never an inherited or piped handle (`REQ-HAZARD-DETACHED-DAEMON-STDIO`\r\n//! / KH 5.6: a detached child inheriting a caller's pipe BLOCKS when the pipe fills;\r\n//! a disk file never blocks, which is exactly why the existing null-guard already\r\n//! keeps a file stderr alive).\r\n//!\r\n//! Redirecting the process stderr FD (not swapping every call site) captures all\r\n//! existing `eprintln!` output unchanged. Rotation is at INSTALL (each process\r\n//! start / brain generation): the file is stamped with the role + generation, and\r\n//! a current file already at the cap is rolled to `.1` (older dropped) so the log\r\n//! stays bounded at `KEEP × CAP` across restarts. A single very-long-lived\r\n//! generation writing past the cap keeps appending until its next restart — the\r\n//! primary contract is capture-not-null; a hard within-generation live cap is a\r\n//! documented follow-up, not this slice.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\n// [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\r\n\r\nuse std::io::Write;\r\nuse std::path::{Path, PathBuf};\r\n\r\n/// The per-file size cap (bytes). At install a current file already ≥ this rolls.\r\npub const STDERR_LOG_CAP: u64 = 5 * 1024 * 1024;\r\n/// How many files to keep (the current file + `KEEP-1` rolled backups) — 2×5 MB.\r\npub const STDERR_LOG_KEEP: usize = 2;\r\n/// The log basename under `SPT_HOME/logs`.\r\npub const STDERR_LOG_BASENAME: &str = \"daemon.stderr.log\";\r\n\r\n/// The `SPT_HOME/logs` directory holding the daemon stderr log(s).\r\npub fn stderr_log_dir() -> PathBuf {\r\n    spt_store::perch::spt_home().join(\"logs\")\r\n}\r\n\r\n/// The current daemon stderr log path (`SPT_HOME/logs/daemon.stderr.log`).\r\npub fn stderr_log_path() -> PathBuf {\r\n    stderr_log_dir().join(STDERR_LOG_BASENAME)\r\n}\r\n\r\n/// The rolled path for backup index `n` (1-based): `daemon.stderr.log.1`, `.2`, …\r\nfn rolled_path(dir: &Path, n: usize) -> PathBuf {\r\n    dir.join(format!(\"{STDERR_LOG_BASENAME}.{n}\"))\r\n}\r\n\r\n/// Whether a current file of `current_size` bytes must roll before more is written,\r\n/// given `cap`. Pure — the rotation-decision kernel. `cap == 0` disables rotation\r\n/// (never rolls) so a caller can opt out without a branch. A file exactly AT the cap\r\n/// rolls (the next write would exceed it).\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn should_roll(current_size: u64, cap: u64) -> bool {\r\n    cap != 0 && current_size >= cap\r\n}\r\n\r\n/// Roll the log files under `dir`, keeping at most `keep` total (`keep-1` backups):\r\n/// drop the oldest, shift `.n → .n+1`, and move the current file to `.1`. Best-effort\r\n/// per rename (a missing intermediate is simply skipped) so a partial prior roll\r\n/// self-heals. `keep == 0` or `keep == 1` keeps NO backups (the current file is just\r\n/// removed to start fresh). Pure over the filesystem — unit-tested against a temp dir.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn roll_files(dir: &Path, keep: usize) {\r\n    // Drop the oldest backup we would otherwise shift into (index keep-1 → keep).\r\n    if keep >= 1 {\r\n        let _ = std::fs::remove_file(rolled_path(dir, keep - 1));\r\n    } else {\r\n        let _ = std::fs::remove_file(rolled_path(dir, 0));\r\n    }\r\n    // Shift .n → .n+1 from the second-oldest down to .1 (descending so nothing\r\n    // clobbers an un-shifted file).\r\n    for n in (1..keep.saturating_sub(1)).rev() {\r\n        let _ = std::fs::rename(rolled_path(dir, n), rolled_path(dir, n + 1));\r\n    }\r\n    let current = dir.join(STDERR_LOG_BASENAME);\r\n    if keep >= 2 {\r\n        let _ = std::fs::rename(&current, rolled_path(dir, 1));\r\n    } else {\r\n        // No backups kept: just clear the current file.\r\n        let _ = std::fs::remove_file(&current);\r\n    }\r\n}\r\n\r\n/// A generation/role stamp header line written at each install so an operator can\r\n/// tell which process + generation wrote the following diagnostics.\r\nfn stamp_line(role: &str, generation: u64) -> String {\r\n    format!(\r\n        \"=== spt {role} stderr — generation {generation} — pid {} ===\",\r\n        std::process::id()\r\n    )\r\n}\r\n\r\n/// Redirect THIS process's stderr FD to `file`, opened in-process (never inherited /\r\n/// piped). Windows: `SetStdHandle(STD_ERROR_HANDLE, handle)`; Unix: `dup2(fd, 2)`.\r\n/// The `file` handle is leaked (`forget`) so it outlives this call — the OS keeps\r\n/// stderr pointed at it for the process lifetime. Best-effort: a redirect failure is\r\n/// non-fatal (diagnostics simply keep going to the prior sink).\r\nfn redirect_stderr_to(file: std::fs::File) {\r\n    #[cfg(windows)]\r\n    {\r\n        use std::os::windows::io::AsRawHandle;\r\n        extern \"system\" {\r\n            fn SetStdHandle(which: u32, handle: isize) -> i32;\r\n        }\r\n        const STD_ERROR_HANDLE: u32 = 0xFFFF_FFF4;\r\n        // SAFETY: a scalar kernel32 set of the std-error slot to a live file handle\r\n        // (the sanctioned FILE stderr the null-guard already treats as safe).\r\n        unsafe {\r\n            let _ = SetStdHandle(STD_ERROR_HANDLE, file.as_raw_handle() as isize);\r\n        }\r\n        std::mem::forget(file); // keep the handle alive for the process lifetime\r\n    }\r\n    #[cfg(unix)]\r\n    {\r\n        use std::os::unix::io::AsRawFd;\r\n        // SAFETY: dup2 onto STDERR_FILENO (2) from a live open file fd; a copy is\r\n        // installed at 2 and the original fd is then closed on drop (dup2 duplicates).\r\n        unsafe {\r\n            let _ = libc::dup2(file.as_raw_fd(), libc::STDERR_FILENO);\r\n        }\r\n        drop(file); // fd 2 is now an independent duplicate\r\n    }\r\n}\r\n\r\n/// Install the persistent stderr sink for THIS process (broker at `daemon run`,\r\n/// brain at `daemon brain`): create `SPT_HOME/logs`, roll the current file if it is\r\n/// already at the cap, open it for append, write the `role`/`generation` stamp, and\r\n/// redirect this process's stderr to it. Best-effort throughout — any failure leaves\r\n/// stderr on its prior sink and is itself reported to the prior stderr, never a\r\n/// panic (a logging setup must never brick the daemon). Returns the log path on a\r\n/// successful redirect, `None` otherwise.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn install(role: &str, generation: u64) -> Option<PathBuf> {\r\n    let dir = stderr_log_dir();\r\n    if let Err(e) = std::fs::create_dir_all(&dir) {\r\n        eprintln!(\"STDERR_PERSIST_SKIP: could not create {}: {e}\", dir.display());\r\n        return None;\r\n    }\r\n    let path = stderr_log_path();\r\n    // Roll a current file already at the cap (bounds growth across restarts).\r\n    let size = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0);\r\n    if should_roll(size, STDERR_LOG_CAP) {\r\n        roll_files(&dir, STDERR_LOG_KEEP);\r\n    }\r\n    let mut file = match std::fs::OpenOptions::new().create(true).append(true).open(&path) {\r\n        Ok(f) => f,\r\n        Err(e) => {\r\n            eprintln!(\"STDERR_PERSIST_SKIP: could not open {}: {e}\", path.display());\r\n            return None;\r\n        }\r\n    };\r\n    // Stamp the header on the PRE-redirect handle (a plain write; the redirect below\r\n    // then points the process stderr at the same file for every later eprintln!).\r\n    let _ = writeln!(file, \"{}\", stamp_line(role, generation));\r\n    let _ = file.flush();\r\n    redirect_stderr_to(file);\r\n    Some(path)\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] the rotation-decision kernel: a file at OR\r\n    // over the cap rolls; under does not; cap 0 disables (never rolls, an opt-out).\r\n    #[test]\r\n    fn should_roll_at_or_over_cap_only() {\r\n        assert!(!should_roll(0, STDERR_LOG_CAP), \"empty never rolls\");\r\n        assert!(!should_roll(STDERR_LOG_CAP - 1, STDERR_LOG_CAP), \"just under never rolls\");\r\n        assert!(should_roll(STDERR_LOG_CAP, STDERR_LOG_CAP), \"exactly at cap rolls\");\r\n        assert!(should_roll(STDERR_LOG_CAP + 1, STDERR_LOG_CAP), \"over cap rolls\");\r\n        assert!(!should_roll(u64::MAX, 0), \"cap 0 disables rotation\");\r\n    }\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] roll keeps at most KEEP files: the current\r\n    // file moves to .1, a pre-existing .1 drops (KEEP=2 → current + one backup), and\r\n    // the content is preserved across the roll (the backup holds the OLD current).\r\n    #[test]\r\n    fn roll_keeps_bounded_generations_and_preserves_current() {\r\n        let dir = tempfile::tempdir().unwrap();\r","truncated":true,"truncatedBy":"lines","totalLines":232,"totalBytes":8983,"outputLines":183,"outputBytes":8983,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! Persistent daemon stderr (LIFECYCLE-TRUTH W3, REQ-DAEMON-STDERR-PERSIST).\r\n//!\r\n//! A detached daemon nulls its stdio (`Stdio::null()` at spawn, or the\r\n//! [`null_std_handles_if_detached_in_fact`](crate::daemon::null_std_handles_if_detached_in_fact)\r\n//! undrained-pipe defense) — so every `eprintln!` diagnostic the broker and brain\r\n//! emit goes to `/dev/null`. The 2026-07-06/07 incident window left ZERO logs; both\r\n//! RCAs ran blind and had to recreate everything from rigs. This module gives the\r\n//! daemon a durable place to write instead: at startup each process REDIRECTS ITS\r\n//! OWN stderr to a rotating, size-capped file under `SPT_HOME/logs`, opened\r\n//! **in-process** — never an inherited or piped handle (`REQ-HAZARD-DETACHED-DAEMON-STDIO`\r\n//! / KH 5.6: a detached child inheriting a caller's pipe BLOCKS when the pipe fills;\r\n//! a disk file never blocks, which is exactly why the existing null-guard already\r\n//! keeps a file stderr alive).\r\n//!\r\n//! Redirecting the process stderr FD (not swapping every call site) captures all\r\n//! existing `eprintln!` output unchanged. Rotation is at INSTALL (each process\r\n//! start / brain generation): the file is stamped with the role + generation, and\r\n//! a current file already at the cap is rolled to `.1` (older dropped) so the log\r\n//! stays bounded at `KEEP × CAP` across restarts. A single very-long-lived\r\n//! generation writing past the cap keeps appending until its next restart — the\r\n//! primary contract is capture-not-null; a hard within-generation live cap is a\r\n//! documented follow-up, not this slice.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\n// [impl->REQ-HAZARD-DETACHED-DAEMON-STDIO]\r\n\r\nuse std::io::Write;\r\nuse std::path::{Path, PathBuf};\r\n\r\n/// The per-file size cap (bytes). At install a current file already ≥ this rolls.\r\npub const STDERR_LOG_CAP: u64 = 5 * 1024 * 1024;\r\n/// How many files to keep (the current file + `KEEP-1` rolled backups) — 2×5 MB.\r\npub const STDERR_LOG_KEEP: usize = 2;\r\n/// The log basename under `SPT_HOME/logs`.\r\npub const STDERR_LOG_BASENAME: &str = \"daemon.stderr.log\";\r\n\r\n/// The `SPT_HOME/logs` directory holding the daemon stderr log(s).\r\npub fn stderr_log_dir() -> PathBuf {\r\n    spt_store::perch::spt_home().join(\"logs\")\r\n}\r\n\r\n/// The current daemon stderr log path (`SPT_HOME/logs/daemon.stderr.log`).\r\npub fn stderr_log_path() -> PathBuf {\r\n    stderr_log_dir().join(STDERR_LOG_BASENAME)\r\n}\r\n\r\n/// The rolled path for backup index `n` (1-based): `daemon.stderr.log.1`, `.2`, …\r\nfn rolled_path(dir: &Path, n: usize) -> PathBuf {\r\n    dir.join(format!(\"{STDERR_LOG_BASENAME}.{n}\"))\r\n}\r\n\r\n/// Whether a current file of `current_size` bytes must roll before more is written,\r\n/// given `cap`. Pure — the rotation-decision kernel. `cap == 0` disables rotation\r\n/// (never rolls) so a caller can opt out without a branch. A file exactly AT the cap\r\n/// rolls (the next write would exceed it).\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn should_roll(current_size: u64, cap: u64) -> bool {\r\n    cap != 0 && current_size >= cap\r\n}\r\n\r\n/// Roll the log files under `dir`, keeping at most `keep` total (`keep-1` backups):\r\n/// drop the oldest, shift `.n → .n+1`, and move the current file to `.1`. Best-effort\r\n/// per rename (a missing intermediate is simply skipped) so a partial prior roll\r\n/// self-heals. `keep == 0` or `keep == 1` keeps NO backups (the current file is just\r\n/// removed to start fresh). Pure over the filesystem — unit-tested against a temp dir.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn roll_files(dir: &Path, keep: usize) {\r\n    // Drop the oldest backup we would otherwise shift into (index keep-1 → keep).\r\n    if keep >= 1 {\r\n        let _ = std::fs::remove_file(rolled_path(dir, keep - 1));\r\n    } else {\r\n        let _ = std::fs::remove_file(rolled_path(dir, 0));\r\n    }\r\n    // Shift .n → .n+1 from the second-oldest down to .1 (descending so nothing\r\n    // clobbers an un-shifted file).\r\n    for n in (1..keep.saturating_sub(1)).rev() {\r\n        let _ = std::fs::rename(rolled_path(dir, n), rolled_path(dir, n + 1));\r\n    }\r\n    let current = dir.join(STDERR_LOG_BASENAME);\r\n    if keep >= 2 {\r\n        let _ = std::fs::rename(&current, rolled_path(dir, 1));\r\n    } else {\r\n        // No backups kept: just clear the current file.\r\n        let _ = std::fs::remove_file(&current);\r\n    }\r\n}\r\n\r\n/// A generation/role stamp header line written at each install so an operator can\r\n/// tell which process + generation wrote the following diagnostics.\r\nfn stamp_line(role: &str, generation: u64) -> String {\r\n    format!(\r\n        \"=== spt {role} stderr — generation {generation} — pid {} ===\",\r\n        std::process::id()\r\n    )\r\n}\r\n\r\n/// Redirect THIS process's stderr FD to `file`, opened in-process (never inherited /\r\n/// piped). Windows: `SetStdHandle(STD_ERROR_HANDLE, handle)`; Unix: `dup2(fd, 2)`.\r\n/// The `file` handle is leaked (`forget`) so it outlives this call — the OS keeps\r\n/// stderr pointed at it for the process lifetime. Best-effort: a redirect failure is\r\n/// non-fatal (diagnostics simply keep going to the prior sink).\r\nfn redirect_stderr_to(file: std::fs::File) {\r\n    #[cfg(windows)]\r\n    {\r\n        use std::os::windows::io::AsRawHandle;\r\n        extern \"system\" {\r\n            fn SetStdHandle(which: u32, handle: isize) -> i32;\r\n        }\r\n        const STD_ERROR_HANDLE: u32 = 0xFFFF_FFF4;\r\n        // SAFETY: a scalar kernel32 set of the std-error slot to a live file handle\r\n        // (the sanctioned FILE stderr the null-guard already treats as safe).\r\n        unsafe {\r\n            let _ = SetStdHandle(STD_ERROR_HANDLE, file.as_raw_handle() as isize);\r\n        }\r\n        std::mem::forget(file); // keep the handle alive for the process lifetime\r\n    }\r\n    #[cfg(unix)]\r\n    {\r\n        use std::os::unix::io::AsRawFd;\r\n        // SAFETY: dup2 onto STDERR_FILENO (2) from a live open file fd; a copy is\r\n        // installed at 2 and the original fd is then closed on drop (dup2 duplicates).\r\n        unsafe {\r\n            let _ = libc::dup2(file.as_raw_fd(), libc::STDERR_FILENO);\r\n        }\r\n        drop(file); // fd 2 is now an independent duplicate\r\n    }\r\n}\r\n\r\n/// Install the persistent stderr sink for THIS process (broker at `daemon run`,\r\n/// brain at `daemon brain`): create `SPT_HOME/logs`, roll the current file if it is\r\n/// already at the cap, open it for append, write the `role`/`generation` stamp, and\r\n/// redirect this process's stderr to it. Best-effort throughout — any failure leaves\r\n/// stderr on its prior sink and is itself reported to the prior stderr, never a\r\n/// panic (a logging setup must never brick the daemon). Returns the log path on a\r\n/// successful redirect, `None` otherwise.\r\n// [impl->REQ-DAEMON-STDERR-PERSIST]\r\npub fn install(role: &str, generation: u64) -> Option<PathBuf> {\r\n    let dir = stderr_log_dir();\r\n    if let Err(e) = std::fs::create_dir_all(&dir) {\r\n        eprintln!(\"STDERR_PERSIST_SKIP: could not create {}: {e}\", dir.display());\r\n        return None;\r\n    }\r\n    let path = stderr_log_path();\r\n    // Roll a current file already at the cap (bounds growth across restarts).\r\n    let size = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0);\r\n    if should_roll(size, STDERR_LOG_CAP) {\r\n        roll_files(&dir, STDERR_LOG_KEEP);\r\n    }\r\n    let mut file = match std::fs::OpenOptions::new().create(true).append(true).open(&path) {\r\n        Ok(f) => f,\r\n        Err(e) => {\r\n            eprintln!(\"STDERR_PERSIST_SKIP: could not open {}: {e}\", path.display());\r\n            return None;\r\n        }\r\n    };\r\n    // Stamp the header on the PRE-redirect handle (a plain write; the redirect below\r\n    // then points the process stderr at the same file for every later eprintln!).\r\n    let _ = writeln!(file, \"{}\", stamp_line(role, generation));\r\n    let _ = file.flush();\r\n    redirect_stderr_to(file);\r\n    Some(path)\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] the rotation-decision kernel: a file at OR\r\n    // over the cap rolls; under does not; cap 0 disables (never rolls, an opt-out).\r\n    #[test]\r\n    fn should_roll_at_or_over_cap_only() {\r\n        assert!(!should_roll(0, STDERR_LOG_CAP), \"empty never rolls\");\r\n        assert!(!should_roll(STDERR_LOG_CAP - 1, STDERR_LOG_CAP), \"just under never rolls\");\r\n        assert!(should_roll(STDERR_LOG_CAP, STDERR_LOG_CAP), \"exactly at cap rolls\");\r\n        assert!(should_roll(STDERR_LOG_CAP + 1, STDERR_LOG_CAP), \"over cap rolls\");\r\n        assert!(!should_roll(u64::MAX, 0), \"cap 0 disables rotation\");\r\n    }\r\n\r\n    // [unit->REQ-DAEMON-STDERR-PERSIST] roll keeps at most KEEP files: the current\r\n    // file moves to .1, a pre-existing .1 drops (KEEP=2 → current + one backup), and\r\n    // the content is preserved across the roll (the backup holds the OLD current).\r\n    #[test]\r\n    fn roll_keeps_bounded_generations_and_preserves_current() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n…\n    }\n…\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,null,201,null,231]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\stderrlog.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":232,"totalBytes":8983,"outputLines":183,"outputBytes":8983,"shownRange":{"start":1,"end":183},"nextOffset":184}}},"isError":false,"timestamp":1784292954532}}
{"type":"message","id":"5eeb4495","parentId":"2bad2491","timestamp":"2026-07-17T12:55:54.534Z","message":{"role":"toolResult","toolCallId":"call_gKGNvXPhJtF3jNnkzbdaNd4k|fc_0148993141920bab016a5a265a67dc8195ba22ada59b694289","toolName":"read","content":[{"type":"text","text":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\n//! [`super::PumpWorker`] seam.\n//!\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\n//! as worker state; `peer_step` pushes this node's own rows for the given\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\n//! two registry cadence knobs.\n\nuse std::io;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nuse spt_net::net::replicate::RegistryFeedRecord;\nuse spt_store::subnet::SubnetStore;\n\nuse crate::registryhost::RegistryHost;\n\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\n\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\n/// The new seed reaches benign offliners over the member control stream's\n/// re-seed leg on their next connect — never over gossip; the revokee's\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\n/// takes effect without a restart.\n// [impl->REQ-MESH-4]\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\n    let due = pending.due_subnets(now_ms);\n    if due.is_empty() {\n        return;\n    }\n    let mut subnets = SubnetStore::load_from(subnets_path);\n    let mut rotated = false;\n    for sub in &due {\n        match subnets.rotate_seed(sub) {\n            Ok(rec) => {\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\n                rotated = true;\n            }\n            // The subnet may have been left/renamed since the revoke — drop the\n            // stale entry rather than retrying it forever.\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\n        }\n        pending.clear(sub);\n    }\n    if rotated {\n        if let Err(e) = subnets.save_to(subnets_path) {\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\n            return; // keep the pending entry — retry next tick rather than lose it\n        }\n    }\n    let _ = pending.save_to(rotations_path);\n}\n\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\n/// re-advertises its own rows; peers reconverge within one cadence\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\npub(super) struct RegistryWorker {\n    /// The shared registry host (sweep + advertise + the canonical epoch).\n    registry: Arc<RegistryHost>,\n    /// The perch tree scanned for advertisable rows.\n    owlery: PathBuf,\n    /// `subnet.json` — read by the due-rotation leg.\n    subnets: PathBuf,\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\n    rotations: PathBuf,\n    /// The event-driven advertisement marker (`poll_wake`).\n    advertise_marker: PathBuf,\n    /// This worker's scheduling period (`cadence.registry`).\n    cadence: Duration,\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\n    evict_after: Duration,\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\n    adverts: Vec<RegistryFeedRecord>,\n}\n\nimpl RegistryWorker {\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\n    pub(super) fn new(\n        registry: Arc<RegistryHost>,\n        paths: &PumpPaths,\n        cadence: &PumpCadence,\n    ) -> RegistryWorker {\n        RegistryWorker {\n            registry,\n            owlery: paths.owlery.clone(),\n            subnets: paths.subnets.clone(),\n            rotations: paths.rotations.clone(),\n            advertise_marker: paths.advertise_marker.clone(),\n            cadence: cadence.registry,\n            evict_after: cadence.registry_evict_after,\n            adverts: Vec::new(),\n        }\n    }\n}\n\nimpl PumpWorker for RegistryWorker {\n    fn cadence(&self) -> Duration {\n        self.cadence\n    }\n\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\n    /// online/offline transition dropped the marker — consume it and run the\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\n    /// path: the forced round is the same advertise_local + push code, so the\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\n    /// so one wake claims exactly one forced round.\n    // [impl->REQ-CONV-2]\n    fn poll_wake(&mut self) -> bool {\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\n    }\n\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\n    /// (§Frozen-7, order preserved verbatim):\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\n        // eviction.\n        // [impl->REQ-SUBNET-7]\n        self.registry.consume_repair_evictions();\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\n        // resolution forever; a live peer re-stamps its heard entry with every\n        // admitted feed and is never touched.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_silent_peers(self.evict_after);\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\n        // evicts rows that have been non-routable (Offline) beyond the grace even\n        // while their author node is alive (a purge/erase Offline ghost that\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\n        // registry_evict_after grace; own rows never decay; the receiver-observed\n        // offline_since is self-pruning so a whole-node eviction above drops its\n        // stamps for free.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_aged_offline_rows(self.evict_after);\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\n        // closed — after the eviction sweep, before re-advertising. The\n        // re-minted seed rides the member control stream on the next connect;\n        // the revokee's tombstone (already propagated) keeps it locked out.\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\n        // Re-advertise this node's own rows; held as worker state for the\n        // per-subnet `peer_step` filter below.\n        self.adverts = self.registry.advertise_local(&self.owlery);\n    }\n\n    /// Push this node's own rows for `subnet` over the peer's feed stream\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\n    /// stream per feed.\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        _peer_hex: &str,\n        _ctx: &RoundCtx,\n    ) -> io::Result<()> {\n        let lines: Vec<u8> = self\n            .adverts\n            .iter()\n            .filter(|u| u.subnet() == subnet)\n            .flat_map(|u| u.encode_line())\n            .collect();\n        if !lines.is_empty() {\n            io.push_feed(&lines)?;\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n    use spt_store::epoch::EpochSource;\n\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\n    // scheduled. This is the daemon-side half of the coalescing window.\n    #[test]\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\n        let dir = tempfile::tempdir().unwrap();\n        let subnets_path = dir.path().join(\"subnet.json\");\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\n\n        let mut subnets = SubnetStore::default();\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\n        subnets.create_subnet(\"work\").unwrap();\n        subnets.save_to(&subnets_path).unwrap();\n\n        let mut pending = spt_store::rotation::RotationPending::default();\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\n        pending.save_to(&rotations_path).unwrap();\n\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\n\n        let after = SubnetStore::load_from(&subnets_path);\n        let home = after.find(\"home\").unwrap();\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\n        assert_eq!(\n            home.prev_seed_hex.as_deref(),\n            Some(before_home.seed_hex.as_str()),\n            \"prior seed retained for the grace\"\n        );\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\n\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\n    }\n\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\n    // marker exactly once — one online/offline transition forces exactly one\n    // registry round, and an absent marker forces nothing.\n    #[test]\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\n        let dir = tempfile::tempdir().unwrap();\n        let marker = dir.path().join(\"advertise-now\");\n        let mut w = RegistryWorker {\n            registry: Arc::new(RegistryHost::new_at(\n                \"aa11\",\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\n                dir.path().join(\"registry\"),\n            )),\n            owlery: dir.path().join(\"owlery\"),\n            subnets: dir.path().join(\"subnet.json\"),\n            rotations: dir.path().join(\"rotation-pending.json\"),\n            advertise_marker: marker.clone(),\n            cadence: Duration::from_secs(30),\n            evict_after: Duration::from_secs(600),\n            adverts: Vec::new(),\n        };\n        assert!(!w.poll_wake(), \"nothing to take yet\");\n        std::fs::write(&marker, b\"\").unwrap();\n        assert!(w.poll_wake(), \"first take claims the transition\");\n        assert!(!w.poll_wake(), \"second take gets nothing\");\n    }\n\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\n    // verbatim from the pre-seam inline loop; each step keeps its own\n    // registryhost-side unit coverage.\n    #[test]\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\n        with_home(|home| {\n            // A served subnet plus one advertisable Self perch.\n            let owlery = home.join(\"owlery\");\n            let id = \"adv-ag\";\n            let p = spt_store::perch::resolve_perch_path_in(\n…\n            );\n…\n        });\n    }\n}\n\n[Showing lines 1-263 of 334. Use :264 to continue]"}],"details":{"truncation":{"content":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\r\n//! [`super::PumpWorker`] seam.\r\n//!\r\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\r\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\r\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\r\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\r\n//! as worker state; `peer_step` pushes this node's own rows for the given\r\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\r\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\r\n//! two registry cadence knobs.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::sync::Arc;\r\nuse std::time::Duration;\r\n\r\nuse spt_net::net::replicate::RegistryFeedRecord;\r\nuse spt_store::subnet::SubnetStore;\r\n\r\nuse crate::registryhost::RegistryHost;\r\n\r\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\r\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\r\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\r\n/// The new seed reaches benign offliners over the member control stream's\r\n/// re-seed leg on their next connect — never over gossip; the revokee's\r\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\r\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\r\n/// takes effect without a restart.\r\n// [impl->REQ-MESH-4]\r\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\r\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\r\n    let due = pending.due_subnets(now_ms);\r\n    if due.is_empty() {\r\n        return;\r\n    }\r\n    let mut subnets = SubnetStore::load_from(subnets_path);\r\n    let mut rotated = false;\r\n    for sub in &due {\r\n        match subnets.rotate_seed(sub) {\r\n            Ok(rec) => {\r\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\r\n                rotated = true;\r\n            }\r\n            // The subnet may have been left/renamed since the revoke — drop the\r\n            // stale entry rather than retrying it forever.\r\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\r\n        }\r\n        pending.clear(sub);\r\n    }\r\n    if rotated {\r\n        if let Err(e) = subnets.save_to(subnets_path) {\r\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\r\n            return; // keep the pending entry — retry next tick rather than lose it\r\n        }\r\n    }\r\n    let _ = pending.save_to(rotations_path);\r\n}\r\n\r\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\r\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\r\n/// re-advertises its own rows; peers reconverge within one cadence\r\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\r\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\r\npub(super) struct RegistryWorker {\r\n    /// The shared registry host (sweep + advertise + the canonical epoch).\r\n    registry: Arc<RegistryHost>,\r\n    /// The perch tree scanned for advertisable rows.\r\n    owlery: PathBuf,\r\n    /// `subnet.json` — read by the due-rotation leg.\r\n    subnets: PathBuf,\r\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\r\n    rotations: PathBuf,\r\n    /// The event-driven advertisement marker (`poll_wake`).\r\n    advertise_marker: PathBuf,\r\n    /// This worker's scheduling period (`cadence.registry`).\r\n    cadence: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\r\n    evict_after: Duration,\r\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\r\n    adverts: Vec<RegistryFeedRecord>,\r\n}\r\n\r\nimpl RegistryWorker {\r\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\r\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\r\n    pub(super) fn new(\r\n        registry: Arc<RegistryHost>,\r\n        paths: &PumpPaths,\r\n        cadence: &PumpCadence,\r\n    ) -> RegistryWorker {\r\n        RegistryWorker {\r\n            registry,\r\n            owlery: paths.owlery.clone(),\r\n            subnets: paths.subnets.clone(),\r\n            rotations: paths.rotations.clone(),\r\n            advertise_marker: paths.advertise_marker.clone(),\r\n            cadence: cadence.registry,\r\n            evict_after: cadence.registry_evict_after,\r\n            adverts: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for RegistryWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\r\n    /// online/offline transition dropped the marker — consume it and run the\r\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\r\n    /// path: the forced round is the same advertise_local + push code, so the\r\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\r\n    /// so one wake claims exactly one forced round.\r\n    // [impl->REQ-CONV-2]\r\n    fn poll_wake(&mut self) -> bool {\r\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\r\n    }\r\n\r\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\r\n    /// (§Frozen-7, order preserved verbatim):\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\r\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\r\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\r\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::epoch::EpochSource;\r\n\r\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\r\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\r\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\r\n    // scheduled. This is the daemon-side half of the coalescing window.\r\n    #[test]\r\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let subnets_path = dir.path().join(\"subnet.json\");\r\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\r\n\r\n        let mut subnets = SubnetStore::default();\r\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\r\n        subnets.create_subnet(\"work\").unwrap();\r\n        subnets.save_to(&subnets_path).unwrap();\r\n\r\n        let mut pending = spt_store::rotation::RotationPending::default();\r\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\r\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\r\n        pending.save_to(&rotations_path).unwrap();\r\n\r\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\r\n\r\n        let after = SubnetStore::load_from(&subnets_path);\r\n        let home = after.find(\"home\").unwrap();\r\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\r\n        assert_eq!(\r\n            home.prev_seed_hex.as_deref(),\r\n            Some(before_home.seed_hex.as_str()),\r\n            \"prior seed retained for the grace\"\r\n        );\r\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\r\n\r\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\r\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\r\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\r\n    }\r\n\r\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\r\n    // marker exactly once — one online/offline transition forces exactly one\r\n    // registry round, and an absent marker forces nothing.\r\n    #[test]\r\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let marker = dir.path().join(\"advertise-now\");\r\n        let mut w = RegistryWorker {\r\n            registry: Arc::new(RegistryHost::new_at(\r\n                \"aa11\",\r\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\r\n                dir.path().join(\"registry\"),\r\n            )),\r\n            owlery: dir.path().join(\"owlery\"),\r\n            subnets: dir.path().join(\"subnet.json\"),\r\n            rotations: dir.path().join(\"rotation-pending.json\"),\r\n            advertise_marker: marker.clone(),\r\n            cadence: Duration::from_secs(30),\r\n            evict_after: Duration::from_secs(600),\r\n            adverts: Vec::new(),\r\n        };\r\n        assert!(!w.poll_wake(), \"nothing to take yet\");\r\n        std::fs::write(&marker, b\"\").unwrap();\r\n        assert!(w.poll_wake(), \"first take claims the transition\");\r\n        assert!(!w.poll_wake(), \"second take gets nothing\");\r\n    }\r\n\r\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\r\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\r\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\r\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\r\n    // verbatim from the pre-seam inline loop; each step keeps its own\r\n    // registryhost-side unit coverage.\r\n    #[test]\r\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\r\n        with_home(|home| {\r\n            // A served subnet plus one advertisable Self perch.\r\n            let owlery = home.join(\"owlery\");\r\n            let id = \"adv-ag\";\r\n            let p = spt_store::perch::resolve_perch_path_in(\r","truncated":true,"truncatedBy":"lines","totalLines":334,"totalBytes":12158,"outputLines":263,"outputBytes":12158,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\r\n//! [`super::PumpWorker`] seam.\r\n//!\r\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\r\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\r\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\r\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\r\n//! as worker state; `peer_step` pushes this node's own rows for the given\r\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\r\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\r\n//! two registry cadence knobs.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::sync::Arc;\r\nuse std::time::Duration;\r\n\r\nuse spt_net::net::replicate::RegistryFeedRecord;\r\nuse spt_store::subnet::SubnetStore;\r\n\r\nuse crate::registryhost::RegistryHost;\r\n\r\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\r\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\r\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\r\n/// The new seed reaches benign offliners over the member control stream's\r\n/// re-seed leg on their next connect — never over gossip; the revokee's\r\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\r\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\r\n/// takes effect without a restart.\r\n// [impl->REQ-MESH-4]\r\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\r\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\r\n    let due = pending.due_subnets(now_ms);\r\n    if due.is_empty() {\r\n        return;\r\n    }\r\n    let mut subnets = SubnetStore::load_from(subnets_path);\r\n    let mut rotated = false;\r\n    for sub in &due {\r\n        match subnets.rotate_seed(sub) {\r\n            Ok(rec) => {\r\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\r\n                rotated = true;\r\n            }\r\n            // The subnet may have been left/renamed since the revoke — drop the\r\n            // stale entry rather than retrying it forever.\r\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\r\n        }\r\n        pending.clear(sub);\r\n    }\r\n    if rotated {\r\n        if let Err(e) = subnets.save_to(subnets_path) {\r\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\r\n            return; // keep the pending entry — retry next tick rather than lose it\r\n        }\r\n    }\r\n    let _ = pending.save_to(rotations_path);\r\n}\r\n\r\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\r\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\r\n/// re-advertises its own rows; peers reconverge within one cadence\r\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\r\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\r\npub(super) struct RegistryWorker {\r\n    /// The shared registry host (sweep + advertise + the canonical epoch).\r\n    registry: Arc<RegistryHost>,\r\n    /// The perch tree scanned for advertisable rows.\r\n    owlery: PathBuf,\r\n    /// `subnet.json` — read by the due-rotation leg.\r\n    subnets: PathBuf,\r\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\r\n    rotations: PathBuf,\r\n    /// The event-driven advertisement marker (`poll_wake`).\r\n    advertise_marker: PathBuf,\r\n    /// This worker's scheduling period (`cadence.registry`).\r\n    cadence: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\r\n    evict_after: Duration,\r\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\r\n    adverts: Vec<RegistryFeedRecord>,\r\n}\r\n\r\nimpl RegistryWorker {\r\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\r\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\r\n    pub(super) fn new(\r\n        registry: Arc<RegistryHost>,\r\n        paths: &PumpPaths,\r\n        cadence: &PumpCadence,\r\n    ) -> RegistryWorker {\r\n        RegistryWorker {\r\n            registry,\r\n            owlery: paths.owlery.clone(),\r\n            subnets: paths.subnets.clone(),\r\n            rotations: paths.rotations.clone(),\r\n            advertise_marker: paths.advertise_marker.clone(),\r\n            cadence: cadence.registry,\r\n            evict_after: cadence.registry_evict_after,\r\n            adverts: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for RegistryWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\r\n    /// online/offline transition dropped the marker — consume it and run the\r\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\r\n    /// path: the forced round is the same advertise_local + push code, so the\r\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\r\n    /// so one wake claims exactly one forced round.\r\n    // [impl->REQ-CONV-2]\r\n    fn poll_wake(&mut self) -> bool {\r\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\r\n    }\r\n\r\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\r\n    /// (§Frozen-7, order preserved verbatim):\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\r\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\r\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\r\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::epoch::EpochSource;\r\n\r\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\r\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\r\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\r\n    // scheduled. This is the daemon-side half of the coalescing window.\r\n    #[test]\r\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let subnets_path = dir.path().join(\"subnet.json\");\r\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\r\n\r\n        let mut subnets = SubnetStore::default();\r\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\r\n        subnets.create_subnet(\"work\").unwrap();\r\n        subnets.save_to(&subnets_path).unwrap();\r\n\r\n        let mut pending = spt_store::rotation::RotationPending::default();\r\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\r\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\r\n        pending.save_to(&rotations_path).unwrap();\r\n\r\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\r\n\r\n        let after = SubnetStore::load_from(&subnets_path);\r\n        let home = after.find(\"home\").unwrap();\r\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\r\n        assert_eq!(\r\n            home.prev_seed_hex.as_deref(),\r\n            Some(before_home.seed_hex.as_str()),\r\n            \"prior seed retained for the grace\"\r\n        );\r\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\r\n\r\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\r\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\r\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\r\n    }\r\n\r\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\r\n    // marker exactly once — one online/offline transition forces exactly one\r\n    // registry round, and an absent marker forces nothing.\r\n    #[test]\r\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let marker = dir.path().join(\"advertise-now\");\r\n        let mut w = RegistryWorker {\r\n            registry: Arc::new(RegistryHost::new_at(\r\n                \"aa11\",\r\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\r\n                dir.path().join(\"registry\"),\r\n            )),\r\n            owlery: dir.path().join(\"owlery\"),\r\n            subnets: dir.path().join(\"subnet.json\"),\r\n            rotations: dir.path().join(\"rotation-pending.json\"),\r\n            advertise_marker: marker.clone(),\r\n            cadence: Duration::from_secs(30),\r\n            evict_after: Duration::from_secs(600),\r\n            adverts: Vec::new(),\r\n        };\r\n        assert!(!w.poll_wake(), \"nothing to take yet\");\r\n        std::fs::write(&marker, b\"\").unwrap();\r\n        assert!(w.poll_wake(), \"first take claims the transition\");\r\n        assert!(!w.poll_wake(), \"second take gets nothing\");\r\n    }\r\n\r\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\r\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\r\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\r\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\r\n    // verbatim from the pre-seam inline loop; each step keeps its own\r\n    // registryhost-side unit coverage.\r\n    #[test]\r\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\r\n        with_home(|home| {\r\n            // A served subnet plus one advertisable Self perch.\r\n            let owlery = home.join(\"owlery\");\r\n            let id = \"adv-ag\";\r\n            let p = spt_store::perch::resolve_perch_path_in(\r\n…\n            );\n…\n        });\n    }\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,null,267,null,331,332,333]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\registry.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":334,"totalBytes":12158,"outputLines":263,"outputBytes":12158,"shownRange":{"start":1,"end":263},"nextOffset":264}}},"isError":false,"timestamp":1784292954534}}
{"type":"message","id":"48241880","parentId":"5eeb4495","timestamp":"2026-07-17T12:56:11.041Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Grep logs for event timing**\n\n**Analyzing periodic task timing and clustering**"},{"type":"toolCall","id":"call_scJ4p6Laz4w4IfRYOJc7OKOb|fc_0148993141920bab016a5a266af45881959dca803df92acb22","name":"read","arguments":{"i":"Reading daemon cadence config","path":"C:/Users/decid/AppData/Local/spt-core/daemon.json","selector":"raw"}},{"type":"toolCall","id":"call_EQMRDAJ7gBwDxlXTyMgeBVxm|fc_0148993141920bab016a5a266af4688195af9b8d9e81f50ec6","name":"read","arguments":{"i":"Reading pump health snapshot","path":"C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json","selector":"raw"}},{"type":"toolCall","id":"call_fFkfhtBAgFg8UBaupeoBDyBb|fc_0148993141920bab016a5a266af46c8195ace0eaf914b27a6f","name":"read","arguments":{"i":"Reading project index stats","path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","selector":"raw"}},{"type":"toolCall","id":"call_ejnRO3nfviYCQSqjlehj8fjw|fc_0148993141920bab016a5a266af47481959ee46ba647aa44cc","name":"grep","arguments":{"i":"Extracting current pump events","pattern":"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_2QDnAPeoPLQKJmmDqEuvLmoP|fc_0148993141920bab016a5a266af47c8195825dcf1a5f727625","name":"grep","arguments":{"i":"Extracting prior pump timing","pattern":"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_LSOrdo13FBYjGGOEmtZVILmY|fc_0148993141920bab016a5a266af48081959c7be5bd0a8b4a1a","name":"grep","arguments":{"i":"Checking poison telemetry","pattern":"poison|subscriber busy|replay halted|lease canceled|breaker-trip|oneway-strike-retire","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_qohu74KrP7VaB8pFpgJEwSC3|fc_0148993141920bab016a5a266af484819599e6ece7d0836e41","name":"grep","arguments":{"i":"Finding registry feed logging","pattern":"eprintln!|REGISTRY_|Served\\(|registry feed|feed:","path":"crates/spt-daemon/src/dispatch.rs","selector":"700-1050","case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":25019,"output":833,"cacheRead":89600,"cacheWrite":0,"totalTokens":115452,"reasoningTokens":329,"cost":{"input":0.125095,"output":0.024990000000000002,"cacheRead":0.0448,"cacheWrite":0,"total":0.19488500000000003}},"stopReason":"toolUse","timestamp":1784292954578,"responseId":"resp_0148993141920bab016a5a265ad3bc81958578096f07f9cacf","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a265bf2448195afbc96e01eda5320","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiZqHS4ckY8enfeqDLScfjZzCoXLrnjl2TD0_zpkd2CfzgU15PYJxP88YRQ5y56f9Mjt1qX_9KxISYRKK-nsNIyX5sFDUPditiG8nwnygloxSfYZMkoRf49JeOvauf-YJE8PP9gf-y0_fCemVCUs-bA4OG8akrEYmN6w20Fe08CiJBbyDJkCskxjjHACyWJm4LkK8e7XE4H2I_rTZwmv8X632-pMS0qj59fNqY6UnGox0UBCiCYnfWX3HmEa5cQHrJwKCYgiyiwQk6KGBdU1hPt-JkU9Q7uSDWTEbgzQjbU3ZVnk8pwpAhYJdTZ9Kphrf30y6S17erXAEIC8rcHDAynfroabsrcOBsAkvzCPXWUCLdlSICZnS5Y5yksn0ZOkLy-woSJoRAKa03wBgIFK1PZPNn9snznMVe34GRoqRqxo3vcdgcMWy3cNRpgAAdXJDIA_uYI5EvHKQ3xO6e3CD1YYd_4G13mbt5LRQoGNdaPjVHjWHNmNbcMCTxWKFQ79bliQYLcCZTTcmTiPl59z_WEvInsftBWmhiCEba0USN60dvXf9RtjxNtW3rTefi3-oFAqKYgxDlWF8v9RzR1w3U0OUwnIfn80YhvOszyG7deyBCJvG1pg9pB91RI-Nd6JoChlxhSpWwvtU1lp59SBmlEzX3r4PwKRf9AVylGT2KVSx3mklH0w_gY2UKA80QG6U0vc2WIXLe5-vdPqPg036gCcz5u24bei3tcXFkxFuyULUAmgfjvajfk52BY5gitsaq6RP0XQ5GEdOrtYwpelfVryyHj7cOkI7I132j_UIOc21EnzlBDzR8Dc2Ze_frHhFkkFraRrOCp2l5oDCldCQWfSp3AJ52PEas4VYs1vvV5puflO5zqFZFhUCnSO83jDYpZIZWWhNjUhmYE-VhY4vNqnWSNRuVUek34Tyktpm7IzqFfWKZUUoJpEwu6PTqEr_iDbKcWPiqIHWjDwYkwZpmkdtGu2TYj-ecGQpNRHK0MIfwlzQwliv_xvJUZrNV332-wxGnY8jpAaosyS_m9RXBdqrAUNLVzSSbjUdBTNo5vIFzO-2GAIHGvZ7MC1f-ef1DXSn0rmD29UcsCCrYPwy0HuxHjyhpWQzoJO52NTdkERN5GOm9GFMMkN_h6Uj1ipyblyj8WdFuJwMz7ZdtburVxY6Jf8E4hGYCf9235CVKOuaGShu-_geX92FpBenQy-5s4LTLysk6mYiwNgehOhOdO9S4XdnfjCMnsM7ghC0dE_AFmB7HqHqJDOTt7nuBujHr17uORbXwGbb5DjkDtzTaxmUrHJEtpbphUq-rMN-2PkyM-5kkBhZXq5bcy9t2oXQJU5XDd-tUDXS4s-Ay-FUsnaI6mAB1mTyeg8hJGf3JPp9-AsIDVfr0BG2SaDuCCB4pMNkPyizAMsSP-rDpPn5ArmkoeK1Ie6xCMFr1lz6UoXEH91BY8VQFLlyj58HluYLmwJkhe4vn6Jwaj6EBtNfu80FiGqiYHv021YEtIClMXYe-oVC3OdysNZIWS72AoAQlZzpIb-Ld13vOtgbL4AxmbaEMyXVFd6wW8a2yAm_mtGvopvql2ABGRn6mQ2DkPWVlnpUS0PEt5AN4e2xVdf_ePqmZ0Y85HwznuK3ohWB9ZVBefXkIhOb-HwXDLllSjMC-lbP3dUcMtVuKSEJ4oQ0n4SkFOyd6DxLszunT2XSKNAM_FIUxyfGNwj9WKxNdCoab-gEYM7x7urP9NX-mVkvUR5u69UpnGNdm9lbQs7ZEf9gNgdSB-5D2YucslzsnwnsMH3zzo0YylOcZI90APk4mpBjaIClLvPJXlW538o9QBNr8O1DHmO8ytTtk8-HptzHxbuAeplzKUjZ5rvGdF9aujHXZrAOvioPX88nyDTYhP9pe661_Vl3-dlHAQPk0MOalX1cp3zIEYGY7s8IRwOlsjcJvPfk7F83ICO-Va-Y-76SxWIYwFy4B7bkpA_AqofBv7YXE1ZPgl_mQJgzO9PT97F8qMFNTPO5d3MpdS6whncQk_TksbOUY7BUpqbZmQscw5mZj_Uo511RoYRWI_i0Pt4HrSjP7_lDlK18YNqXEkHsMlTrfhRItBscbuynJIDZB4aK_3H4gwKP-Q48IRF-_O95tRBHsmOkHA0iRk_vsfhGB2yN4hUOVm1NV1Mnsu7LLZoMlS1o11HegvSeOc4mPSTmGQ9-Xoig_7LuulEt4NdAVJmODD-nmg4Nt7NFjE9TaZSl1kzfJ4wlO-6YW8w8fKUcvQyxw8TvijAMD6oZ6KJSU8LJtOlqxzPMlu2kLdTRmbPbNdMiuwc61mV-VBdSqvA_lzJjDJGgGAfvzFShx0WzDSKQFY0whyPgATOJv2iObQazcYlAakFCgrg7AB-JCn-z6Cy0Z6kMvkH8ri168u9wytQczxrrU0BCQxHdWXqaT17PDo3RMAxjElxrFD-3Ko2Kmo7J-BSlvGc7uL_LAdoo7-vCPhlSdq1A9L4joqbA-h9UJjrHYitbrvgD1qcR1fG9_gkKL4wWcXbz2YwFYSsLmGStGtnRQw-A8NlSzn5HsoZBW4pEKKIMuxEwTzHWk4V60uotrotm1KN6bmAf22lYtfKzRQtU4Z50NK1OQN_hbZJDghMo5EPab752dGUw17Fzz70F6wJdSbdANmwkKQEg2oRIl6xOysxaSvfZJ6F83fIUBNG7fOihm45ToR25bMaplvxv60ZbNjzjwvizdvGFnCHWdFgzs-5tejXsBvBVRqnIa1xjccymQpU9IdvZJ02By9yzTcbQby_wvWklh9iOTfyR4tDpFrhGmtnNg7WaVIhs-JBedqErkaU1Tai8JMVxm2_lzwBE2MZIjsWBkO1VeFMvPwfeYTSU3FjYafl9G8LJ0jjT_CXlefClFItluW155t0KI_RuVY0irIZ7z04mDq0WvK7SNhyPQ-DAAjZP9QYAZYCmlZHWU-BMuoJe1yaGmHhLRVJlgnetrqet_54NIC559oHbD3fkYKoaWGLEfUP","summary":[{"type":"summary_text","text":"**Grep logs for event timing**"},{"type":"summary_text","text":"**Analyzing periodic task timing and clustering**"}]},{"id":"fc_0148993141920bab016a5a266af45881959dca803df92acb22","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading daemon cadence config\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/daemon.json\",\"selector\":\"raw\"}","call_id":"call_scJ4p6Laz4w4IfRYOJc7OKOb","name":"read"},{"id":"fc_0148993141920bab016a5a266af4688195af9b8d9e81f50ec6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump health snapshot\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json\",\"selector\":\"raw\"}","call_id":"call_EQMRDAJ7gBwDxlXTyMgeBVxm","name":"read"},{"id":"fc_0148993141920bab016a5a266af46c8195ace0eaf914b27a6f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project index stats\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json\",\"selector\":\"raw\"}","call_id":"call_fFkfhtBAgFg8UBaupeoBDyBb","name":"read"},{"id":"fc_0148993141920bab016a5a266af47481959ee46ba647aa44cc","type":"function_call","status":"completed","arguments":"{\"i\":\"Extracting current pump events\",\"pattern\":\"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_ejnRO3nfviYCQSqjlehj8fjw","name":"grep"},{"id":"fc_0148993141920bab016a5a266af47c8195825dcf1a5f727625","type":"function_call","status":"completed","arguments":"{\"i\":\"Extracting prior pump timing\",\"pattern\":\"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_2QDnAPeoPLQKJmmDqEuvLmoP","name":"grep"},{"id":"fc_0148993141920bab016a5a266af48081959c7be5bd0a8b4a1a","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking poison telemetry\",\"pattern\":\"poison|subscriber busy|replay halted|lease canceled|breaker-trip|oneway-strike-retire\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_LSOrdo13FBYjGGOEmtZVILmY","name":"grep"},{"id":"fc_0148993141920bab016a5a266af484819599e6ece7d0836e41","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry feed logging\",\"pattern\":\"eprintln!|REGISTRY_|Served\\\\(|registry feed|feed:\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"700-1050\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_qohu74KrP7VaB8pFpgJEwSC3","name":"grep"}]},"duration":16460.536800011992,"ttft":1385.8075000047684,"contextSnapshot":{"promptTokens":114619,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_scJ4p6Laz4w4IfRYOJc7OKOb|fc_0148993141920bab016a5a266af45881959dca803df92acb22","toolName":"read","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/daemon.json"},"intent":"Reading daemon cadence config"},"id":"ab6cf71d","parentId":"48241880","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_EQMRDAJ7gBwDxlXTyMgeBVxm|fc_0148993141920bab016a5a266af4688195af9b8d9e81f50ec6","toolName":"read","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json"},"intent":"Reading pump health snapshot"},"id":"f42778c5","parentId":"ab6cf71d","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fFkfhtBAgFg8UBaupeoBDyBb|fc_0148993141920bab016a5a266af46c8195ace0eaf914b27a6f","toolName":"read","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json"},"intent":"Reading project index stats"},"id":"2a810bf5","parentId":"f42778c5","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ejnRO3nfviYCQSqjlehj8fjw|fc_0148993141920bab016a5a266af47481959ee46ba647aa44cc","toolName":"grep","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Extracting current pump events"},"id":"798d4356","parentId":"2a810bf5","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_2QDnAPeoPLQKJmmDqEuvLmoP|fc_0148993141920bab016a5a266af47c8195825dcf1a5f727625","toolName":"grep","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1"},"intent":"Extracting prior pump timing"},"id":"950bd686","parentId":"798d4356","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_LSOrdo13FBYjGGOEmtZVILmY|fc_0148993141920bab016a5a266af48081959c7be5bd0a8b4a1a","toolName":"grep","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1"},"intent":"Checking poison telemetry"},"id":"e7c27870","parentId":"950bd686","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qohu74KrP7VaB8pFpgJEwSC3|fc_0148993141920bab016a5a266af484819599e6ece7d0836e41","toolName":"grep","startedAt":"2026-07-17T12:56:11.042Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding registry feed logging"},"id":"ee995100","parentId":"e7c27870","timestamp":"2026-07-17T12:56:11.042Z"}
{"type":"message","id":"7a16670f","parentId":"ee995100","timestamp":"2026-07-17T12:56:11.046Z","message":{"role":"toolResult","toolCallId":"call_qohu74KrP7VaB8pFpgJEwSC3|fc_0148993141920bab016a5a266af484819599e6ece7d0836e41","toolName":"grep","content":[{"type":"text","text":" 860|        Err(e) if e.to_string().contains(\"no such stream\") => {\n*861|            return WorkerReport::bare(DispatchOutcome::Served(\n 862|                \"terminal pre-serve: row already gone\".into(),\n 863|            ))\n 864|        }\n...\n 889|        return WorkerReport {\n*890|            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n 891|            family: Some(family),\n 892|            endpoint,\n 893|        };\n...\n 928|            ) {\n*929|                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 930|                Err(e) => DispatchOutcome::Failed(e.to_string()),\n 931|            }\n 932|        }\n...\n 936|            match serve_update(&mut brain, stream_id, origin, 0, &cache, &roster) {\n*937|                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 938|                Err(e) => DispatchOutcome::Failed(e.to_string()),\n 939|            }\n 940|        }\n...\n 1004|                ) {\n*1005|                    Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1006|                    Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1007|                },\n 1008|                None => {\n...\n 1010|                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n*1011|                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\n 1012|                }\n 1013|            }\n 1014|        }\n...\n 1029|                    ) {\n*1030|                        Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1031|                        Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1032|                    }\n 1033|                }\n...\n 1035|                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n*1036|                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\n 1037|                }\n 1038|            }\n 1039|        }\n...\n 1047|            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\n*1048|                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1049|                Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1050|            }"}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/dispatch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":9,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":9}],"truncated":false,"displayContent":"  860│        Err(e) if e.to_string().contains(\"no such stream\") => {\n *861│            return WorkerReport::bare(DispatchOutcome::Served(\n  862│                \"terminal pre-serve: row already gone\".into(),\n  863│            ))\n  864│        }\n     │...\n  889│        return WorkerReport {\n *890│            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n  891│            family: Some(family),\n  892│            endpoint,\n  893│        };\n     │...\n  928│            ) {\n *929│                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n  930│                Err(e) => DispatchOutcome::Failed(e.to_string()),\n  931│            }\n  932│        }\n     │...\n  936│            match serve_update(&mut brain, stream_id, origin, 0, &cache, &roster) {\n *937│                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n  938│                Err(e) => DispatchOutcome::Failed(e.to_string()),\n  939│            }\n  940│        }\n     │...\n 1004│                ) {\n*1005│                    Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1006│                    Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1007│                },\n 1008│                None => {\n     │...\n 1010│                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n*1011│                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\n 1012│                }\n 1013│            }\n 1014│        }\n     │...\n 1029│                    ) {\n*1030│                        Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1031│                        Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1032│                    }\n 1033│                }\n     │...\n 1035│                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n*1036│                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\n 1037│                }\n 1038│            }\n 1039│        }\n     │...\n 1047│            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\n*1048│                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n 1049│                Err(e) => DispatchOutcome::Failed(e.to_string()),\n 1050│            }"},"isError":false,"timestamp":1784292971046}}
{"type":"message","id":"3e6f987a","parentId":"7a16670f","timestamp":"2026-07-17T12:56:11.048Z","message":{"role":"toolResult","toolCallId":"call_scJ4p6Laz4w4IfRYOJc7OKOb|fc_0148993141920bab016a5a266af45881959dca803df92acb22","toolName":"read","content":[{"type":"text","text":"{\n  \"pulse_period_ms\": 5000,\n  \"protection_window_ms\": 2000,\n  \"crash_grace_ms\": 2000,\n  \"full_auto_update\": false,\n  \"relay\": \"n0\",\n  \"peer_pump\": true,\n  \"registry_pump_period_ms\": 30000,\n  \"registry_evict_after_ms\": 300000,\n  \"notif_pump_period_ms\": 15000,\n  \"sync_pull_period_ms\": 60000,\n  \"update_check_period_ms\": 3600000,\n  \"detached_subnets\": [],\n  \"worker_reap_ttl_secs\": 86400,\n  \"startup_endpoints\": [\n    {\n      \"id\": \"mobile-gw\",\n      \"adapter\": \"mobile\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    },\n    {\n      \"id\": \"lia\",\n      \"adapter\": \"claude-spt\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    }\n  ]\n}"}],"details":{"displayContent":{"text":"{\n  \"pulse_period_ms\": 5000,\n  \"protection_window_ms\": 2000,\n  \"crash_grace_ms\": 2000,\n  \"full_auto_update\": false,\n  \"relay\": \"n0\",\n  \"peer_pump\": true,\n  \"registry_pump_period_ms\": 30000,\n  \"registry_evict_after_ms\": 300000,\n  \"notif_pump_period_ms\": 15000,\n  \"sync_pull_period_ms\": 60000,\n  \"update_check_period_ms\": 3600000,\n  \"detached_subnets\": [],\n  \"worker_reap_ttl_secs\": 86400,\n  \"startup_endpoints\": [\n    {\n      \"id\": \"mobile-gw\",\n      \"adapter\": \"mobile\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    },\n    {\n      \"id\": \"lia\",\n      \"adapter\": \"claude-spt\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    }\n  ]\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/daemon.json"}}},"isError":false,"timestamp":1784292971047}}
{"type":"message","id":"12119dc2","parentId":"3e6f987a","timestamp":"2026-07-17T12:56:11.048Z","message":{"role":"toolResult","toolCallId":"call_fFkfhtBAgFg8UBaupeoBDyBb|fc_0148993141920bab016a5a266af46c8195ace0eaf914b27a6f","toolName":"read","content":[{"type":"text","text":"{\"generated_ms\":1784292861265,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784292861265,\"last_duration_ms\":1606,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":13,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":8,\"derivations\":11},\"cumulative\":{\"branch_enumerations\":2,\"tree_scans\":8,\"derivations\":11}}"}],"details":{"displayContent":{"text":"{\"generated_ms\":1784292861265,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784292861265,\"last_duration_ms\":1606,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":13,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":8,\"derivations\":11},\"cumulative\":{\"branch_enumerations\":2,\"tree_scans\":8,\"derivations\":11}}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json"}}},"isError":false,"timestamp":1784292971048}}
{"type":"message","id":"c311b2ca","parentId":"12119dc2","timestamp":"2026-07-17T12:56:11.048Z","message":{"role":"toolResult","toolCallId":"call_EQMRDAJ7gBwDxlXTyMgeBVxm|fc_0148993141920bab016a5a266af4688195af9b8d9e81f50ec6","toolName":"read","content":[{"type":"text","text":"{\n  \"peers_total\": 6,\n  \"live_peers\": 4,\n  \"last_dial_ok_ms\": 1784292578982,\n  \"last_registry_admit_ms\": 1784292937885,\n  \"failing\": {\n    \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\": \"quic-connect\",\n    \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\": \"quic-connect\"\n  },\n  \"targets\": [\n    \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n    \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n    \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n    \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n    \"f15d837bdeff3d56f5d5a21bdcd6acb9632a764cb13c477cad966ccb811be884\",\n    \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\"\n  ]\n}"}],"details":{"displayContent":{"text":"{\n  \"peers_total\": 6,\n  \"live_peers\": 4,\n  \"last_dial_ok_ms\": 1784292578982,\n  \"last_registry_admit_ms\": 1784292937885,\n  \"failing\": {\n    \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\": \"quic-connect\",\n    \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\": \"quic-connect\"\n  },\n  \"targets\": [\n    \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n    \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n    \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n    \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n    \"f15d837bdeff3d56f5d5a21bdcd6acb9632a764cb13c477cad966ccb811be884\",\n    \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\"\n  ]\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json"}}},"isError":false,"timestamp":1784292971048}}
{"type":"message","id":"b6735c0b","parentId":"c311b2ca","timestamp":"2026-07-17T12:56:11.109Z","message":{"role":"toolResult","toolCallId":"call_ejnRO3nfviYCQSqjlehj8fjw|fc_0148993141920bab016a5a266af47481959ee46ba647aa44cc","toolName":"grep","content":[{"type":"text","text":"*1|=== spt broker stderr — generation 0 — pid 88008 ===\n 2|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 3|DOCS_SERVER_UP: http://localhost:5474\n 4|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n...\n 12|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*13|=== spt brain stderr — generation 0 — pid 63116 ===\n*14|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)\n 15|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*16|BRAIN_PROMOTED: candidate v64 signalled ready (generation 0) — swap accepted\n 17|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415181 mono_ms=817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415200 mono_ms=837 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19|DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n...\n 46|CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415644 mono_ms=1281 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*47|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 48|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292415667 mono_ms=1303 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 49|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292415667 mono_ms=1304 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n*50|PUMP_IPC_READER: spawned\n 51|CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415668 mono_ms=1304 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 52|ENDPOINT_AUTOSTART:mobile-gw adapter=mobile session=7dd4e23f310d61f2 pid=75468 (startup default)\n 53|CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415668 mono_ms=1305 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*54|PUMP_IPC_READER: spawned\n 55|SPAWN_DEDUP:lia: endpoint already has a live session 1 — single-flight wake no-op ack [REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\n 56|CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784292415688 mono_ms=1325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 57|ENDPOINT_AUTOSTART:lia adapter=claude-spt session=628f42b82461d4c3 pid=65420 (startup default)\n...\n 66|CONN_LIFECYCLE: conn=18 role=brain stream-subscriber stream=2 wall_ms=1784292415804 mono_ms=1440 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*67|=== spt broker stderr — generation 0 — pid 80352 ===\n 68|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 69|CONN_LIFECYCLE: conn=21 role=brain wall_ms=1784292415868 mono_ms=1504 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 70|CONN_LIFECYCLE: conn=21 role=brain wall_ms=1784292415868 mono_ms=1504 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 371|CONN_LIFECYCLE: conn=147 role=brain wall_ms=1784292445966 mono_ms=31602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*372|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292447905 mono_ms=0\n*373|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292447905 mono_ms=0\n 374|CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784292449082 mono_ms=34718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 375|CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784292449082 mono_ms=34718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 376|CONN_LIFECYCLE: conn=149 role=brain wall_ms=1784292449083 mono_ms=34720 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 520|CONN_LIFECYCLE: conn=209 role=brain wall_ms=1784292471358 mono_ms=56994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*521|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292472952 mono_ms=25047\n*522|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292472952 mono_ms=25047\n 523|CONN_LIFECYCLE: conn=210 role=brain wall_ms=1784292474465 mono_ms=60101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 524|CONN_LIFECYCLE: conn=210 role=brain wall_ms=1784292474465 mono_ms=60101 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 525|CONN_LIFECYCLE: conn=211 role=brain stream-subscriber stream=51 wall_ms=1784292474465 mono_ms=60102 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 706|CONN_LIFECYCLE: conn=287 role=brain wall_ms=1784292504175 mono_ms=89811 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*707|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292505016 mono_ms=57110\n*708|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292505016 mono_ms=57111\n 709|CONN_LIFECYCLE: conn=288 role=brain wall_ms=1784292506365 mono_ms=92001 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 710|CONN_LIFECYCLE: conn=288 role=brain wall_ms=1784292506365 mono_ms=92002 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 711|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292508106 mono_ms=93742 event=stream-sub-attach stream=85 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 823|CONN_LIFECYCLE: conn=331 role=brain wall_ms=1784292529261 mono_ms=114897 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*824|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292530078 mono_ms=82173\n*825|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292530078 mono_ms=82173\n 826|CONN_LIFECYCLE: conn=332 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 827|CONN_LIFECYCLE: conn=333 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 828|CONN_LIFECYCLE: conn=334 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 997|CONN_LIFECYCLE: conn=404 role=brain wall_ms=1784292560212 mono_ms=145848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*998|BRAIN_UPDATE_RESTART: planned restart — cycling brain onto the swapped binary\n 999|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1000|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1001|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1005|BRAIN_RESTART: planned update respawn (generation 1)\n 1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1007|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1008|=== spt brain stderr — generation 1 — pid 76764 ===\n*1009|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n 1010|CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1011|BRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\n 1012|CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1015|CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1016|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018|PUMP_IPC_READER: spawned\n*1019|PUMP_IPC_READER: spawned\n 1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1423|CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1609|CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614|CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1796|CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801|CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2058|CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2590|CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595|CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":35,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":35}],"truncated":false,"displayContent":"   *1│=== spt broker stderr — generation 0 — pid 88008 ===\n    2│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    3│DOCS_SERVER_UP: http://localhost:5474\n    4│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n     │...\n   12│CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  *13│=== spt brain stderr — generation 0 — pid 63116 ===\n  *14│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)\n   15│CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  *16│BRAIN_PROMOTED: candidate v64 signalled ready (generation 0) — swap accepted\n   17│CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415181 mono_ms=817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   18│CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415200 mono_ms=837 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   19│DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n     │...\n   46│CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415644 mono_ms=1281 event=controller-attach session=3 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *47│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n   48│CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292415667 mono_ms=1303 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   49│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292415667 mono_ms=1304 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n  *50│PUMP_IPC_READER: spawned\n   51│CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415668 mono_ms=1304 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   52│ENDPOINT_AUTOSTART:mobile-gw adapter=mobile session=7dd4e23f310d61f2 pid=75468 (startup default)\n   53│CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoint=mobile-gw by=local wall_ms=1784292415668 mono_ms=1305 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n  *54│PUMP_IPC_READER: spawned\n   55│SPAWN_DEDUP:lia: endpoint already has a live session 1 — single-flight wake no-op ack [REQ-SPAWN-COLLISION-GUARD-LIVE-DUP]\n   56│CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784292415688 mono_ms=1325 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   57│ENDPOINT_AUTOSTART:lia adapter=claude-spt session=628f42b82461d4c3 pid=65420 (startup default)\n     │...\n   66│CONN_LIFECYCLE: conn=18 role=brain stream-subscriber stream=2 wall_ms=1784292415804 mono_ms=1440 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  *67│=== spt broker stderr — generation 0 — pid 80352 ===\n   68│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n   69│CONN_LIFECYCLE: conn=21 role=brain wall_ms=1784292415868 mono_ms=1504 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   70│CONN_LIFECYCLE: conn=21 role=brain wall_ms=1784292415868 mono_ms=1504 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  371│CONN_LIFECYCLE: conn=147 role=brain wall_ms=1784292445966 mono_ms=31602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *372│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292447905 mono_ms=0\n *373│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292447905 mono_ms=0\n  374│CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784292449082 mono_ms=34718 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  375│CONN_LIFECYCLE: conn=148 role=brain wall_ms=1784292449082 mono_ms=34718 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  376│CONN_LIFECYCLE: conn=149 role=brain wall_ms=1784292449083 mono_ms=34720 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  520│CONN_LIFECYCLE: conn=209 role=brain wall_ms=1784292471358 mono_ms=56994 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *521│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292472952 mono_ms=25047\n *522│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292472952 mono_ms=25047\n  523│CONN_LIFECYCLE: conn=210 role=brain wall_ms=1784292474465 mono_ms=60101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  524│CONN_LIFECYCLE: conn=210 role=brain wall_ms=1784292474465 mono_ms=60101 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  525│CONN_LIFECYCLE: conn=211 role=brain stream-subscriber stream=51 wall_ms=1784292474465 mono_ms=60102 event=stream-sub-attach stream=51 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  706│CONN_LIFECYCLE: conn=287 role=brain wall_ms=1784292504175 mono_ms=89811 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *707│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292505016 mono_ms=57110\n *708│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292505016 mono_ms=57111\n  709│CONN_LIFECYCLE: conn=288 role=brain wall_ms=1784292506365 mono_ms=92001 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  710│CONN_LIFECYCLE: conn=288 role=brain wall_ms=1784292506365 mono_ms=92002 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  711│CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292508106 mono_ms=93742 event=stream-sub-attach stream=85 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  823│CONN_LIFECYCLE: conn=331 role=brain wall_ms=1784292529261 mono_ms=114897 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *824│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292530078 mono_ms=82173\n *825│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292530078 mono_ms=82173\n  826│CONN_LIFECYCLE: conn=332 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  827│CONN_LIFECYCLE: conn=333 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  828│CONN_LIFECYCLE: conn=334 role=brain wall_ms=1784292531358 mono_ms=116994 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n  997│CONN_LIFECYCLE: conn=404 role=brain wall_ms=1784292560212 mono_ms=145848 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *998│BRAIN_UPDATE_RESTART: planned restart — cycling brain onto the swapped binary\n  999│CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1000│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1001│CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1004│CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1005│BRAIN_RESTART: planned update respawn (generation 1)\n 1006│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1007│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1008│=== spt brain stderr — generation 1 — pid 76764 ===\n*1009│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n 1010│CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1011│BRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\n 1012│CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1015│CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1016│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 1017│CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018│PUMP_IPC_READER: spawned\n*1019│PUMP_IPC_READER: spawned\n 1020│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1253│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1423│CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428│CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1609│CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614│CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1796│CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2058│CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2590│CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595│CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784292971108}}
{"type":"message","id":"cc4db046","parentId":"b6735c0b","timestamp":"2026-07-17T12:56:11.112Z","message":{"role":"toolResult","toolCallId":"call_2QDnAPeoPLQKJmmDqEuvLmoP|fc_0148993141920bab016a5a266af47c8195825dcf1a5f727625","toolName":"grep","content":[{"type":"text","text":"*1|=== spt broker stderr — generation 0 — pid 72488 ===\n 2|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 3|DOCS_SERVER_UP: http://localhost:5474\n 4|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 5|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n*6|=== spt brain stderr — generation 0 — pid 70372 ===\n*7|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 70372, generation 0, start-reason cold)\n 8|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265242223 mono_ms=103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 9|PAIR_MEET_UP:SPT_DEV step=59475508 id=42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398 addr=EndpointAddr { id: PublicKey(42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398), addrs: {Ip(100.68.35.65:52399), Ip(192.168.1.81:52399)} }\n 10|PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52400), Ip(192.168.1.81:52400)} }\n...\n 15|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242379 mono_ms=260 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*16|BRAIN_PROMOTED: candidate v63 signalled ready (generation 0) — swap accepted\n 17|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242408 mono_ms=289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 18|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242409 mono_ms=289 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 19|DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 8928) — online at bind\n...\n 39|CONN_LIFECYCLE: conn=10 role=brain stream-subscriber stream=2 wall_ms=1784265242667 mono_ms=548 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*40|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 41|CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265242747 mono_ms=628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 42|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265242747 mono_ms=628 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n*43|PUMP_IPC_READER: spawned\n*44|PUMP_IPC_READER: spawned\n 45|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242748 mono_ms=629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 46|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242749 mono_ms=629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 47|CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 62|CONN_LIFECYCLE: conn=1 role=brain controller session=2 endpoint=mobile-gw by=local wall_ms=1784265242860 mono_ms=741 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*63|=== spt broker stderr — generation 0 — pid 50096 ===\n 64|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 65|BROKER_BIND_FAIL: Access is denied. (os error 5)\n 66|DAEMON_EXIT: Access is denied. (os error 5)\n*67|=== spt broker stderr — generation 0 — pid 83344 ===\n 68|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 69|PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52452), Ip(192.168.1.81:52452)} }\n 70|CONN_LIFECYCLE: conn=18 role=brain wall_ms=1784265243660 mono_ms=1540 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 76|DAEMON_EXIT: Access is denied. (os error 5)\n*77|=== spt broker stderr — generation 0 — pid 74936 ===\n 78|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 79|BROKER_BIND_FAIL: Access is denied. (os error 5)\n 80|DAEMON_EXIT: Access is denied. (os error 5)\n*81|=== spt broker stderr — generation 0 — pid 56456 ===\n 82|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 83|BROKER_BIND_FAIL: Access is denied. (os error 5)\n 84|DAEMON_EXIT: Access is denied. (os error 5)\n*85|=== spt broker stderr — generation 0 — pid 77688 ===\n 86|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 87|BROKER_BIND_FAIL: Access is denied. (os error 5)\n 88|DAEMON_EXIT: Access is denied. (os error 5)\n*89|=== spt broker stderr — generation 0 — pid 54296 ===\n 90|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n*91|=== spt broker stderr — generation 0 — pid 89192 ===\n 92|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 93|BROKER_BIND_FAIL: Access is denied. (os error 5)\n 94|DAEMON_EXIT: Access is denied. (os error 5)\n...\n 320|CONN_LIFECYCLE: conn=112 role=brain wall_ms=1784265279062 mono_ms=36943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*321|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281531 mono_ms=0\n*322|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281533 mono_ms=1\n*323|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281543 mono_ms=11\n 324|CONN_LIFECYCLE: conn=113 role=brain wall_ms=1784265283591 mono_ms=41472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 325|CONN_LIFECYCLE: conn=113 role=brain stream-subscriber stream=37 wall_ms=1784265283598 mono_ms=41479 event=stream-sub-attach stream=37 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 326|CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 367|CONN_LIFECYCLE: conn=132 role=brain wall_ms=1784265298173 mono_ms=56054 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*368|BRAIN_UPDATE_RESTART: planned restart — cycling brain onto the swapped binary\n 369|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 370|CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56175 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 371|CONN_LIFECYCLE: conn=50 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 381|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=4 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*382|BRAIN_RESTART: planned update respawn (generation 1)\n 383|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56206 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 384|CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 385|CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=4 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 393|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 viewer session=6 endpoint=webbie vid=1 wall_ms=1784265298326 mono_ms=56207 event=writer-exit role=viewer session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*394|=== spt brain stderr — generation 1 — pid 58272 ===\n*395|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 58272, generation 1, start-reason update)\n 396|CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 viewer session=6 endpoint=webbie vid=1 wall_ms=1784265298340 mono_ms=56221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 397|CONN_LIFECYCLE: conn=133 role=brain wall_ms=1784265298347 mono_ms=56227 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 398|BRAIN_RESUMED: re-established 6 session cursor(s): [1, 3, 4, 5, 2, 6]\n...\n 402|CONN_LIFECYCLE: conn=135 role=brain wall_ms=1784265298412 mono_ms=56293 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*403|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n*404|CONN_LIFECYCLE: conn=136 role=brain wall_ms=1784265298871 mono_ms=56752 event=PUMP_IPC_READER: spawned\n 405|write-start [REQ-CONN-POISON-ATTRIBUTION]\n*406|PUMP_IPC_READER: spawned\n 407|CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265298871 mono_ms=56752 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 408|CONN_LIFECYCLE: conn=139 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 409|CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 567|CONN_LIFECYCLE: conn=201 role=brain wall_ms=1784265323661 mono_ms=81542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*568|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324908 mono_ms=0\n*569|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324909 mono_ms=1\n*570|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324916 mono_ms=8\n 571|CONN_LIFECYCLE: conn=202 role=brain wall_ms=1784265328205 mono_ms=86085 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 572|CONN_LIFECYCLE: conn=202 role=brain wall_ms=1784265328205 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 573|CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=stream-sub-attach stream=68 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 692|CONN_LIFECYCLE: conn=252 role=brain wall_ms=1784265348877 mono_ms=106757 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*693|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349955 mono_ms=25046\n*694|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349956 mono_ms=25047\n*695|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349964 mono_ms=25056\n 696|CONN_LIFECYCLE: conn=253 role=brain wall_ms=1784265353918 mono_ms=111799 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 697|CONN_LIFECYCLE: conn=253 role=brain wall_ms=1784265353918 mono_ms=111799 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 698|CONN_LIFECYCLE: conn=254 role=brain wall_ms=1784265358963 mono_ms=116844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 802|CONN_LIFECYCLE: conn=297 role=brain wall_ms=1784265379146 mono_ms=137027 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*803|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55739\n*804|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55740\n*805|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55740\n 806|CONN_LIFECYCLE: conn=298 role=brain wall_ms=1784265384189 mono_ms=142069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 807|CONN_LIFECYCLE: conn=298 role=brain wall_ms=1784265384189 mono_ms=142070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 808|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 wall_ms=1784265385116 mono_ms=142996 event=stream-sub-attach stream=107 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 892|CONN_LIFECYCLE: conn=332 role=brain wall_ms=1784265404397 mono_ms=162277 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*893|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405729 mono_ms=80820\n*894|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405745 mono_ms=80837\n*895|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405745 mono_ms=80837\n 896|CONN_LIFECYCLE: conn=333 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 897|CONN_LIFECYCLE: conn=334 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 898|CONN_LIFECYCLE: conn=335 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1047|PAIR_MEET_UP:BIGNET step=59475515 id=b1397369280b9564b4eab442fefc01ae93f4857e30a6593a3c80f1e5631649da addr=EndpointAddr { id: PublicKey(b1397369280b9564b4eab442fefc01ae93f4857e30a6593a3c80f1e5631649da), addrs: {Ip(100.68.35.65:59623), Ip(192.168.1.81:59623)} }\n*1048|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126949\n*1049|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126950\n*1050|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126950\n 1051|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265451912 mono_ms=209792 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1052|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265452210 mono_ms=210090 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1053|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265452933 mono_ms=210813 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1438|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784265541266 mono_ms=299146 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1439|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542348 mono_ms=217439\n*1440|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542348 mono_ms=217439\n*1441|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542349 mono_ms=217440\n 1442|CONN_LIFECYCLE: conn=559 role=brain wall_ms=1784265546310 mono_ms=304190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1443|CONN_LIFECYCLE: conn=559 role=brain wall_ms=1784265546310 mono_ms=304190 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1444|CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784265547959 mono_ms=305839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2061|CONN_LIFECYCLE: conn=817 role=brain wall_ms=1784265713404 mono_ms=471283 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2062|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389514\n*2063|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389515\n*2064|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389515\n 2065|CONN_LIFECYCLE: conn=818 role=brain wall_ms=1784265715223 mono_ms=473102 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2066|CONN_LIFECYCLE: conn=818 role=brain wall_ms=1784265715223 mono_ms=473102 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2067|CONN_LIFECYCLE: conn=819 role=brain stream-subscriber stream=337 wall_ms=1784265715223 mono_ms=473103 event=stream-sub-attach stream=337 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3142|DISPATCH:524:Failed(\"failed to fill whole buffer\")\n*3143|DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n 3144|CONN_LIFECYCLE: conn=1257 role=brain stream-subscriber stream=529 wall_ms=1784266007552 mono_ms=765430 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3145|CONN_LIFECYCLE: conn=1259 role=brain wall_ms=1784266007552 mono_ms=765430 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3146|CONN_LIFECYCLE: conn=1259 role=brain wall_ms=1784266007552 mono_ms=765431 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3185|CONN_LIFECYCLE: conn=1276 role=brain wall_ms=1784266014241 mono_ms=772120 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3186|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017547 mono_ms=692637\n*3187|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017548 mono_ms=692638\n*3188|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017557 mono_ms=692647\n 3189|CONN_LIFECYCLE: conn=1277 role=brain wall_ms=1784266018052 mono_ms=775931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3190|CONN_LIFECYCLE: conn=1277 role=brain wall_ms=1784266018052 mono_ms=775931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3191|CONN_LIFECYCLE: conn=1278 role=brain wall_ms=1784266019479 mono_ms=777357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 4321|CONN_LIFECYCLE: conn=1747 role=brain wall_ms=1784266318110 mono_ms=1075988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*4322|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n*4323|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n*4324|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n 4325|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266318910 mono_ms=1076787 event=stream-sub-attach stream=745 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4326|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266319123 mono_ms=1077001 event=stream-sub-attach stream=746 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 4327|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266319383 mono_ms=1077261 event=stream-sub-attach stream=747 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 5402|CONN_LIFECYCLE: conn=2194 role=brain wall_ms=1784266619101 mono_ms=1376978 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*5403|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619675 mono_ms=1294763\n*5404|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619676 mono_ms=1294764\n*5405|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619685 mono_ms=1294773\n 5406|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 5407|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 5408|PAIR_MEET_UP:BIGNET step=59475554 id=7fbaa5c819fc59723589ae552f44cb4c7bb4f5d7aca82bd178a6535efd735678 addr=EndpointAddr { id: PublicKey(7fbaa5c819fc59723589ae552f44cb4c7bb4f5d7aca82bd178a6535efd735678), addrs: {Ip(100.68.35.65:62155), Ip(192.168.1.81:62155)} }\n...\n 6523|PAIR_MEET_UP:SPT_DEV step=59475564 id=6ed8ad2ac085d0392d55dd4388fb557c5fb40c1767a9f4aedf886162c435e34f addr=EndpointAddr { id: PublicKey(6ed8ad2ac085d0392d55dd4388fb557c5fb40c1767a9f4aedf886162c435e34f), addrs: {Ip(100.68.35.65:50095), Ip(192.168.1.81:50095)} }\n*6524|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920736 mono_ms=1595823\n*6525|PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920736 mono_ms=1595823\n*6526|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920745 mono_ms=1595832\n 6527|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266920794 mono_ms=1678670 event=stream-sub-attach stream=1157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 6528|CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6529|CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 6601|DISPATCH:1161:Failed(\"failed to fill whole buffer\")\n*6602|DISPATCH_EV: gen=1784265298871 stream=1161 family=Registry attempt=0 conn=16 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15518 endpoint=-\n 6603|CONN_LIFECYCLE: conn=2686 role=brain wall_ms=1784266941818 mono_ms=1699694 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 6604|CONN_LIFECYCLE: conn=2686 role=brain wall_ms=1784266941818 mono_ms=1699694 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 6605|CONN_LIFECYCLE: conn=2687 role=brain wall_ms=1784266942063 mono_ms=1699939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 7613|DISPATCH:1347:Failed(\"failed to fill whole buffer\")\n*7614|DISPATCH_EV: gen=1784265298871 stream=1347 family=Registry attempt=0 conn=16 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15924 endpoint=-\n 7615|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784267123873 mono_ms=1881748 event=stream-sub-attach stream=1369 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 7616|CONN_LIFECYCLE: conn=3108 role=brain wall_ms=1784267124338 mono_ms=1882213 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 7617|CONN_LIFECYCLE: conn=3108 role=brain wall_ms=1784267124338 mono_ms=1882213 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 8198|CONN_LIFECYCLE: conn=3349 role=brain wall_ms=1784267224976 mono_ms=1982851 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*8199|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267225450 mono_ms=1900536\n*8200|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267225451 mono_ms=1900537\n 8201|CONN_LIFECYCLE: conn=3350 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 8202|CONN_LIFECYCLE: conn=3351 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 8203|CONN_LIFECYCLE: conn=3352 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 9951|CONN_LIFECYCLE: conn=4080 role=brain wall_ms=1784267527368 mono_ms=2285243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*9952|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267527583 mono_ms=2202668\n 9953|CONN_LIFECYCLE: conn=4081 role=brain wall_ms=1784267527757 mono_ms=2285632 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 9954|CONN_LIFECYCLE: conn=4081 role=brain wall_ms=1784267527758 mono_ms=2285632 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 9955|CONN_LIFECYCLE: conn=4082 role=brain wall_ms=1784267527759 mono_ms=2285633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 9961|CONN_LIFECYCLE: conn=4084 role=brain wall_ms=1784267528028 mono_ms=2285903 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*9962|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267528933 mono_ms=2204019\n 9963|CONN_LIFECYCLE: conn=4085 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 9964|CONN_LIFECYCLE: conn=4087 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 9965|CONN_LIFECYCLE: conn=4086 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 11804|CONN_LIFECYCLE: conn=4856 role=brain wall_ms=1784267838606 mono_ms=2596480 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11805|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267839053 mono_ms=2514138\n*11806|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267839054 mono_ms=2514139\n 11807|CONN_LIFECYCLE: conn=4857 role=brain wall_ms=1784267839725 mono_ms=2597598 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11808|CONN_LIFECYCLE: conn=4857 role=brain wall_ms=1784267839725 mono_ms=2597598 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11809|CONN_LIFECYCLE: conn=4858 role=brain wall_ms=1784267839726 mono_ms=2597600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 13526|CONN_LIFECYCLE: conn=5576 role=brain wall_ms=1784268139046 mono_ms=2896919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13527|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268140962 mono_ms=2816046\n*13528|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268140963 mono_ms=2816047\n 13529|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784268141008 mono_ms=2898881 event=stream-sub-attach stream=2540 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13530|CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784268142352 mono_ms=2900225 event=stream-sub-attach stream=2541 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13531|CONN_LIFECYCLE: conn=5577 role=brain wall_ms=1784268142610 mono_ms=2900483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 15309|CONN_LIFECYCLE: conn=6320 role=brain wall_ms=1784268441603 mono_ms=3199476 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15310|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268442366 mono_ms=3117449\n*15311|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268442375 mono_ms=3117458\n 15312|CONN_LIFECYCLE: conn=6321 role=brain wall_ms=1784268444982 mono_ms=3202854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15313|CONN_LIFECYCLE: conn=6321 role=brain wall_ms=1784268444982 mono_ms=3202854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15314|CONN_LIFECYCLE: conn=6322 role=brain stream-subscriber stream=2892 wall_ms=1784268444983 mono_ms=3202855 event=stream-sub-attach stream=2892 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 16164|DISPATCH:3053:Failed(\"failed to fill whole buffer\")\n*16165|DISPATCH_EV: gen=1784265298871 stream=3053 family=Registry attempt=0 conn=26 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15967 endpoint=-\n 16166|CONN_LIFECYCLE: conn=6675 role=brain wall_ms=1784268600973 mono_ms=3358845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16167|CONN_LIFECYCLE: conn=6675 role=brain wall_ms=1784268600973 mono_ms=3358845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16168|CONN_LIFECYCLE: conn=6676 role=brain stream-subscriber stream=3053 wall_ms=1784268600974 mono_ms=3358845 event=stream-sub-attach stream=3053 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 17054|CONN_LIFECYCLE: conn=7048 role=brain wall_ms=1784268745049 mono_ms=3502921 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17055|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268746367 mono_ms=3421449\n*17056|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268746368 mono_ms=3421450\n 17057|CONN_LIFECYCLE: conn=7049 role=brain wall_ms=1784268748790 mono_ms=3506661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17058|CONN_LIFECYCLE: conn=7049 role=brain wall_ms=1784268748790 mono_ms=3506661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17059|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n...\n 18800|CONN_LIFECYCLE: conn=7774 role=brain wall_ms=1784269046779 mono_ms=3804650 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18801|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269047749 mono_ms=3722831\n*18802|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269047762 mono_ms=3722844\n 18803|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 18804|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 18805|PAIR_MEET_UP:BIGNET step=59475635 id=19c2e4bbeb783a1d7b88e588e50d8fabd95b1dbf2a539816572e2b4b00595fb9 addr=EndpointAddr { id: PublicKey(19c2e4bbeb783a1d7b88e588e50d8fabd95b1dbf2a539816572e2b4b00595fb9), addrs: {Ip(100.68.35.65:58562), Ip(192.168.1.81:58562)} }\n...\n 19964|DISPATCH:3810:Failed(\"failed to fill whole buffer\")\n*19965|DISPATCH_EV: gen=1784265298871 stream=3810 family=Registry attempt=0 conn=33 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=16401 endpoint=-\n 19966|CONN_LIFECYCLE: conn=8259 role=brain wall_ms=1784269253942 mono_ms=4011812 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19967|CONN_LIFECYCLE: conn=8259 role=brain wall_ms=1784269253942 mono_ms=4011812 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19968|CONN_LIFECYCLE: conn=8260 role=brain stream-subscriber stream=3827 wall_ms=1784269253943 mono_ms=4011813 event=stream-sub-attach stream=3827 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 20572|CONN_LIFECYCLE: conn=8512 role=brain wall_ms=1784269354110 mono_ms=4111980 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20573|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269354920 mono_ms=4030001\n*20574|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269354922 mono_ms=4030002\n 20575|CONN_LIFECYCLE: conn=8513 role=brain wall_ms=1784269357786 mono_ms=4115655 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20576|CONN_LIFECYCLE: conn=8513 role=brain wall_ms=1784269357786 mono_ms=4115655 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20577|CONN_LIFECYCLE: conn=8514 role=brain wall_ms=1784269357787 mono_ms=4115656 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 22480|PAIR_MEET_UP:SPT_DEV step=59475656 id=ebe483413255230c1cc17e6b6340ddf82922741867da82a35c95abdebc6f4edc addr=EndpointAddr { id: PublicKey(ebe483413255230c1cc17e6b6340ddf82922741867da82a35c95abdebc6f4edc), addrs: {Ip(100.68.35.65:63595), Ip(192.168.1.81:63595)} }\n*22481|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269681872 mono_ms=4356952\n*22482|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269681890 mono_ms=4356970\n 22483|CONN_LIFECYCLE: conn=9309 role=brain wall_ms=1784269682118 mono_ms=4439987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22484|CONN_LIFECYCLE: conn=9309 role=brain wall_ms=1784269682119 mono_ms=4439987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22485|CONN_LIFECYCLE: conn=9310 role=brain wall_ms=1784269684546 mono_ms=4442415 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 24270|CONN_LIFECYCLE: conn=10055 role=brain wall_ms=1784269980970 mono_ms=4738838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*24271|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269983073 mono_ms=4658152\n*24272|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269983073 mono_ms=4658152\n 24273|CONN_LIFECYCLE: conn=10056 role=brain wall_ms=1784269984693 mono_ms=4742561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 24274|CONN_LIFECYCLE: conn=10056 role=brain wall_ms=1784269984693 mono_ms=4742561 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 24275|CONN_LIFECYCLE: conn=10057 role=brain wall_ms=1784269984701 mono_ms=4742569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 26048|CONN_LIFECYCLE: conn=10799 role=brain wall_ms=1784270285958 mono_ms=5043825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*26049|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784270286780 mono_ms=4961859\n*26050|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784270286781 mono_ms=4961860\n 26051|CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 26052|CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 26053|CONN_LIFECYCLE: conn=10801 role=brain wall_ms=1784270291678 mono_ms=5049546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n\nSearched only the first 4MB of large files (matches past the 4MB window are not shown; use `read` for the rest): ..\\..\\..\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log.1"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":84,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","count":84}],"truncated":false,"displayContent":"    *1│=== spt broker stderr — generation 0 — pid 72488 ===\n     2│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n     3│DOCS_SERVER_UP: http://localhost:5474\n     4│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n     5│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    *6│=== spt brain stderr — generation 0 — pid 70372 ===\n    *7│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 70372, generation 0, start-reason cold)\n     8│CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265242223 mono_ms=103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     9│PAIR_MEET_UP:SPT_DEV step=59475508 id=42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398 addr=EndpointAddr { id: PublicKey(42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398), addrs: {Ip(100.68.35.65:52399), Ip(192.168.1.81:52399)} }\n    10│PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52400), Ip(192.168.1.81:52400)} }\n      │...\n    15│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242379 mono_ms=260 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   *16│BRAIN_PROMOTED: candidate v63 signalled ready (generation 0) — swap accepted\n    17│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242408 mono_ms=289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    18│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242409 mono_ms=289 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n    19│DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 8928) — online at bind\n      │...\n    39│CONN_LIFECYCLE: conn=10 role=brain stream-subscriber stream=2 wall_ms=1784265242667 mono_ms=548 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   *40│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n    41│CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265242747 mono_ms=628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    42│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265242747 mono_ms=628 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n   *43│PUMP_IPC_READER: spawned\n   *44│PUMP_IPC_READER: spawned\n    45│CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242748 mono_ms=629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n    46│CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242749 mono_ms=629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n    47│CONN_LIFECYCLE: conn=15 role=brain wall_ms=1784265242749 mono_ms=630 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n    62│CONN_LIFECYCLE: conn=1 role=brain controller session=2 endpoint=mobile-gw by=local wall_ms=1784265242860 mono_ms=741 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   *63│=== spt broker stderr — generation 0 — pid 50096 ===\n    64│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    65│BROKER_BIND_FAIL: Access is denied. (os error 5)\n    66│DAEMON_EXIT: Access is denied. (os error 5)\n   *67│=== spt broker stderr — generation 0 — pid 83344 ===\n    68│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    69│PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52452), Ip(192.168.1.81:52452)} }\n    70│CONN_LIFECYCLE: conn=18 role=brain wall_ms=1784265243660 mono_ms=1540 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n    76│DAEMON_EXIT: Access is denied. (os error 5)\n   *77│=== spt broker stderr — generation 0 — pid 74936 ===\n    78│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    79│BROKER_BIND_FAIL: Access is denied. (os error 5)\n    80│DAEMON_EXIT: Access is denied. (os error 5)\n   *81│=== spt broker stderr — generation 0 — pid 56456 ===\n    82│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    83│BROKER_BIND_FAIL: Access is denied. (os error 5)\n    84│DAEMON_EXIT: Access is denied. (os error 5)\n   *85│=== spt broker stderr — generation 0 — pid 77688 ===\n    86│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    87│BROKER_BIND_FAIL: Access is denied. (os error 5)\n    88│DAEMON_EXIT: Access is denied. (os error 5)\n   *89│=== spt broker stderr — generation 0 — pid 54296 ===\n    90│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n   *91│=== spt broker stderr — generation 0 — pid 89192 ===\n    92│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n    93│BROKER_BIND_FAIL: Access is denied. (os error 5)\n    94│DAEMON_EXIT: Access is denied. (os error 5)\n      │...\n   320│CONN_LIFECYCLE: conn=112 role=brain wall_ms=1784265279062 mono_ms=36943 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *321│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281531 mono_ms=0\n  *322│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281533 mono_ms=1\n  *323│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265281543 mono_ms=11\n   324│CONN_LIFECYCLE: conn=113 role=brain wall_ms=1784265283591 mono_ms=41472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   325│CONN_LIFECYCLE: conn=113 role=brain stream-subscriber stream=37 wall_ms=1784265283598 mono_ms=41479 event=stream-sub-attach stream=37 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n   326│CONN_LIFECYCLE: conn=114 role=brain wall_ms=1784265283621 mono_ms=41502 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   367│CONN_LIFECYCLE: conn=132 role=brain wall_ms=1784265298173 mono_ms=56054 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *368│BRAIN_UPDATE_RESTART: planned restart — cycling brain onto the swapped binary\n   369│CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   370│CONN_LIFECYCLE: conn=47 role=brain stream-subscriber stream=7 controller session=3 endpoint=deployah by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56175 event=writer-exit role=controller session=3 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n   371│CONN_LIFECYCLE: conn=50 role=brain wall_ms=1784265298295 mono_ms=56175 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   381│CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298295 mono_ms=56176 event=writer-exit role=controller session=4 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n  *382│BRAIN_RESTART: planned update respawn (generation 1)\n   383│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56206 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n   384│CONN_LIFECYCLE: conn=15 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56206 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   385│CONN_LIFECYCLE: conn=48 role=brain stream-subscriber stream=3 controller session=4 endpoint=doyle by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784265298326 mono_ms=56207 event=session-detach session=4 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   393│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 viewer session=6 endpoint=webbie vid=1 wall_ms=1784265298326 mono_ms=56207 event=writer-exit role=viewer session=6 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n  *394│=== spt brain stderr — generation 1 — pid 58272 ===\n  *395│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 58272, generation 1, start-reason update)\n   396│CONN_LIFECYCLE: conn=115 role=brain stream-subscriber stream=36 viewer session=6 endpoint=webbie vid=0 viewer session=6 endpoint=webbie vid=1 wall_ms=1784265298340 mono_ms=56221 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   397│CONN_LIFECYCLE: conn=133 role=brain wall_ms=1784265298347 mono_ms=56227 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   398│BRAIN_RESUMED: re-established 6 session cursor(s): [1, 3, 4, 5, 2, 6]\n      │...\n   402│CONN_LIFECYCLE: conn=135 role=brain wall_ms=1784265298412 mono_ms=56293 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *403│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n  *404│CONN_LIFECYCLE: conn=136 role=brain wall_ms=1784265298871 mono_ms=56752 event=PUMP_IPC_READER: spawned\n   405│write-start [REQ-CONN-POISON-ATTRIBUTION]\n  *406│PUMP_IPC_READER: spawned\n   407│CONN_LIFECYCLE: conn=138 role=brain presence-subscriber wall_ms=1784265298871 mono_ms=56752 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n   408│CONN_LIFECYCLE: conn=139 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   409│CONN_LIFECYCLE: conn=140 role=brain wall_ms=1784265298871 mono_ms=56752 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   567│CONN_LIFECYCLE: conn=201 role=brain wall_ms=1784265323661 mono_ms=81542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *568│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324908 mono_ms=0\n  *569│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324909 mono_ms=1\n  *570│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265324916 mono_ms=8\n   571│CONN_LIFECYCLE: conn=202 role=brain wall_ms=1784265328205 mono_ms=86085 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   572│CONN_LIFECYCLE: conn=202 role=brain wall_ms=1784265328205 mono_ms=86086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   573│CONN_LIFECYCLE: conn=203 role=brain stream-subscriber stream=68 wall_ms=1784265328205 mono_ms=86086 event=stream-sub-attach stream=68 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   692│CONN_LIFECYCLE: conn=252 role=brain wall_ms=1784265348877 mono_ms=106757 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *693│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349955 mono_ms=25046\n  *694│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349956 mono_ms=25047\n  *695│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265349964 mono_ms=25056\n   696│CONN_LIFECYCLE: conn=253 role=brain wall_ms=1784265353918 mono_ms=111799 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   697│CONN_LIFECYCLE: conn=253 role=brain wall_ms=1784265353918 mono_ms=111799 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   698│CONN_LIFECYCLE: conn=254 role=brain wall_ms=1784265358963 mono_ms=116844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   802│CONN_LIFECYCLE: conn=297 role=brain wall_ms=1784265379146 mono_ms=137027 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *803│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55739\n  *804│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55740\n  *805│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265380648 mono_ms=55740\n   806│CONN_LIFECYCLE: conn=298 role=brain wall_ms=1784265384189 mono_ms=142069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   807│CONN_LIFECYCLE: conn=298 role=brain wall_ms=1784265384189 mono_ms=142070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n   808│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 wall_ms=1784265385116 mono_ms=142996 event=stream-sub-attach stream=107 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n   892│CONN_LIFECYCLE: conn=332 role=brain wall_ms=1784265404397 mono_ms=162277 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  *893│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405729 mono_ms=80820\n  *894│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405745 mono_ms=80837\n  *895│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265405745 mono_ms=80837\n   896│CONN_LIFECYCLE: conn=333 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   897│CONN_LIFECYCLE: conn=334 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n   898│CONN_LIFECYCLE: conn=335 role=brain wall_ms=1784265408795 mono_ms=166675 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1047│PAIR_MEET_UP:BIGNET step=59475515 id=b1397369280b9564b4eab442fefc01ae93f4857e30a6593a3c80f1e5631649da addr=EndpointAddr { id: PublicKey(b1397369280b9564b4eab442fefc01ae93f4857e30a6593a3c80f1e5631649da), addrs: {Ip(100.68.35.65:59623), Ip(192.168.1.81:59623)} }\n *1048│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126949\n *1049│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126950\n *1050│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265451858 mono_ms=126950\n  1051│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265451912 mono_ms=209792 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1052│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265452210 mono_ms=210090 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  1053│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784265452933 mono_ms=210813 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  1438│CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784265541266 mono_ms=299146 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *1439│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542348 mono_ms=217439\n *1440│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542348 mono_ms=217439\n *1441│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265542349 mono_ms=217440\n  1442│CONN_LIFECYCLE: conn=559 role=brain wall_ms=1784265546310 mono_ms=304190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  1443│CONN_LIFECYCLE: conn=559 role=brain wall_ms=1784265546310 mono_ms=304190 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  1444│CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784265547959 mono_ms=305839 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  2061│CONN_LIFECYCLE: conn=817 role=brain wall_ms=1784265713404 mono_ms=471283 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *2062│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389514\n *2063│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389515\n *2064│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784265714424 mono_ms=389515\n  2065│CONN_LIFECYCLE: conn=818 role=brain wall_ms=1784265715223 mono_ms=473102 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  2066│CONN_LIFECYCLE: conn=818 role=brain wall_ms=1784265715223 mono_ms=473102 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  2067│CONN_LIFECYCLE: conn=819 role=brain stream-subscriber stream=337 wall_ms=1784265715223 mono_ms=473103 event=stream-sub-attach stream=337 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3142│DISPATCH:524:Failed(\"failed to fill whole buffer\")\n *3143│DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n  3144│CONN_LIFECYCLE: conn=1257 role=brain stream-subscriber stream=529 wall_ms=1784266007552 mono_ms=765430 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3145│CONN_LIFECYCLE: conn=1259 role=brain wall_ms=1784266007552 mono_ms=765430 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3146│CONN_LIFECYCLE: conn=1259 role=brain wall_ms=1784266007552 mono_ms=765431 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  3185│CONN_LIFECYCLE: conn=1276 role=brain wall_ms=1784266014241 mono_ms=772120 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *3186│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017547 mono_ms=692637\n *3187│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017548 mono_ms=692638\n *3188│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266017557 mono_ms=692647\n  3189│CONN_LIFECYCLE: conn=1277 role=brain wall_ms=1784266018052 mono_ms=775931 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  3190│CONN_LIFECYCLE: conn=1277 role=brain wall_ms=1784266018052 mono_ms=775931 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  3191│CONN_LIFECYCLE: conn=1278 role=brain wall_ms=1784266019479 mono_ms=777357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  4321│CONN_LIFECYCLE: conn=1747 role=brain wall_ms=1784266318110 mono_ms=1075988 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *4322│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n *4323│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n *4324│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266318866 mono_ms=993955\n  4325│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266318910 mono_ms=1076787 event=stream-sub-attach stream=745 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4326│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266319123 mono_ms=1077001 event=stream-sub-attach stream=746 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  4327│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266319383 mono_ms=1077261 event=stream-sub-attach stream=747 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  5402│CONN_LIFECYCLE: conn=2194 role=brain wall_ms=1784266619101 mono_ms=1376978 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *5403│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619675 mono_ms=1294763\n *5404│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619676 mono_ms=1294764\n *5405│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266619685 mono_ms=1294773\n  5406│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  5407│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n  5408│PAIR_MEET_UP:BIGNET step=59475554 id=7fbaa5c819fc59723589ae552f44cb4c7bb4f5d7aca82bd178a6535efd735678 addr=EndpointAddr { id: PublicKey(7fbaa5c819fc59723589ae552f44cb4c7bb4f5d7aca82bd178a6535efd735678), addrs: {Ip(100.68.35.65:62155), Ip(192.168.1.81:62155)} }\n      │...\n  6523│PAIR_MEET_UP:SPT_DEV step=59475564 id=6ed8ad2ac085d0392d55dd4388fb557c5fb40c1767a9f4aedf886162c435e34f addr=EndpointAddr { id: PublicKey(6ed8ad2ac085d0392d55dd4388fb557c5fb40c1767a9f4aedf886162c435e34f), addrs: {Ip(100.68.35.65:50095), Ip(192.168.1.81:50095)} }\n *6524│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920736 mono_ms=1595823\n *6525│PUMP_PEER_FAIL:ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657:stage=seed-proof-recv: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920736 mono_ms=1595823\n *6526│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784266920745 mono_ms=1595832\n  6527│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784266920794 mono_ms=1678670 event=stream-sub-attach stream=1157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  6528│CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6529│CONN_LIFECYCLE: conn=2656 role=brain wall_ms=1784266920885 mono_ms=1678761 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  6601│DISPATCH:1161:Failed(\"failed to fill whole buffer\")\n *6602│DISPATCH_EV: gen=1784265298871 stream=1161 family=Registry attempt=0 conn=16 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15518 endpoint=-\n  6603│CONN_LIFECYCLE: conn=2686 role=brain wall_ms=1784266941818 mono_ms=1699694 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  6604│CONN_LIFECYCLE: conn=2686 role=brain wall_ms=1784266941818 mono_ms=1699694 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  6605│CONN_LIFECYCLE: conn=2687 role=brain wall_ms=1784266942063 mono_ms=1699939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  7613│DISPATCH:1347:Failed(\"failed to fill whole buffer\")\n *7614│DISPATCH_EV: gen=1784265298871 stream=1347 family=Registry attempt=0 conn=16 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15924 endpoint=-\n  7615│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784267123873 mono_ms=1881748 event=stream-sub-attach stream=1369 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n  7616│CONN_LIFECYCLE: conn=3108 role=brain wall_ms=1784267124338 mono_ms=1882213 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  7617│CONN_LIFECYCLE: conn=3108 role=brain wall_ms=1784267124338 mono_ms=1882213 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  8198│CONN_LIFECYCLE: conn=3349 role=brain wall_ms=1784267224976 mono_ms=1982851 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *8199│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267225450 mono_ms=1900536\n *8200│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267225451 mono_ms=1900537\n  8201│CONN_LIFECYCLE: conn=3350 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8202│CONN_LIFECYCLE: conn=3351 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  8203│CONN_LIFECYCLE: conn=3352 role=brain wall_ms=1784267227357 mono_ms=1985233 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9951│CONN_LIFECYCLE: conn=4080 role=brain wall_ms=1784267527368 mono_ms=2285243 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9952│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267527583 mono_ms=2202668\n  9953│CONN_LIFECYCLE: conn=4081 role=brain wall_ms=1784267527757 mono_ms=2285632 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9954│CONN_LIFECYCLE: conn=4081 role=brain wall_ms=1784267527758 mono_ms=2285632 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n  9955│CONN_LIFECYCLE: conn=4082 role=brain wall_ms=1784267527759 mono_ms=2285633 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n  9961│CONN_LIFECYCLE: conn=4084 role=brain wall_ms=1784267528028 mono_ms=2285903 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n *9962│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267528933 mono_ms=2204019\n  9963│CONN_LIFECYCLE: conn=4085 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9964│CONN_LIFECYCLE: conn=4087 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9965│CONN_LIFECYCLE: conn=4086 role=brain wall_ms=1784267530302 mono_ms=2288177 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 11804│CONN_LIFECYCLE: conn=4856 role=brain wall_ms=1784267838606 mono_ms=2596480 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*11805│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267839053 mono_ms=2514138\n*11806│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784267839054 mono_ms=2514139\n 11807│CONN_LIFECYCLE: conn=4857 role=brain wall_ms=1784267839725 mono_ms=2597598 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 11808│CONN_LIFECYCLE: conn=4857 role=brain wall_ms=1784267839725 mono_ms=2597598 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 11809│CONN_LIFECYCLE: conn=4858 role=brain wall_ms=1784267839726 mono_ms=2597600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 13526│CONN_LIFECYCLE: conn=5576 role=brain wall_ms=1784268139046 mono_ms=2896919 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*13527│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268140962 mono_ms=2816046\n*13528│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268140963 mono_ms=2816047\n 13529│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784268141008 mono_ms=2898881 event=stream-sub-attach stream=2540 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13530│CONN_LIFECYCLE: conn=137 role=brain stream-subscriber stream=50 stream-subscriber stream=53 stream-subscriber stream=56 stream-subscriber stream=57 stream-subscriber stream=60 stream-subscriber stream=61 stream-subscriber stream=107 stream-subscriber stream=108… wall_ms=1784268142352 mono_ms=2900225 event=stream-sub-attach stream=2541 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 13531│CONN_LIFECYCLE: conn=5577 role=brain wall_ms=1784268142610 mono_ms=2900483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 15309│CONN_LIFECYCLE: conn=6320 role=brain wall_ms=1784268441603 mono_ms=3199476 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*15310│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268442366 mono_ms=3117449\n*15311│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268442375 mono_ms=3117458\n 15312│CONN_LIFECYCLE: conn=6321 role=brain wall_ms=1784268444982 mono_ms=3202854 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 15313│CONN_LIFECYCLE: conn=6321 role=brain wall_ms=1784268444982 mono_ms=3202854 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 15314│CONN_LIFECYCLE: conn=6322 role=brain stream-subscriber stream=2892 wall_ms=1784268444983 mono_ms=3202855 event=stream-sub-attach stream=2892 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 16164│DISPATCH:3053:Failed(\"failed to fill whole buffer\")\n*16165│DISPATCH_EV: gen=1784265298871 stream=3053 family=Registry attempt=0 conn=26 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15967 endpoint=-\n 16166│CONN_LIFECYCLE: conn=6675 role=brain wall_ms=1784268600973 mono_ms=3358845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16167│CONN_LIFECYCLE: conn=6675 role=brain wall_ms=1784268600973 mono_ms=3358845 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 16168│CONN_LIFECYCLE: conn=6676 role=brain stream-subscriber stream=3053 wall_ms=1784268600974 mono_ms=3358845 event=stream-sub-attach stream=3053 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 17054│CONN_LIFECYCLE: conn=7048 role=brain wall_ms=1784268745049 mono_ms=3502921 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*17055│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268746367 mono_ms=3421449\n*17056│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784268746368 mono_ms=3421450\n 17057│CONN_LIFECYCLE: conn=7049 role=brain wall_ms=1784268748790 mono_ms=3506661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 17058│CONN_LIFECYCLE: conn=7049 role=brain wall_ms=1784268748790 mono_ms=3506661 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 17059│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n      │...\n 18800│CONN_LIFECYCLE: conn=7774 role=brain wall_ms=1784269046779 mono_ms=3804650 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*18801│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269047749 mono_ms=3722831\n*18802│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269047762 mono_ms=3722844\n 18803│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 18804│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 18805│PAIR_MEET_UP:BIGNET step=59475635 id=19c2e4bbeb783a1d7b88e588e50d8fabd95b1dbf2a539816572e2b4b00595fb9 addr=EndpointAddr { id: PublicKey(19c2e4bbeb783a1d7b88e588e50d8fabd95b1dbf2a539816572e2b4b00595fb9), addrs: {Ip(100.68.35.65:58562), Ip(192.168.1.81:58562)} }\n      │...\n 19964│DISPATCH:3810:Failed(\"failed to fill whole buffer\")\n*19965│DISPATCH_EV: gen=1784265298871 stream=3810 family=Registry attempt=0 conn=33 event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=16401 endpoint=-\n 19966│CONN_LIFECYCLE: conn=8259 role=brain wall_ms=1784269253942 mono_ms=4011812 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 19967│CONN_LIFECYCLE: conn=8259 role=brain wall_ms=1784269253942 mono_ms=4011812 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19968│CONN_LIFECYCLE: conn=8260 role=brain stream-subscriber stream=3827 wall_ms=1784269253943 mono_ms=4011813 event=stream-sub-attach stream=3827 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 20572│CONN_LIFECYCLE: conn=8512 role=brain wall_ms=1784269354110 mono_ms=4111980 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*20573│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269354920 mono_ms=4030001\n*20574│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269354922 mono_ms=4030002\n 20575│CONN_LIFECYCLE: conn=8513 role=brain wall_ms=1784269357786 mono_ms=4115655 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 20576│CONN_LIFECYCLE: conn=8513 role=brain wall_ms=1784269357786 mono_ms=4115655 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 20577│CONN_LIFECYCLE: conn=8514 role=brain wall_ms=1784269357787 mono_ms=4115656 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 22480│PAIR_MEET_UP:SPT_DEV step=59475656 id=ebe483413255230c1cc17e6b6340ddf82922741867da82a35c95abdebc6f4edc addr=EndpointAddr { id: PublicKey(ebe483413255230c1cc17e6b6340ddf82922741867da82a35c95abdebc6f4edc), addrs: {Ip(100.68.35.65:63595), Ip(192.168.1.81:63595)} }\n*22481│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269681872 mono_ms=4356952\n*22482│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269681890 mono_ms=4356970\n 22483│CONN_LIFECYCLE: conn=9309 role=brain wall_ms=1784269682118 mono_ms=4439987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 22484│CONN_LIFECYCLE: conn=9309 role=brain wall_ms=1784269682119 mono_ms=4439987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22485│CONN_LIFECYCLE: conn=9310 role=brain wall_ms=1784269684546 mono_ms=4442415 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 24270│CONN_LIFECYCLE: conn=10055 role=brain wall_ms=1784269980970 mono_ms=4738838 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*24271│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269983073 mono_ms=4658152\n*24272│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784269983073 mono_ms=4658152\n 24273│CONN_LIFECYCLE: conn=10056 role=brain wall_ms=1784269984693 mono_ms=4742561 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 24274│CONN_LIFECYCLE: conn=10056 role=brain wall_ms=1784269984693 mono_ms=4742561 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 24275│CONN_LIFECYCLE: conn=10057 role=brain wall_ms=1784269984701 mono_ms=4742569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n      │...\n 26048│CONN_LIFECYCLE: conn=10799 role=brain wall_ms=1784270285958 mono_ms=5043825 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*26049│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784270286780 mono_ms=4961859\n*26050│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784270286781 mono_ms=4961860\n 26051│CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 26052│CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 26053│CONN_LIFECYCLE: conn=10801 role=brain wall_ms=1784270291678 mono_ms=5049546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784292971112}}
{"type":"message","id":"f5d48cc8","parentId":"cc4db046","timestamp":"2026-07-17T12:56:11.167Z","message":{"role":"toolResult","toolCallId":"call_LSOrdo13FBYjGGOEmtZVILmY|fc_0148993141920bab016a5a266af48081959c7be5bd0a8b4a1a","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/logs/\n## daemon.stderr.log\n 7|PAIR_MEET_UP:BIGNET step=59476413 id=0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542 addr=EndpointAddr { id: PublicKey(0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542), addrs: {Ip(100.68.35.65:50302), Ip(192.168.1.81:50302)} }\n*8|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784292414784 mono_ms=420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*9|CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*10|CONN_LIFECYCLE: conn=4 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*11|CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*12|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13|=== spt brain stderr — generation 0 — pid 63116 ===\n 14|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)\n*15|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16|BRAIN_PROMOTED: candidate v64 signalled ready (generation 0) — swap accepted\n*17|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415181 mono_ms=817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*18|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415200 mono_ms=837 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19|DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n 20|DAEMON_RESTART_RESUME_REFUSED:doyle: custody pid still alive — refusing to re-run over a live process (dup guard)\n*21|CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415272 mono_ms=909 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22|CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*23|CONN_WRITE_RETIRED: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 — organic write failure (BrokenPipe: The pipe is being closed. (os error 232)); physical broker conn poisoned + retired, never reused (same retire behavior as POISONED — only the failure class differs) [REQ-CONN-POISON-DIAL-SCOPE]\n*24|CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 event=writer-exit role=controller session=1 reason=write-failed kind=BrokenPipe [REQ-CONN-POISON-ATTRIBUTION]\n 25|DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 65420) — online at bind\n*26|CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415333 mono_ms=970 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*27|CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415333 mono_ms=970 event=transport-close poisoned=true timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 28|DAEMON_RESTART_RESUME_REFUSED:webbie: custody pid still alive — refusing to re-run over a live process (dup guard)\n*29|CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784292415348 mono_ms=985 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*30|CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784292415349 mono_ms=985 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 31|CONTROL_REAP_NO_SESSION:deployah: cleared stale controlled/driven_by/viewer_count (no broker session)\n 32|LIVENESS_RECONCILE_DEFER:deployah: no broker session but a resume is in flight\n 33|CONTROL_REAP_NO_SESSION:doyle: cleared stale controlled/driven_by/viewer_count (no broker session)\n...\n 39|LIVENESS_RECONCILE_DEFER:webbie: no broker session but a resume is in flight\n*40|CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415585 mono_ms=1221 event=controller-attach session=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*41|CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415599 mono_ms=1236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*42|CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415604 mono_ms=1240 event=writer-exit role=controller session=2 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 43|WAKE_RESUME:perri: resuming session anchor-int-proof under claude-spt:ccs (pid 76392) — online at bind\n*44|CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415630 mono_ms=1267 event=session-detach session=2 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n## daemon.stderr.log.1\n 7|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 70372, generation 0, start-reason cold)\n*8|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265242223 mono_ms=103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 9|PAIR_MEET_UP:SPT_DEV step=59475508 id=42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398 addr=EndpointAddr { id: PublicKey(42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398), addrs: {Ip(100.68.35.65:52399), Ip(192.168.1.81:52399)} }\n 10|PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52400), Ip(192.168.1.81:52400)} }\n*11|CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784265242254 mono_ms=135 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*12|CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784265242254 mono_ms=135 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 13|DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n 14|DAEMON_RESTART_RESUME_REFUSED:doyle: custody pid still alive — refusing to re-run over a live process (dup guard)\n*15|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242379 mono_ms=260 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16|BRAIN_PROMOTED: candidate v63 signalled ready (generation 0) — swap accepted\n*17|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242408 mono_ms=289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*18|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242409 mono_ms=289 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 19|DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 8928) — online at bind\n*20|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242442 mono_ms=323 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242442 mono_ms=323 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22|DAEMON_RESTART_RESUME_REFUSED:webbie: custody pid still alive — refusing to re-run over a live process (dup guard)\n*23|CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784265242455 mono_ms=336 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*24|CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784265242455 mono_ms=336 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 25|CONTROL_REAP_NO_SESSION:deployah: cleared stale controlled/driven_by (no broker session)\n 26|DRIVEN_BY_SELFHEAL_OFFLINE:deployah: cleared stale driven_by (no session)\n 27|LIVENESS_RECONCILE_OFFLINE:deployah: no live broker session (dead harness)\n...\n 33|LIVENESS_RECONCILE_OFFLINE:webbie: no live broker session (dead harness)\n*34|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784265242654 mono_ms=534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*35|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784265242654 mono_ms=534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*36|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*37|CONN_LIFECYCLE: conn=9 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*38|CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*39|CONN_LIFECYCLE: conn=10 role=brain stream-subscriber stream=2 wall_ms=1784265242667 mono_ms=548 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 40|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n*41|CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265242747 mono_ms=628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*42|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265242747 mono_ms=628 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 43|PUMP_IPC_READER: spawned\n 44|PUMP_IPC_READER: spawned\n*45|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242748 mono_ms=629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*46|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242749 mono_ms=629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\nSearched only the first 4MB of large files (matches past the 4MB window are not shown; use `read` for the rest): ..\\..\\..\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log.1"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log, C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","searchPath":"C:\\Users\\decid\\AppData\\Local\\spt-core\\logs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":40,"fileCount":2,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1","count":20}],"truncated":true,"perFileLimitReached":20,"displayContent":"# C:/Users/decid/AppData/Local/spt-core/logs/\n## daemon.stderr.log\n  7│PAIR_MEET_UP:BIGNET step=59476413 id=0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542 addr=EndpointAddr { id: PublicKey(0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542), addrs: {Ip(100.68.35.65:50302), Ip(192.168.1.81:50302)} }\n *8│CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784292414784 mono_ms=420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n *9│CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*10│CONN_LIFECYCLE: conn=4 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*11│CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*12│CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 13│=== spt brain stderr — generation 0 — pid 63116 ===\n 14│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)\n*15│CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 16│BRAIN_PROMOTED: candidate v64 signalled ready (generation 0) — swap accepted\n*17│CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415181 mono_ms=817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*18│CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415200 mono_ms=837 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 19│DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n 20│DAEMON_RESTART_RESUME_REFUSED:doyle: custody pid still alive — refusing to re-run over a live process (dup guard)\n*21│CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415272 mono_ms=909 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*22│CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*23│CONN_WRITE_RETIRED: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 — organic write failure (BrokenPipe: The pipe is being closed. (os error 232)); physical broker conn poisoned + retired, never reused (same retire behavior as POISONED — only the failure class differs) [REQ-CONN-POISON-DIAL-SCOPE]\n*24│CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415307 mono_ms=944 event=writer-exit role=controller session=1 reason=write-failed kind=BrokenPipe [REQ-CONN-POISON-ATTRIBUTION]\n 25│DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 65420) — online at bind\n*26│CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415333 mono_ms=970 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*27│CONN_LIFECYCLE: conn=9 role=brain controller session=1 endpoint=lia by=local wall_ms=1784292415333 mono_ms=970 event=transport-close poisoned=true timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 28│DAEMON_RESTART_RESUME_REFUSED:webbie: custody pid still alive — refusing to re-run over a live process (dup guard)\n*29│CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784292415348 mono_ms=985 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*30│CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784292415349 mono_ms=985 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 31│CONTROL_REAP_NO_SESSION:deployah: cleared stale controlled/driven_by/viewer_count (no broker session)\n 32│LIVENESS_RECONCILE_DEFER:deployah: no broker session but a resume is in flight\n 33│CONTROL_REAP_NO_SESSION:doyle: cleared stale controlled/driven_by/viewer_count (no broker session)\n   │...\n 39│LIVENESS_RECONCILE_DEFER:webbie: no broker session but a resume is in flight\n*40│CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415585 mono_ms=1221 event=controller-attach session=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*41│CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415599 mono_ms=1236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*42│CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415604 mono_ms=1240 event=writer-exit role=controller session=2 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 43│WAKE_RESUME:perri: resuming session anchor-int-proof under claude-spt:ccs (pid 76392) — online at bind\n*44│CONN_LIFECYCLE: conn=11 role=brain controller session=2 endpoint=perri by=local wall_ms=1784292415630 mono_ms=1267 event=session-detach session=2 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n## daemon.stderr.log.1\n  7│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 70372, generation 0, start-reason cold)\n *8│CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265242223 mono_ms=103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n  9│PAIR_MEET_UP:SPT_DEV step=59475508 id=42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398 addr=EndpointAddr { id: PublicKey(42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398), addrs: {Ip(100.68.35.65:52399), Ip(192.168.1.81:52399)} }\n 10│PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52400), Ip(192.168.1.81:52400)} }\n*11│CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784265242254 mono_ms=135 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*12│CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784265242254 mono_ms=135 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 13│DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive — refusing to re-run over a live process (dup guard)\n 14│DAEMON_RESTART_RESUME_REFUSED:doyle: custody pid still alive — refusing to re-run over a live process (dup guard)\n*15│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242379 mono_ms=260 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 16│BRAIN_PROMOTED: candidate v63 signalled ready (generation 0) — swap accepted\n*17│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242408 mono_ms=289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*18│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242409 mono_ms=289 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 19│DAEMON_RESTART_RESUME:lia: resuming session 5106270b-52d7-4a87-b78c-4edc06911b25 under claude-spt (pid 8928) — online at bind\n*20│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242442 mono_ms=323 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*21│CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=lia by=local wall_ms=1784265242442 mono_ms=323 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 22│DAEMON_RESTART_RESUME_REFUSED:webbie: custody pid still alive — refusing to re-run over a live process (dup guard)\n*23│CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784265242455 mono_ms=336 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*24│CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784265242455 mono_ms=336 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 25│CONTROL_REAP_NO_SESSION:deployah: cleared stale controlled/driven_by (no broker session)\n 26│DRIVEN_BY_SELFHEAL_OFFLINE:deployah: cleared stale driven_by (no session)\n 27│LIVENESS_RECONCILE_OFFLINE:deployah: no live broker session (dead harness)\n   │...\n 33│LIVENESS_RECONCILE_OFFLINE:webbie: no live broker session (dead harness)\n*34│CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784265242654 mono_ms=534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*35│CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784265242654 mono_ms=534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*36│CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*37│CONN_LIFECYCLE: conn=9 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*38│CONN_LIFECYCLE: conn=10 role=brain wall_ms=1784265242657 mono_ms=538 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*39│CONN_LIFECYCLE: conn=10 role=brain stream-subscriber stream=2 wall_ms=1784265242667 mono_ms=548 event=stream-sub-attach stream=2 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 40│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n*41│CONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265242747 mono_ms=628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*42│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265242747 mono_ms=628 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 43│PUMP_IPC_READER: spawned\n 44│PUMP_IPC_READER: spawned\n*45│CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242748 mono_ms=629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*46│CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242749 mono_ms=629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784292971167}}
{"type":"message","id":"8735025c","parentId":"f5d48cc8","timestamp":"2026-07-17T12:56:24.481Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing log lines around generation1 event**\n\n**Extracting stream-sub-attach events**"},{"type":"toolCall","id":"call_rSfsAMJePs28dprM66F9C0zl|fc_0148993141920bab016a5a2678686c8195a1dcfc96cce4525c","name":"grep","arguments":{"i":"Extracting stream attach cadence","pattern":"event=stream-sub-attach","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-2800","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_LCHgdWOIOg9PhOBMesLG0y7a|fc_0148993141920bab016a5a2678688081959f408520d9bf7f47","name":"grep","arguments":{"i":"Extracting transport cadence","pattern":"event=(write-start|transport-close|stream-sub-release)","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-1800","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_CBI9CSY41jGGb24ns1H6N3aV|fc_0148993141920bab016a5a2678688881958daa29517767409c","name":"grep","arguments":{"i":"Checking current dispatch failures","pattern":"DISPATCH:|DISPATCH_EV|DISPATCH_LOOP_FAIL","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_OWZIauFh35skDsr05zqDKX69|fc_0148993141920bab016a5a2678688c81959bb561213939aa34","name":"grep","arguments":{"i":"Finding stream table complexity","pattern":"pub fn net_streams|KIND_NET_STREAMS|net_streams\\(|streams_info|held_streams|list_stream","path":"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_8lJ7fEID82fjrUXEAmGaW2Ox|fc_0148993141920bab016a5a2678689481959fbd7f17a224d50a","name":"read","arguments":{"i":"Reading brain heartbeat calls","path":"crates/spt-daemon/src/brain.rs","selector":"1780-1900"}},{"type":"toolCall","id":"call_Fp3btwlHeH6jNV3ElNiRBjiz|fc_0148993141920bab016a5a2678689881958f56f34acda8340d","name":"read","arguments":{"i":"Reading registry advert body","path":"crates/spt-daemon/src/registryhost.rs","selector":"459-735,742-850"}},{"type":"toolCall","id":"call_p42b8kZhHaFiSjdFKvT4XpdX|fc_0148993141920bab016a5a267868a08195aede035ad0a2b65b","name":"grep","arguments":{"i":"Finding livehost interval constant","pattern":"LIVE_RECONCILE_INTERVAL_MS","path":"crates/spt-daemon/src/livehost.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":26623,"output":654,"cacheRead":114176,"cacheWrite":0,"totalTokens":141453,"reasoningTokens":180,"cost":{"input":0.133115,"output":0.019620000000000002,"cacheRead":0.057088,"cacheWrite":0,"total":0.209823}},"stopReason":"toolUse","timestamp":1784292971214,"responseId":"resp_0148993141920bab016a5a266b702c81958fdb0fafbafef354","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a266c9c78819584e2eff5092985b9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiZ4JwrVLvUWKcPNYrGw9VfKJmzaSgghf3GDdjjrD9YNmx8fPNlPmr90-yer_f9Fko6PDm4CuNOfkgItDgRVR1PsSdAcO-zfiYVyPczxU93Q96R39BBOmmCK1O43ujXj-XQvaNmyPEltXaDlEEuuz5y7IPaFwafxMHprGnqQeK18itd8QmvtvbAktEjXnoi1LiMYbYmt6JVrUQIEVQ0Qu_vbYFqyUbddhXpd8UxvuR7fr_vCi7chqLHe92wioJxvnQYwY4BenNsgwcNJPh-ucTm5sLRSpArMRtsBc337PTX7ZDABtytigPCvfX4Oq0a6lqVubyEm7VC5SN5dFz4gx3tC7fGR7tzFLSrGyWIwMfvfZrpw5M8ooBOaPD98JKxhOj9KemdQAygh41NR-ZR_VPboTvhuG6b5FNmSjOEcctEkV4l7-1Xy_I-uemqVSk9MrmHeT-cYA8kwQevsQkfj08F2aUwjyJA9afJDkLH2PY7vz968rTyY7ZUjQT6-MtIRxUTJ-X9_rSuD1qVD02mzGx69ycqxP-91FghmvZncOYQdUqNWvHYY0d3MfKkKWDFq9wAaooj7xBnBMcHNKb2Hsbo8kxFdRZnxlz790zqIUMukz-Waa7bo2g-JUYw82pk9uDKNvtEywY1BEAKV7iR_7nC3JRqLZxL04ENu8Ndguwi5n6nqDATfdyYQQNEunv19sslMcpfHBykz06pLYJIe788wM5HUM9lMvEkl-zqTOzpjC7wy_Kn_zVjYOPrxqZZk_2uQyF5pJnCfJRS_0Df298KcMwSUpWeiG2z64a1OF38cjqg-AfQbn78PXIKRaw43zlfy9DAx7b0_It6Vksc4_EfEKhUDDCZS8DhLScQXZ0XiaCeRt84i1Es86zvebk2x_OGWKQTKn5WaACI6L0DEYetF5_v0v_uwf4aHpdm12pt1MsRZfm8R8fac069YoWzi6yeothoMRTD0fR9lRjBzceRSlOOoPsqjFwfN9fZJ9s_jx8aPwKJK5uHyz8D4dsGL45TCc7k8MB6Pxqf9HHGoBLCYKA-z6bu1tepSyUy1tb88-KudGosbcMHt3sHfv_N75ZsXTPlQ64su8O1WEF6pTt6Zh8LQc6y2SdYPTcTjv7beYWj7wdnLa59IPWNVj3JX_2Cqt8S-2nvyjvaMMF13b_To3DMntcu5cEimlsm2Nn5zhzA7FvwBu6fSlmCAomQdgZ4faJ75IcBGyiQnhlpb7_fpZXQ1B-t7ZnqklQ7tqBEz3PzUqQPZJy1zhcHYeDC4KDSAahDCM_B4r2F-8pfPGfDtVtHqRfcCbEFyV5bWu2GBvtOXOFJ1-S1X6Td8iCdrIGUr1HaOFIVcS2I-EixX8Cm5zrJOv8gmed_2sSoMG8y6bu0j6zB6crxXJN_nyRQwDB7EIoMEbwz5R-GoE9fe1ImBGBhusTy5HSxR10iaHtxhc_s3E6FYzhQre1IOvDatXWN98_yxUlu2nerfAWd5wB5yEVIaD1Io-_PMe5J2G-1qy2xUAX2lmMq1o8E1N-EiB7SXNfMdoVQsx5PtonWfIUJIMr9KHSrkDCL5IcR4ZBTE7XeClO_N6OLj8GQrhKXL8WEPH6VyNiVXvrRI20kAFS0OEHXSJaZtxww87tVhn9rFY5MUWK73pzOf9q2fNu50jHOAI2R07kBBDeNcfibLE8xNsttIt4CBdyofZscitms-wEnXZBHhXwwnO6I2rjZMST9FCJdAVHTzwOV5qjQTwNWf_iGuseWmzEhf8eG2mVx6bmapdYph02ywBtCOpqLHdRrYf8HP0cHANJxqkuBeOX0zDEvBA8qwcHdyoOXNckF2SnQRUupKCyILFGTwEbhUKBj1ck4j7U_EP-qfQldG18RuNgELesSng3upyupXUfISmMrXcFcJqeNaW9JKEBmF6gtTo47j-Oeig3PN5PriMY-EfYEv4Xpqv3IL-Osrxq2wf1EBNjXl5KRouzNFVGDYjEkAeLgY9IWXAYqK4iY0z4rBB50VIK8NaCd8cySMJ7ZYvsc=","summary":[{"type":"summary_text","text":"**Analyzing log lines around generation1 event**"},{"type":"summary_text","text":"**Extracting stream-sub-attach events**"}]},{"id":"fc_0148993141920bab016a5a2678686c8195a1dcfc96cce4525c","type":"function_call","status":"completed","arguments":"{\"i\":\"Extracting stream attach cadence\",\"pattern\":\"event=stream-sub-attach\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-2800\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_rSfsAMJePs28dprM66F9C0zl","name":"grep"},{"id":"fc_0148993141920bab016a5a2678688081959f408520d9bf7f47","type":"function_call","status":"completed","arguments":"{\"i\":\"Extracting transport cadence\",\"pattern\":\"event=(write-start|transport-close|stream-sub-release)\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-1800\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_LCHgdWOIOg9PhOBMesLG0y7a","name":"grep"},{"id":"fc_0148993141920bab016a5a2678688881958daa29517767409c","type":"function_call","status":"completed","arguments":"{\"i\":\"Checking current dispatch failures\",\"pattern\":\"DISPATCH:|DISPATCH_EV|DISPATCH_LOOP_FAIL\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_CBI9CSY41jGGb24ns1H6N3aV","name":"grep"},{"id":"fc_0148993141920bab016a5a2678688c81959bb561213939aa34","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding stream table complexity\",\"pattern\":\"pub fn net_streams|KIND_NET_STREAMS|net_streams\\\\(|streams_info|held_streams|list_stream\",\"path\":\"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_OWZIauFh35skDsr05zqDKX69","name":"grep"},{"id":"fc_0148993141920bab016a5a2678689481959fbd7f17a224d50a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading brain heartbeat calls\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":\"1780-1900\"}","call_id":"call_8lJ7fEID82fjrUXEAmGaW2Ox","name":"read"},{"id":"fc_0148993141920bab016a5a2678689881958f56f34acda8340d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry advert body\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"459-735,742-850\"}","call_id":"call_Fp3btwlHeH6jNV3ElNiRBjiz","name":"read"},{"id":"fc_0148993141920bab016a5a267868a08195aede035ad0a2b65b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding livehost interval constant\",\"pattern\":\"LIVE_RECONCILE_INTERVAL_MS\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_p42b8kZhHaFiSjdFKvT4XpdX","name":"grep"}]},"duration":13266.033999994397,"ttft":1416.2010000050068,"contextSnapshot":{"promptTokens":140799,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_rSfsAMJePs28dprM66F9C0zl|fc_0148993141920bab016a5a2678686c8195a1dcfc96cce4525c","toolName":"grep","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Extracting stream attach cadence"},"id":"1b56cb56","parentId":"8735025c","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_LCHgdWOIOg9PhOBMesLG0y7a|fc_0148993141920bab016a5a2678688081959f408520d9bf7f47","toolName":"grep","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Extracting transport cadence"},"id":"5ff56b3c","parentId":"1b56cb56","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CBI9CSY41jGGb24ns1H6N3aV|fc_0148993141920bab016a5a2678688881958daa29517767409c","toolName":"grep","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Checking current dispatch failures"},"id":"aa25f5b4","parentId":"5ff56b3c","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_OWZIauFh35skDsr05zqDKX69|fc_0148993141920bab016a5a2678688c81959bb561213939aa34","toolName":"grep","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs"},"intent":"Finding stream table complexity"},"id":"761af8e2","parentId":"aa25f5b4","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_8lJ7fEID82fjrUXEAmGaW2Ox|fc_0148993141920bab016a5a2678689481959fbd7f17a224d50a","toolName":"read","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Reading brain heartbeat calls"},"id":"56f10d70","parentId":"761af8e2","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Fp3btwlHeH6jNV3ElNiRBjiz|fc_0148993141920bab016a5a2678689881958f56f34acda8340d","toolName":"read","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry advert body"},"id":"0f6d1b45","parentId":"56f10d70","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_p42b8kZhHaFiSjdFKvT4XpdX|fc_0148993141920bab016a5a267868a08195aede035ad0a2b65b","toolName":"grep","startedAt":"2026-07-17T12:56:24.481Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Finding livehost interval constant"},"id":"ae19335c","parentId":"0f6d1b45","timestamp":"2026-07-17T12:56:24.481Z"}
{"type":"message","id":"b22805fd","parentId":"ae19335c","timestamp":"2026-07-17T12:56:24.486Z","message":{"role":"toolResult","toolCallId":"call_p42b8kZhHaFiSjdFKvT4XpdX|fc_0148993141920bab016a5a267868a08195aede035ad0a2b65b","toolName":"grep","content":[{"type":"text","text":" 49|/// (mirrors [`crate::shellwake::RECONCILE_INTERVAL_MS`]).\n*50|pub const LIVE_RECONCILE_INTERVAL_MS: u64 = 5_000;\n 51|\n 52|/// One brain-hosted live lifecycle: its config-paced pulse-driver thread and the\n 53|/// held stop flag (tripped to un-host on an offline-transition). F-030 W3: the\n...\n 133|/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\n*134|/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n 135|/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n 136|///\n 137|/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n...\n 1030|/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n*1031|/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n 1032|/// config are re-read each sweep (adapter / pulse-period changes land between\n 1033|/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n 1034|/// for symmetry — the threads die with the brain process and the next brain\n...\n 1068|            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n*1069|            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n 1070|            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n 1071|            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n 1072|            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\n...\n 1106|            // Sleep in slices so a stop lands promptly.\n*1107|            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n 1108|            while left > 0 && !stop.load(Ordering::SeqCst) {\n 1109|                let step = left.min(100);\n 1110|                std::thread::sleep(Duration::from_millis(step));"}],"details":{"scopePath":"crates/spt-daemon/src/livehost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":1,"files":["crates/spt-daemon/src/livehost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/livehost.rs","count":5}],"truncated":false,"displayContent":"   49│/// (mirrors [`crate::shellwake::RECONCILE_INTERVAL_MS`]).\n  *50│pub const LIVE_RECONCILE_INTERVAL_MS: u64 = 5_000;\n   51│\n   52│/// One brain-hosted live lifecycle: its config-paced pulse-driver thread and the\n   53│/// held stop flag (tripped to un-host on an offline-transition). F-030 W3: the\n     │...\n  133│/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\n *134│/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n  135│/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n  136│///\n  137│/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n     │...\n 1030│/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n*1031│/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n 1032│/// config are re-read each sweep (adapter / pulse-period changes land between\n 1033│/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n 1034│/// for symmetry — the threads die with the brain process and the next brain\n     │...\n 1068│            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n*1069│            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n 1070│            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n 1071│            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n 1072│            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\n     │...\n 1106│            // Sleep in slices so a stop lands promptly.\n*1107│            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n 1108│            while left > 0 && !stop.load(Ordering::SeqCst) {\n 1109│                let step = left.min(100);\n 1110│                std::thread::sleep(Duration::from_millis(step));"},"isError":false,"timestamp":1784292984486}}
{"type":"message","id":"69fd0668","parentId":"b22805fd","timestamp":"2026-07-17T12:56:24.503Z","message":{"role":"toolResult","toolCallId":"call_Fp3btwlHeH6jNV3ElNiRBjiz|fc_0148993141920bab016a5a2678689881958f56f34acda8340d","toolName":"read","content":[{"type":"text","text":"    /// Scan the owlery and (re-)advertise every self perch into every member\n    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\n    /// the updates to push to peers (the node's own rows only — peers' rows\n    /// reconverge from their own re-advertisement, no transitive gossip in\n    /// v1: trust is pairwise per subnet, a relayed third-party row would\n    /// carry an origin the receiver can't gate honestly).\n    // [impl->REQ-INST-7]\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n        let subnets = SubnetStore::load();\n        let mut vis = VisibilityStore::load();\n        // First-join home adoption (D9-5, REQ-INST-15): within one\n        // advertisement cadence of the node's first join (a pair lands the\n        // subnet record; no pairing-protocol threading needed), unhomed Self\n        // perches adopt the sole subnet + seed their sync scope. Strictly\n        // adopt-if-unset; a multi-subnet store adopts nothing.\n        // [impl->REQ-INST-15]\n        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n            let _ = vis.save();\n        }\n        let vis = vis;\n        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n        // authored its own blurb advertises this default (config seeds, the\n        // agent refines — CONTEXT §resource advertisement).\n        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\n        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\n        // §Discovery scope): registered kind=\"shell\" adapters that chose\n        // broadcast=subnet ride every row this node authors — the other-node\n        // discovery arm. Computed once per scan (the registration set is\n        // node-level).\n        // [impl->REQ-EP-5]\n        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\n            .iter()\n            .filter(|(r, m)| {\n                r.kind == spt_runtime::manifest::AdapterKind::Shell\n                    && m.shell.as_ref().and_then(|s| s.broadcast)\n                        == Some(spt_runtime::manifest::Broadcast::Subnet)\n            })\n            .map(|(r, _)| r.name.clone())\n            .collect();\n        let mut out = Vec::new();\n        let mut regs = self.regs.lock().unwrap();\n        let mut epoch = self.epoch.lock().unwrap();\n\n        // The set of self perches that still EXIST on disk this round — the\n        // ghost-heal predicate below (a LOCAL registry row whose id is absent\n        // here was erased, REQ-HAZARD-ROSTER-GHOST).\n        let live_ids: std::collections::BTreeSet<String> =\n            perch::list_self_perch_ids(owlery).into_iter().collect();\n\n        for id in perch::list_self_perch_ids(owlery) {\n            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n            // Advertisement follows the resting-state machine (D9-2,\n            // REQ-INST-3): a live perch with a resting record advertises its\n            // machine state (active / dormant / suspended); a recordless\n            // (pre-D9-2 / interim) or dead perch keeps the legacy\n            // liveness-derived mapping. Every advertisement stamps a fresh\n            // epoch below, so a transition reaches peers as an epoch-bumped\n            // update — the lease orders it (KH 4.8).\n            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\n            let status = advertised_status(&perch_path);\n            // Endpoint-authored blurb wins; the node seed fills the gap\n            // (both-authored, REQ-INST-14). Rides the same epoch lease as\n            // every instance update — a blurb edit reaches peers as an\n            // ordered, epoch-bumped row.\n            // [impl->REQ-INST-14]\n            let info = spt_store::info::read_info(&perch_path);\n            let resources = info\n                .as_ref()\n                .and_then(|i| i.resources.clone())\n                .or_else(|| node_blurb.clone());\n            // The presence datum (M5-D6a, REQ-PRES-1): the perch's heartbeat\n            // stamp (`lifecycle::touch_active` — Active seats only; a resting\n            // seat never stamps) rides the row like the blurb does — same\n            // epoch lease, same visibility gate, no new channel. Subnet-wide\n            // most-recently-active is a projection of these rows (D6b).\n            // [impl->REQ-PRES-1]\n            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\n            // info.json `state` IS the bound endpoint type\n            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\n            // A node advertises ONLY its own endpoints' types; the cross-node\n            // user-msg gate reads this at the receive funnel (T3). A recordless\n            // perch advertises no type → the funnel fail-closes to a re-stamp.\n            // [impl->REQ-MSG-6]\n            let endpoint_type = info.as_ref().map(|i| i.state.clone());\n            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\n            // the SAME local facts the picker's `local_rows` reads off info.json,\n            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\n            // identically instead of reducing every remote row to plain green.\n            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\n            //    so an UNBOUND perch reads false — exactly the fill duality the\n            //    picker keys on).\n            //  - controller_node: the broker-owned `driven_by` (the driving node),\n            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\n            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\n            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n            //    None self-corrects on the next bind, so it advertises harness-only\n            //    until then, matching the local amber).\n            // [impl->REQ-SUBNET-DISPLAY-PARITY]\n            let bound = is_perch_alive(&perch_path);\n            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\n            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\n            // sets the separate `controlled` flag instead, and its driving node IS\n            // this node — so advertise `self.node_hex`. A remote controller keeps\n            // its own origin. This is what lets a remote viewer see a\n            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n            let controller_node = gossip_controller_node(\n                info.as_ref().and_then(|i| i.driven_by.as_deref()),\n                info.as_ref().is_some_and(|i| i.controlled),\n                &self.node_hex,\n            );\n            let harness_only = info.as_ref().is_some_and(|i| {\n                i.state == \"live_agent\" && i.controllable != Some(true)\n            });\n            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\n            // real harness adapter + its recent projects + the EXPLICIT any-controller\n            // truth, gossiped so `from_resource_row` stops faking remote rows.\n            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\n            //    used to show the resources blurb here).\n            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n            let recent_projects = recent_projects_for(&perch_path, owlery);\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status,\n                    epoch: ep,\n                    resources: resources.clone(),\n                    last_active_ms,\n                    shell_adapters: shell_adapters.clone(),\n                    // The node label rides every row this node authors\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n                    // startup, so a rename converges by re-advertisement.\n                    // [impl->REQ-SUBNET-3]\n                    node_label: self.node_label.clone(),\n                    // The hashed machine id rides beside it (M8 decision\n                    // 13/22) — the re-pair overwrite anchor.\n                    // [impl->REQ-SUBNET-7]\n                    machine_id: self.machine_id.clone(),\n                    // The endpoint's own type tag (REQ-MSG-6) — read by the\n                    // cross-node user-msg gate, keyed by the proven node.\n                    // [impl->REQ-MSG-6]\n                    endpoint_type: endpoint_type.clone(),\n                    // The unified subnet-display parity datums — gossiped so a\n                    // remote picker renders bound/controlled/harness-only with the\n                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound,\n                    controller_node: controller_node.clone(),\n                    harness_only,\n                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\n                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n                    adapter: adapter.clone(),\n                    recent_projects: recent_projects.clone(),\n                    controlled,\n                };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                match advertise_if_visible(\n                    reg,\n                    &vis,\n                    &sub.name,\n                    sub.hide_new_endpoints,\n                    &id,\n                    instance.clone(),\n                ) {\n                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                        subnet: sub.name.clone(),\n                        endpoint_id: id.clone(),\n                        instance,\n                    })),\n                    Ok(None) => {} // hidden in this subnet — not advertised\n                    Err(collision) => {\n                        // Bare-id collision (another node owns the name in\n                        // this subnet): loud skip — resolution is the user's\n                        // rename (D3f), never a silent overwrite.\n                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n                    }\n                }\n            }\n        }\n        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\n        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\n        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\n        // this scan only refreshes perches that still exist, so the stale row is\n        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\n        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\n        // epoch: the lease orders it, so it stops showing Active locally\n        // (resource_projection skips non-routable) AND peers converge to gone. Only\n        // still-routable local rows are touched (idempotent — an already-Offline\n        // ghost is left alone).\n        // [impl->REQ-HAZARD-ROSTER-GHOST]\n        for sub in &subnets.subnets {\n            let reg = regs.entry(sub.name.clone()).or_default();\n            let ghosts: Vec<String> = reg\n                .endpoint_ids()\n                .filter(|id| !live_ids.contains(*id))\n                .filter(|id| {\n                    reg.instances(id)\n                        .iter()\n                        .any(|i| i.node == self.node_hex && i.status.routable())\n                })\n                .map(str::to_string)\n                .collect();\n            for id in ghosts {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status: Status::Offline,\n                    epoch: ep,\n                    resources: None,\n                    last_active_ms: None,\n                    shell_adapters: Vec::new(),\n                    node_label: self.node_label.clone(),\n                    machine_id: self.machine_id.clone(),\n                    endpoint_type: None,\n                    // An erased ghost is gone — unbound, no controller, not a\n                    // harness seat (REQ-SUBNET-DISPLAY-PARITY); Offline is skipped\n                    // by the projection anyway, so these only round-trip the wire.\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound: false,\n                    controller_node: None,\n                    harness_only: false,\n                    adapter: None,\n                    recent_projects: Vec::new(),\n                    controlled: false,\n                };\n                reg.merge_instance(&id, instance.clone());\n                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                    subnet: sub.name.clone(),\n                    endpoint_id: id,\n                    instance,\n                }));\n                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\n            }\n        }\n\n        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\n        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\n        // (zero Self perches, or all hidden) still names itself to peers rather\n        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n        // into our own registry too so the snapshot carries it. Emitted every\n        // round regardless of endpoint count — redundant-but-robust when rows\n        // exist (the render prefers a trust/instance label anyway), the SOLE\n        // carrier when they don't.\n        // [impl->REQ-SUBNET-3]\n        if let Some(label) = self.node_label.clone() {\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                reg.merge_node_label(&self.node_hex, label.clone(), ep);\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n                    subnet: sub.name.clone(),\n                    node: self.node_hex.clone(),\n                    label: label.clone(),\n                    epoch: ep,\n                }));\n            }\n        }\n        drop(epoch);\n        drop(regs);\n        self.write_snapshots();\n        out\n    }\n\n    /// Evict every registry row authored by a **silent** peer node\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n    /// within `ttl` has its rows removed from every subnet registry and the\n    /// snapshots rewritten, so a dead node identity can no longer poison\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n    /// node authors them fresh each pump tick and is never in its own heard\n    /// map). A row whose author has NO heard stamp is treated as silent —\n…\n    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n        self.evict_silent_peers_at(ttl, wall_ms())\n    }\n\n    /// [`evict_silent_peers`](Self::evict_silent_peers) with an explicit\n    /// clock (the testable seam).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let ttl_ms = ttl.as_millis() as u64;\n        let heard = self.heard.lock().unwrap();\n        let silent = |node: &str| {\n            node != self.node_hex\n                && heard\n                    .get(node)\n                    .is_none_or(|&t| now_ms.saturating_sub(t) > ttl_ms)\n        };\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_nodes(silent);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        drop(heard);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n    /// re-advertises Offline once, whole-node eviction never fires) stops\n    /// accumulating unbounded on a remote viewer under churn. Own rows never decay.\n    /// Snapshots are rewritten iff a row was evicted. The per-row receiver-observed\n    /// clock is the model's self-pruning [`SubnetRegistry::evict_aged_offline`]\n    /// side-map (re-derived each call — no leak, no explicit whole-node purge).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_aged_offline_rows(&self, ttl: std::time::Duration) -> usize {\n        self.evict_aged_offline_rows_at(ttl, wall_ms())\n    }\n\n    /// [`evict_aged_offline_rows`](Self::evict_aged_offline_rows) with an explicit\n    /// clock (the testable seam, mirroring [`evict_silent_peers_at`]).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_aged_offline_rows_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let grace_ms = ttl.as_millis() as u64;\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_aged_offline(now_ms, grace_ms, &self.node_hex);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT_OFFLINE:{subnet}: {n} aged-offline row(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Every instance row for `endpoint_id` in `subnet` (the reconcile\n    /// election's input; empty when unknown).\n    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n            .lock()\n            .unwrap()\n            .get(subnet)\n            .map(|r| r.instances(endpoint_id).to_vec())\n            .unwrap_or_default()\n    }\n\n    /// A point-in-time clone of one subnet's registry (resolution input).\n    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n        self.regs.lock().unwrap().get(subnet).cloned()\n    }\n\n    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n    /// readers. Best-effort: a failed snapshot write must not fail the merge\n    /// that triggered it (readers tolerate staleness by contract).\n    fn write_snapshots(&self) {\n        self.snapshot_writes\n            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n        let regs = self.regs.lock().unwrap();\n        if regs.is_empty() {\n            return;\n        }\n        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\n            return;\n        }\n        for (subnet, reg) in regs.iter() {\n            let Ok(json) = serde_json::to_vec_pretty(reg) else {\n                continue;\n            };\n            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\n        }\n        drop(regs);\n        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\n        // the snapshot reader globs `<subnet>.json`, so this can never shadow\n        // a subnet (even one literally named \"heard\").\n…\n    }"}],"details":{"displayContent":{"text":"    /// Scan the owlery and (re-)advertise every self perch into every member\n    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\n    /// the updates to push to peers (the node's own rows only — peers' rows\n    /// reconverge from their own re-advertisement, no transitive gossip in\n    /// v1: trust is pairwise per subnet, a relayed third-party row would\n    /// carry an origin the receiver can't gate honestly).\n    // [impl->REQ-INST-7]\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n        let subnets = SubnetStore::load();\n        let mut vis = VisibilityStore::load();\n        // First-join home adoption (D9-5, REQ-INST-15): within one\n        // advertisement cadence of the node's first join (a pair lands the\n        // subnet record; no pairing-protocol threading needed), unhomed Self\n        // perches adopt the sole subnet + seed their sync scope. Strictly\n        // adopt-if-unset; a multi-subnet store adopts nothing.\n        // [impl->REQ-INST-15]\n        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n            let _ = vis.save();\n        }\n        let vis = vis;\n        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n        // authored its own blurb advertises this default (config seeds, the\n        // agent refines — CONTEXT §resource advertisement).\n        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\n        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\n        // §Discovery scope): registered kind=\"shell\" adapters that chose\n        // broadcast=subnet ride every row this node authors — the other-node\n        // discovery arm. Computed once per scan (the registration set is\n        // node-level).\n        // [impl->REQ-EP-5]\n        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\n            .iter()\n            .filter(|(r, m)| {\n                r.kind == spt_runtime::manifest::AdapterKind::Shell\n                    && m.shell.as_ref().and_then(|s| s.broadcast)\n                        == Some(spt_runtime::manifest::Broadcast::Subnet)\n            })\n            .map(|(r, _)| r.name.clone())\n            .collect();\n        let mut out = Vec::new();\n        let mut regs = self.regs.lock().unwrap();\n        let mut epoch = self.epoch.lock().unwrap();\n\n        // The set of self perches that still EXIST on disk this round — the\n        // ghost-heal predicate below (a LOCAL registry row whose id is absent\n        // here was erased, REQ-HAZARD-ROSTER-GHOST).\n        let live_ids: std::collections::BTreeSet<String> =\n            perch::list_self_perch_ids(owlery).into_iter().collect();\n\n        for id in perch::list_self_perch_ids(owlery) {\n            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n            // Advertisement follows the resting-state machine (D9-2,\n            // REQ-INST-3): a live perch with a resting record advertises its\n            // machine state (active / dormant / suspended); a recordless\n            // (pre-D9-2 / interim) or dead perch keeps the legacy\n            // liveness-derived mapping. Every advertisement stamps a fresh\n            // epoch below, so a transition reaches peers as an epoch-bumped\n            // update — the lease orders it (KH 4.8).\n            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\n            let status = advertised_status(&perch_path);\n            // Endpoint-authored blurb wins; the node seed fills the gap\n            // (both-authored, REQ-INST-14). Rides the same epoch lease as\n            // every instance update — a blurb edit reaches peers as an\n            // ordered, epoch-bumped row.\n            // [impl->REQ-INST-14]\n            let info = spt_store::info::read_info(&perch_path);\n            let resources = info\n                .as_ref()\n                .and_then(|i| i.resources.clone())\n                .or_else(|| node_blurb.clone());\n            // The presence datum (M5-D6a, REQ-PRES-1): the perch's heartbeat\n            // stamp (`lifecycle::touch_active` — Active seats only; a resting\n            // seat never stamps) rides the row like the blurb does — same\n            // epoch lease, same visibility gate, no new channel. Subnet-wide\n            // most-recently-active is a projection of these rows (D6b).\n            // [impl->REQ-PRES-1]\n            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\n            // info.json `state` IS the bound endpoint type\n            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\n            // A node advertises ONLY its own endpoints' types; the cross-node\n            // user-msg gate reads this at the receive funnel (T3). A recordless\n            // perch advertises no type → the funnel fail-closes to a re-stamp.\n            // [impl->REQ-MSG-6]\n            let endpoint_type = info.as_ref().map(|i| i.state.clone());\n            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\n            // the SAME local facts the picker's `local_rows` reads off info.json,\n            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\n            // identically instead of reducing every remote row to plain green.\n            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\n            //    so an UNBOUND perch reads false — exactly the fill duality the\n            //    picker keys on).\n            //  - controller_node: the broker-owned `driven_by` (the driving node),\n            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\n            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\n            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n            //    None self-corrects on the next bind, so it advertises harness-only\n            //    until then, matching the local amber).\n            // [impl->REQ-SUBNET-DISPLAY-PARITY]\n            let bound = is_perch_alive(&perch_path);\n            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\n            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\n            // sets the separate `controlled` flag instead, and its driving node IS\n            // this node — so advertise `self.node_hex`. A remote controller keeps\n            // its own origin. This is what lets a remote viewer see a\n            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n            let controller_node = gossip_controller_node(\n                info.as_ref().and_then(|i| i.driven_by.as_deref()),\n                info.as_ref().is_some_and(|i| i.controlled),\n                &self.node_hex,\n            );\n            let harness_only = info.as_ref().is_some_and(|i| {\n                i.state == \"live_agent\" && i.controllable != Some(true)\n            });\n            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\n            // real harness adapter + its recent projects + the EXPLICIT any-controller\n            // truth, gossiped so `from_resource_row` stops faking remote rows.\n            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\n            //    used to show the resources blurb here).\n            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n            let recent_projects = recent_projects_for(&perch_path, owlery);\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status,\n                    epoch: ep,\n                    resources: resources.clone(),\n                    last_active_ms,\n                    shell_adapters: shell_adapters.clone(),\n                    // The node label rides every row this node authors\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n                    // startup, so a rename converges by re-advertisement.\n                    // [impl->REQ-SUBNET-3]\n                    node_label: self.node_label.clone(),\n                    // The hashed machine id rides beside it (M8 decision\n                    // 13/22) — the re-pair overwrite anchor.\n                    // [impl->REQ-SUBNET-7]\n                    machine_id: self.machine_id.clone(),\n                    // The endpoint's own type tag (REQ-MSG-6) — read by the\n                    // cross-node user-msg gate, keyed by the proven node.\n                    // [impl->REQ-MSG-6]\n                    endpoint_type: endpoint_type.clone(),\n                    // The unified subnet-display parity datums — gossiped so a\n                    // remote picker renders bound/controlled/harness-only with the\n                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound,\n                    controller_node: controller_node.clone(),\n                    harness_only,\n                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\n                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n                    adapter: adapter.clone(),\n                    recent_projects: recent_projects.clone(),\n                    controlled,\n                };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                match advertise_if_visible(\n                    reg,\n                    &vis,\n                    &sub.name,\n                    sub.hide_new_endpoints,\n                    &id,\n                    instance.clone(),\n                ) {\n                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                        subnet: sub.name.clone(),\n                        endpoint_id: id.clone(),\n                        instance,\n                    })),\n                    Ok(None) => {} // hidden in this subnet — not advertised\n                    Err(collision) => {\n                        // Bare-id collision (another node owns the name in\n                        // this subnet): loud skip — resolution is the user's\n                        // rename (D3f), never a silent overwrite.\n                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n                    }\n                }\n            }\n        }\n        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\n        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\n        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\n        // this scan only refreshes perches that still exist, so the stale row is\n        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\n        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\n        // epoch: the lease orders it, so it stops showing Active locally\n        // (resource_projection skips non-routable) AND peers converge to gone. Only\n        // still-routable local rows are touched (idempotent — an already-Offline\n        // ghost is left alone).\n        // [impl->REQ-HAZARD-ROSTER-GHOST]\n        for sub in &subnets.subnets {\n            let reg = regs.entry(sub.name.clone()).or_default();\n            let ghosts: Vec<String> = reg\n                .endpoint_ids()\n                .filter(|id| !live_ids.contains(*id))\n                .filter(|id| {\n                    reg.instances(id)\n                        .iter()\n                        .any(|i| i.node == self.node_hex && i.status.routable())\n                })\n                .map(str::to_string)\n                .collect();\n            for id in ghosts {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status: Status::Offline,\n                    epoch: ep,\n                    resources: None,\n                    last_active_ms: None,\n                    shell_adapters: Vec::new(),\n                    node_label: self.node_label.clone(),\n                    machine_id: self.machine_id.clone(),\n                    endpoint_type: None,\n                    // An erased ghost is gone — unbound, no controller, not a\n                    // harness seat (REQ-SUBNET-DISPLAY-PARITY); Offline is skipped\n                    // by the projection anyway, so these only round-trip the wire.\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound: false,\n                    controller_node: None,\n                    harness_only: false,\n                    adapter: None,\n                    recent_projects: Vec::new(),\n                    controlled: false,\n                };\n                reg.merge_instance(&id, instance.clone());\n                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                    subnet: sub.name.clone(),\n                    endpoint_id: id,\n                    instance,\n                }));\n                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\n            }\n        }\n\n        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\n        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\n        // (zero Self perches, or all hidden) still names itself to peers rather\n        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n        // into our own registry too so the snapshot carries it. Emitted every\n        // round regardless of endpoint count — redundant-but-robust when rows\n        // exist (the render prefers a trust/instance label anyway), the SOLE\n        // carrier when they don't.\n        // [impl->REQ-SUBNET-3]\n        if let Some(label) = self.node_label.clone() {\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                reg.merge_node_label(&self.node_hex, label.clone(), ep);\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n                    subnet: sub.name.clone(),\n                    node: self.node_hex.clone(),\n                    label: label.clone(),\n                    epoch: ep,\n                }));\n            }\n        }\n        drop(epoch);\n        drop(regs);\n        self.write_snapshots();\n        out\n    }\n\n    /// Evict every registry row authored by a **silent** peer node\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n    /// within `ttl` has its rows removed from every subnet registry and the\n    /// snapshots rewritten, so a dead node identity can no longer poison\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n    /// node authors them fresh each pump tick and is never in its own heard\n    /// map). A row whose author has NO heard stamp is treated as silent —\n…\n    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n        self.evict_silent_peers_at(ttl, wall_ms())\n    }\n\n    /// [`evict_silent_peers`](Self::evict_silent_peers) with an explicit\n    /// clock (the testable seam).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let ttl_ms = ttl.as_millis() as u64;\n        let heard = self.heard.lock().unwrap();\n        let silent = |node: &str| {\n            node != self.node_hex\n                && heard\n                    .get(node)\n                    .is_none_or(|&t| now_ms.saturating_sub(t) > ttl_ms)\n        };\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_nodes(silent);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        drop(heard);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n    /// re-advertises Offline once, whole-node eviction never fires) stops\n    /// accumulating unbounded on a remote viewer under churn. Own rows never decay.\n    /// Snapshots are rewritten iff a row was evicted. The per-row receiver-observed\n    /// clock is the model's self-pruning [`SubnetRegistry::evict_aged_offline`]\n    /// side-map (re-derived each call — no leak, no explicit whole-node purge).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_aged_offline_rows(&self, ttl: std::time::Duration) -> usize {\n        self.evict_aged_offline_rows_at(ttl, wall_ms())\n    }\n\n    /// [`evict_aged_offline_rows`](Self::evict_aged_offline_rows) with an explicit\n    /// clock (the testable seam, mirroring [`evict_silent_peers_at`]).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_aged_offline_rows_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let grace_ms = ttl.as_millis() as u64;\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_aged_offline(now_ms, grace_ms, &self.node_hex);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT_OFFLINE:{subnet}: {n} aged-offline row(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Every instance row for `endpoint_id` in `subnet` (the reconcile\n    /// election's input; empty when unknown).\n    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n            .lock()\n            .unwrap()\n            .get(subnet)\n            .map(|r| r.instances(endpoint_id).to_vec())\n            .unwrap_or_default()\n    }\n\n    /// A point-in-time clone of one subnet's registry (resolution input).\n    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n        self.regs.lock().unwrap().get(subnet).cloned()\n    }\n\n    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n    /// readers. Best-effort: a failed snapshot write must not fail the merge\n    /// that triggered it (readers tolerate staleness by contract).\n    fn write_snapshots(&self) {\n        self.snapshot_writes\n            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n        let regs = self.regs.lock().unwrap();\n        if regs.is_empty() {\n            return;\n        }\n        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\n            return;\n        }\n        for (subnet, reg) in regs.iter() {\n            let Ok(json) = serde_json::to_vec_pretty(reg) else {\n                continue;\n            };\n            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\n        }\n        drop(regs);\n        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\n        // the snapshot reader globs `<subnet>.json`, so this can never shadow\n        // a subnet (even one literally named \"heard\").\n…\n    }","startLine":459,"lineNumbers":[459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,null,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,null,857]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"}}},"isError":false,"timestamp":1784292984503}}
{"type":"message","id":"a103db5b","parentId":"69fd0668","timestamp":"2026-07-17T12:56:24.508Z","message":{"role":"toolResult","toolCallId":"call_CBI9CSY41jGGb24ns1H6N3aV|fc_0148993141920bab016a5a2678688881958daa29517767409c","toolName":"grep","content":[{"type":"text","text":"No matches found"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false},"isError":false,"useless":true,"timestamp":1784292984508}}
{"type":"message","id":"5e528114","parentId":"a103db5b","timestamp":"2026-07-17T12:56:24.515Z","message":{"role":"toolResult","toolCallId":"call_rSfsAMJePs28dprM66F9C0zl|fc_0148993141920bab016a5a2678686c8195a1dcfc96cce4525c","toolName":"grep","content":[{"type":"text","text":" 1023|CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1024|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1025|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1026|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n 1027|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1030|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1031|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1032|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1033|CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1034|CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1038|CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1039|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1040|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1041|CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1042|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1043|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1044|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1045|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1046|CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1047|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1048|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1049|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1050|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1053|CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1054|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1055|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1057|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1063|CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1064|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1065|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1066|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1067|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1068|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1069|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1083|CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1084|CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1085|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1086|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1087|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1088|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1094|CONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1095|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1096|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1097|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1098|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1102|CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1103|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1104|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1105|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1106|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1107|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1108|CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1111|CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1112|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1113|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1114|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1115|CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1119|CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1120|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1121|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1122|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1123|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1145|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1146|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1147|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1148|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1149|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1150|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1151|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1152|CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1154|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\n*1155|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1156|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\n*1157|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1158|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1159|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1160|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1161|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1162|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1163|CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1165|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\n*1166|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1167|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1168|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1169|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1170|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1171|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1172|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1173|CONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1174|CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1175|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1176|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1177|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1181|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\n*1182|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1183|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\n*1184|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1185|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\n*1186|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1187|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1188|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1189|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1190|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1191|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1192|CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1195|CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1196|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1197|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1198|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1199|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1201|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n*1202|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1203|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n*1204|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1205|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1206|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1207|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n*1208|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1209|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n 1210|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1211|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1214|CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1215|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1216|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1217|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1218|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1231|CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1232|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1233|CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1234|CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1235|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1236|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1237|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1242|CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1243|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1244|CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1245|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1246|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1247|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1261|CONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1262|CONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1263|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1264|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1265|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1266|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1271|CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1272|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1273|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1274|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1275|CONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1278|CONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1279|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1280|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1281|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1282|CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1285|CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1286|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1288|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1289|CONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1295|CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1296|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1297|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1298|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1299|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1300|CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1301|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1302|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1309|CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1310|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1311|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1312|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1313|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1319|CONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1320|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1321|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1322|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1323|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1324|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1325|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1326|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1338|CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342|CONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1355|CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784292601859 mono_ms=187495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1357|CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=199 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=199 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1358|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1359|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1360|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1366|CONN_LIFECYCLE: conn=546 role=brain wall_ms=1784292601959 mono_ms=187595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1367|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601959 mono_ms=187595 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1368|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601964 mono_ms=187600 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1369|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601964 mono_ms=187600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1370|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601965 mono_ms=187601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1378|CONN_LIFECYCLE: conn=551 role=brain wall_ms=1784292602560 mono_ms=188196 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1379|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1380|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1381|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1382|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1383|CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784292602561 mono_ms=188197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1384|CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=208 wall_ms=1784292602561 mono_ms=188197 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1385|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1386|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1387|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1391|CONN_LIFECYCLE: conn=555 role=brain wall_ms=1784292602569 mono_ms=188205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1392|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602569 mono_ms=188205 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1393|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1394|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1395|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1400|CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784292604768 mono_ms=190404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1401|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1402|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604771 mono_ms=190407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1404|CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784292604771 mono_ms=190407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1411|CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784292608884 mono_ms=194520 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1412|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1413|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414|CONN_LIFECYCLE: conn=567 role=brain wall_ms=1784292608885 mono_ms=194521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1415|CONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608885 mono_ms=194521 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1416|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1417|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1418|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1429|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614605 mono_ms=200241 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1430|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614613 mono_ms=200249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1431|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1432|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1441|CONN_LIFECYCLE: conn=578 role=brain wall_ms=1784292617012 mono_ms=202648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1442|CONN_LIFECYCLE: conn=578 role=brain stream-subscriber stream=215 wall_ms=1784292617012 mono_ms=202648 event=stream-sub-attach stream=215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1443|CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1444|CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1445|CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1446|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1448|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1460|CONN_LIFECYCLE: conn=586 role=brain wall_ms=1784292617614 mono_ms=203250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1461|CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617614 mono_ms=203250 event=stream-sub-attach stream=219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1462|CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1463|CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1464|CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1465|CONN_LIFECYCLE: conn=587 role=brain wall_ms=1784292617624 mono_ms=203260 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1466|CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617624 mono_ms=203260 event=stream-sub-attach stream=218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1467|CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1468|CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1469|CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1474|CONN_LIFECYCLE: conn=592 role=brain wall_ms=1784292623933 mono_ms=209569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1475|CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623933 mono_ms=209569 event=stream-sub-attach stream=220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1476|CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623935 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1477|CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623935 mono_ms=209571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1478|CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623936 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1486|CONN_LIFECYCLE: conn=597 role=brain wall_ms=1784292625838 mono_ms=211474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1487|CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=222 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1488|CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=221 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1489|CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=223 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1490|CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1491|CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1492|CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1495|CONN_LIFECYCLE: conn=602 role=brain wall_ms=1784292629652 mono_ms=215288 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1496|CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629652 mono_ms=215288 event=stream-sub-attach stream=224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1497|CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1498|CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1499|CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1513|CONN_LIFECYCLE: conn=608 role=brain wall_ms=1784292632061 mono_ms=217697 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1514|CONN_LIFECYCLE: conn=610 role=brain stream-subscriber stream=225 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=225 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1515|CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1516|CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1517|CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1518|CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1522|CONN_LIFECYCLE: conn=609 role=brain wall_ms=1784292632074 mono_ms=217710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1523|CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632074 mono_ms=217710 event=stream-sub-attach stream=226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1524|CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1525|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1526|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1534|CONN_LIFECYCLE: conn=617 role=brain wall_ms=1784292632763 mono_ms=218398 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1535|CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1536|CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1537|CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1538|CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1539|CONN_LIFECYCLE: conn=619 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1540|CONN_LIFECYCLE: conn=621 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1541|CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=229 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1542|CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1543|CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1544|CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1545|CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1565|CONN_LIFECYCLE: conn=629 role=brain wall_ms=1784292634870 mono_ms=220506 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1566|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=stream-sub-attach stream=237 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1567|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1568|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634872 mono_ms=220508 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1569|CONN_LIFECYCLE: conn=631 role=brain wall_ms=1784292634873 mono_ms=220509 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1574|CONN_LIFECYCLE: conn=633 role=brain wall_ms=1784292638482 mono_ms=224118 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 1-341 of 895 (49.9KB limit). Use :342 to continue]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":200,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":200}],"truncated":true,"perFileLimitReached":200,"displayContent":" 1023│CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1024│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1025│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1026│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n 1027│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1030│CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1031│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1032│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1033│CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1034│CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1038│CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1039│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1040│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1041│CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1042│CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1043│CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1044│CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1045│CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1046│CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1047│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1048│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1049│CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1050│CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1053│CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1054│CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1055│CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056│CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1057│CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1063│CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1064│CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1065│CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1066│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1067│CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1068│CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1069│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1083│CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1084│CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1085│CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1086│CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1087│CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1088│CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1094│CONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1095│CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1096│CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1097│CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1098│CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1102│CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1103│CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1104│CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1105│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1106│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1107│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1108│CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1111│CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1112│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1113│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1114│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1115│CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1119│CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1120│CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1121│CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1122│CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1123│CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1145│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1146│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1147│CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1148│CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1149│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1150│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1151│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1152│CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1154│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\n*1155│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1156│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\n*1157│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1158│CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1159│CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1160│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1161│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1162│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1163│CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1165│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\n*1166│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1167│CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1168│CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1169│CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1170│CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1171│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1172│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1173│CONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1174│CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1175│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1176│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1177│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1181│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\n*1182│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1183│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\n*1184│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1185│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\n*1186│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1187│CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1188│CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1189│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1190│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1191│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1192│CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1195│CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1196│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1197│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1198│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1199│CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1201│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n*1202│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1203│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n*1204│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1205│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1206│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1207│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n*1208│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1209│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n 1210│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1211│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1214│CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1215│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1216│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1217│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1218│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1231│CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1232│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1233│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1234│CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1235│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1236│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1237│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1242│CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1243│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1244│CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1245│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1246│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1247│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1261│CONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1262│CONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1263│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1264│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1265│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1266│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1271│CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1272│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1273│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1274│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1275│CONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1278│CONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1279│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1280│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1281│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1282│CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1285│CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1286│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1288│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1289│CONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1295│CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1296│CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1297│CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1298│CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1299│CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1300│CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1301│CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1302│CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1309│CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1310│CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1311│CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1312│CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1313│CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1319│CONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1320│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1321│CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1322│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1323│CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1324│CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1325│CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1326│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1338│CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342│CONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1355│CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784292601859 mono_ms=187495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356│CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1357│CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=199 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=199 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1358│CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1359│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1360│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1366│CONN_LIFECYCLE: conn=546 role=brain wall_ms=1784292601959 mono_ms=187595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1367│CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601959 mono_ms=187595 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1368│CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601964 mono_ms=187600 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1369│CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601964 mono_ms=187600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1370│CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601965 mono_ms=187601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1378│CONN_LIFECYCLE: conn=551 role=brain wall_ms=1784292602560 mono_ms=188196 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1379│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1380│CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1381│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1382│CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1383│CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784292602561 mono_ms=188197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1384│CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=208 wall_ms=1784292602561 mono_ms=188197 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1385│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1386│CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1387│CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1391│CONN_LIFECYCLE: conn=555 role=brain wall_ms=1784292602569 mono_ms=188205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1392│CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602569 mono_ms=188205 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1393│CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1394│CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1395│CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1400│CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784292604768 mono_ms=190404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1401│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1402│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604771 mono_ms=190407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1404│CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784292604771 mono_ms=190407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1411│CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784292608884 mono_ms=194520 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1412│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1413│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414│CONN_LIFECYCLE: conn=567 role=brain wall_ms=1784292608885 mono_ms=194521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1415│CONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608885 mono_ms=194521 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1416│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1417│CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1418│CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1428│CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1429│CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614605 mono_ms=200241 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1430│CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614613 mono_ms=200249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1431│CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1432│CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1441│CONN_LIFECYCLE: conn=578 role=brain wall_ms=1784292617012 mono_ms=202648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1442│CONN_LIFECYCLE: conn=578 role=brain stream-subscriber stream=215 wall_ms=1784292617012 mono_ms=202648 event=stream-sub-attach stream=215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1443│CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1444│CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1445│CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1446│CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447│CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1448│CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449│CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1460│CONN_LIFECYCLE: conn=586 role=brain wall_ms=1784292617614 mono_ms=203250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1461│CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617614 mono_ms=203250 event=stream-sub-attach stream=219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1462│CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1463│CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1464│CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1465│CONN_LIFECYCLE: conn=587 role=brain wall_ms=1784292617624 mono_ms=203260 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1466│CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617624 mono_ms=203260 event=stream-sub-attach stream=218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1467│CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1468│CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1469│CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1474│CONN_LIFECYCLE: conn=592 role=brain wall_ms=1784292623933 mono_ms=209569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1475│CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623933 mono_ms=209569 event=stream-sub-attach stream=220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1476│CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623935 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1477│CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623935 mono_ms=209571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1478│CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623936 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1486│CONN_LIFECYCLE: conn=597 role=brain wall_ms=1784292625838 mono_ms=211474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1487│CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=222 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1488│CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=221 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1489│CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=223 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1490│CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1491│CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1492│CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1495│CONN_LIFECYCLE: conn=602 role=brain wall_ms=1784292629652 mono_ms=215288 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1496│CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629652 mono_ms=215288 event=stream-sub-attach stream=224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1497│CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1498│CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1499│CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1513│CONN_LIFECYCLE: conn=608 role=brain wall_ms=1784292632061 mono_ms=217697 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1514│CONN_LIFECYCLE: conn=610 role=brain stream-subscriber stream=225 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=225 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1515│CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1516│CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1517│CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1518│CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1522│CONN_LIFECYCLE: conn=609 role=brain wall_ms=1784292632074 mono_ms=217710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1523│CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632074 mono_ms=217710 event=stream-sub-attach stream=226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1524│CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1525│CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1526│CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1534│CONN_LIFECYCLE: conn=617 role=brain wall_ms=1784292632763 mono_ms=218398 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1535│CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1536│CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1537│CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1538│CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1539│CONN_LIFECYCLE: conn=619 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1540│CONN_LIFECYCLE: conn=621 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1541│CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=229 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1542│CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1543│CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1544│CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1545│CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1565│CONN_LIFECYCLE: conn=629 role=brain wall_ms=1784292634870 mono_ms=220506 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1566│CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=stream-sub-attach stream=237 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1567│CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1568│CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634872 mono_ms=220508 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1569│CONN_LIFECYCLE: conn=631 role=brain wall_ms=1784292634873 mono_ms=220509 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1574│CONN_LIFECYCLE: conn=633 role=brain wall_ms=1784292638482 mono_ms=224118 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1575│CONN_LIFECYCLE: conn=634 role=brain stream-subscriber stream=238 wall_ms=1784292638482 mono_ms=224118 event=stream-sub-attach stream=238 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1576│CONN_LIFECYCLE: conn=634 role=brain stream-subscriber stream=238 wall_ms=1784292638482 mono_ms=224118 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1577│CONN_LIFECYCLE: conn=634 role=brain stream-subscriber stream=238 wall_ms=1784292638483 mono_ms=224119 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1578│CONN_LIFECYCLE: conn=635 role=brain wall_ms=1784292638483 mono_ms=224119 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1583│CONN_LIFECYCLE: conn=637 role=brain wall_ms=1784292639384 mono_ms=225020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1584│CONN_LIFECYCLE: conn=639 role=brain stream-subscriber stream=239 wall_ms=1784292639385 mono_ms=225020 event=stream-sub-attach stream=239 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1585│CONN_LIFECYCLE: conn=639 role=brain stream-subscriber stream=239 wall_ms=1784292639385 mono_ms=225021 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1586│CONN_LIFECYCLE: conn=638 role=brain wall_ms=1784292639386 mono_ms=225022 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1587│CONN_LIFECYCLE: conn=638 role=brain stream-subscriber stream=240 wall_ms=1784292639386 mono_ms=225022 event=stream-sub-attach stream=240 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1588│CONN_LIFECYCLE: conn=639 role=brain stream-subscriber stream=239 wall_ms=1784292639387 mono_ms=225023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1589│CONN_LIFECYCLE: conn=640 role=brain wall_ms=1784292639387 mono_ms=225023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1590│CONN_LIFECYCLE: conn=640 role=brain wall_ms=1784292639387 mono_ms=225023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1595│CONN_LIFECYCLE: conn=642 role=brain wall_ms=1784292639685 mono_ms=225321 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1596│CONN_LIFECYCLE: conn=643 role=brain stream-subscriber stream=241 wall_ms=1784292639686 mono_ms=225322 event=stream-sub-attach stream=241 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1597│CONN_LIFECYCLE: conn=643 role=brain stream-subscriber stream=241 wall_ms=1784292639686 mono_ms=225322 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1598│CONN_LIFECYCLE: conn=643 role=brain stream-subscriber stream=241 wall_ms=1784292639686 mono_ms=225322 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1599│CONN_LIFECYCLE: conn=644 role=brain wall_ms=1784292639686 mono_ms=225322 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1602│CONN_LIFECYCLE: conn=645 role=brain wall_ms=1784292639786 mono_ms=225422 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1603│CONN_LIFECYCLE: conn=646 role=brain stream-subscriber stream=242 wall_ms=1784292639786 mono_ms=225422 event=stream-sub-attach stream=242 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1604│CONN_LIFECYCLE: conn=646 role=brain stream-subscriber stream=242 wall_ms=1784292639786 mono_ms=225422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1605│CONN_LIFECYCLE: conn=646 role=brain stream-subscriber stream=242 wall_ms=1784292639786 mono_ms=225422 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1606│CONN_LIFECYCLE: conn=647 role=brain wall_ms=1784292639787 mono_ms=225422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1614│CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1615│CONN_LIFECYCLE: conn=650 role=brain stream-subscriber stream=248 wall_ms=1784292644703 mono_ms=230339 event=stream-sub-attach stream=248 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1616│CONN_LIFECYCLE: conn=650 role=brain stream-subscriber stream=248 wall_ms=1784292644712 mono_ms=230347 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1617│CONN_LIFECYCLE: conn=651 role=brain wall_ms=1784292644712 mono_ms=230348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1618│CONN_LIFECYCLE: conn=651 role=brain wall_ms=1784292644712 mono_ms=230348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1620│CONN_LIFECYCLE: conn=652 role=brain wall_ms=1784292645937 mono_ms=231573 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1621│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292647041 mono_ms=232677 event=stream-sub-attach stream=249 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1622│CONN_LIFECYCLE: conn=653 role=brain wall_ms=1784292647113 mono_ms=232748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1623│CONN_LIFECYCLE: conn=655 role=brain wall_ms=1784292647113 mono_ms=232748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1624│CONN_LIFECYCLE: conn=654 role=brain wall_ms=1784292647113 mono_ms=232748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1628│CONN_LIFECYCLE: conn=658 role=brain wall_ms=1784292647114 mono_ms=232750 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1629│CONN_LIFECYCLE: conn=658 role=brain stream-subscriber stream=250 wall_ms=1784292647114 mono_ms=232750 event=stream-sub-attach stream=250 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1630│CONN_LIFECYCLE: conn=657 role=brain wall_ms=1784292647118 mono_ms=232754 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1631│CONN_LIFECYCLE: conn=656 role=brain wall_ms=1784292647118 mono_ms=232754 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1632│CONN_LIFECYCLE: conn=657 role=brain stream-subscriber stream=251 wall_ms=1784292647118 mono_ms=232754 event=stream-sub-attach stream=251 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1633│CONN_LIFECYCLE: conn=656 role=brain stream-subscriber stream=252 wall_ms=1784292647118 mono_ms=232754 event=stream-sub-attach stream=252 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1634│CONN_LIFECYCLE: conn=657 role=brain stream-subscriber stream=251 wall_ms=1784292647120 mono_ms=232756 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1635│CONN_LIFECYCLE: conn=659 role=brain wall_ms=1784292647120 mono_ms=232756 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1636│CONN_LIFECYCLE: conn=659 role=brain wall_ms=1784292647121 mono_ms=232756 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1648│CONN_LIFECYCLE: conn=665 role=brain wall_ms=1784292647817 mono_ms=233453 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1649│CONN_LIFECYCLE: conn=665 role=brain stream-subscriber stream=254 wall_ms=1784292647817 mono_ms=233453 event=stream-sub-attach stream=254 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1650│CONN_LIFECYCLE: conn=665 role=brain stream-subscriber stream=254 wall_ms=1784292647819 mono_ms=233455 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1651│CONN_LIFECYCLE: conn=666 role=brain wall_ms=1784292647819 mono_ms=233455 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1652│CONN_LIFECYCLE: conn=666 role=brain wall_ms=1784292647819 mono_ms=233455 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1653│CONN_LIFECYCLE: conn=664 role=brain wall_ms=1784292647832 mono_ms=233468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1654│CONN_LIFECYCLE: conn=664 role=brain stream-subscriber stream=253 wall_ms=1784292647832 mono_ms=233468 event=stream-sub-attach stream=253 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1655│CONN_LIFECYCLE: conn=664 role=brain stream-subscriber stream=253 wall_ms=1784292647838 mono_ms=233474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1656│CONN_LIFECYCLE: conn=667 role=brain wall_ms=1784292647838 mono_ms=233474 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1657│CONN_LIFECYCLE: conn=667 role=brain wall_ms=1784292647838 mono_ms=233474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1658│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292647899 mono_ms=233535 event=stream-sub-attach stream=255 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1659│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292648596 mono_ms=234232 event=stream-sub-release stream=255 [REQ-CONN-POISON-ATTRIBUTION]\n*1660│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292648638 mono_ms=234274 event=stream-sub-attach stream=256 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1661│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292648989 mono_ms=234625 event=stream-sub-release stream=256 [REQ-CONN-POISON-ATTRIBUTION]\n*1662│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292649032 mono_ms=234668 event=stream-sub-attach stream=257 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1663│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292649374 mono_ms=235010 event=stream-sub-release stream=257 [REQ-CONN-POISON-ATTRIBUTION]\n*1664│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292649415 mono_ms=235051 event=stream-sub-attach stream=258 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1665│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292650179 mono_ms=235815 event=stream-sub-release stream=258 [REQ-CONN-POISON-ATTRIBUTION]\n 1666│CONN_LIFECYCLE: conn=668 role=brain wall_ms=1784292650424 mono_ms=236060 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1667│CONN_LIFECYCLE: conn=668 role=brain wall_ms=1784292650424 mono_ms=236060 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1668│CONN_LIFECYCLE: conn=669 role=brain stream-subscriber stream=259 wall_ms=1784292650425 mono_ms=236061 event=stream-sub-attach stream=259 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1669│CONN_LIFECYCLE: conn=669 role=brain stream-subscriber stream=259 wall_ms=1784292650425 mono_ms=236061 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1670│CONN_LIFECYCLE: conn=669 role=brain stream-subscriber stream=259 wall_ms=1784292650425 mono_ms=236061 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1671│CONN_LIFECYCLE: conn=670 role=brain wall_ms=1784292650425 mono_ms=236061 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1674│CONN_LIFECYCLE: conn=671 role=brain wall_ms=1784292650625 mono_ms=236261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1675│CONN_LIFECYCLE: conn=672 role=brain stream-subscriber stream=260 wall_ms=1784292650625 mono_ms=236261 event=stream-sub-attach stream=260 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1676│CONN_LIFECYCLE: conn=672 role=brain stream-subscriber stream=260 wall_ms=1784292650625 mono_ms=236261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1677│CONN_LIFECYCLE: conn=672 role=brain stream-subscriber stream=260 wall_ms=1784292650626 mono_ms=236262 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1678│CONN_LIFECYCLE: conn=673 role=brain wall_ms=1784292650626 mono_ms=236262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1681│CONN_LIFECYCLE: conn=674 role=brain wall_ms=1784292650825 mono_ms=236461 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1682│CONN_LIFECYCLE: conn=675 role=brain stream-subscriber stream=261 wall_ms=1784292650826 mono_ms=236461 event=stream-sub-attach stream=261 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1683│CONN_LIFECYCLE: conn=675 role=brain stream-subscriber stream=261 wall_ms=1784292650826 mono_ms=236462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1684│CONN_LIFECYCLE: conn=675 role=brain stream-subscriber stream=261 wall_ms=1784292650826 mono_ms=236462 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1685│CONN_LIFECYCLE: conn=676 role=brain wall_ms=1784292650826 mono_ms=236462 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1691│CONN_LIFECYCLE: conn=679 role=brain wall_ms=1784292654435 mono_ms=240071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1692│CONN_LIFECYCLE: conn=679 role=brain stream-subscriber stream=262 wall_ms=1784292654435 mono_ms=240071 event=stream-sub-attach stream=262 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1693│CONN_LIFECYCLE: conn=679 role=brain stream-subscriber stream=262 wall_ms=1784292654438 mono_ms=240074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1694│CONN_LIFECYCLE: conn=680 role=brain wall_ms=1784292654438 mono_ms=240074 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1695│CONN_LIFECYCLE: conn=680 role=brain wall_ms=1784292654438 mono_ms=240074 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1703│CONN_LIFECYCLE: conn=684 role=brain wall_ms=1784292657043 mono_ms=242679 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1704│CONN_LIFECYCLE: conn=685 role=brain stream-subscriber stream=264 wall_ms=1784292657043 mono_ms=242679 event=stream-sub-attach stream=264 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1705│CONN_LIFECYCLE: conn=686 role=brain stream-subscriber stream=265 wall_ms=1784292657043 mono_ms=242679 event=stream-sub-attach stream=265 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1706│CONN_LIFECYCLE: conn=685 role=brain stream-subscriber stream=264 wall_ms=1784292657043 mono_ms=242679 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1707│CONN_LIFECYCLE: conn=687 role=brain stream-subscriber stream=263 wall_ms=1784292657043 mono_ms=242679 event=stream-sub-attach stream=263 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1708│CONN_LIFECYCLE: conn=686 role=brain stream-subscriber stream=265 wall_ms=1784292657043 mono_ms=242679 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1709│CONN_LIFECYCLE: conn=687 role=brain stream-subscriber stream=263 wall_ms=1784292657043 mono_ms=242679 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1710│CONN_LIFECYCLE: conn=686 role=brain stream-subscriber stream=265 wall_ms=1784292657045 mono_ms=242681 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1721│CONN_LIFECYCLE: conn=692 role=brain wall_ms=1784292659753 mono_ms=245389 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1722│CONN_LIFECYCLE: conn=692 role=brain stream-subscriber stream=271 wall_ms=1784292659754 mono_ms=245389 event=stream-sub-attach stream=271 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1723│CONN_LIFECYCLE: conn=692 role=brain stream-subscriber stream=271 wall_ms=1784292659761 mono_ms=245397 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1724│CONN_LIFECYCLE: conn=693 role=brain wall_ms=1784292659762 mono_ms=245397 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1725│CONN_LIFECYCLE: conn=693 role=brain wall_ms=1784292659762 mono_ms=245397 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1727│CONN_LIFECYCLE: conn=694 role=brain wall_ms=1784292660355 mono_ms=245990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1728│CONN_LIFECYCLE: conn=695 role=brain stream-subscriber stream=272 wall_ms=1784292660355 mono_ms=245991 event=stream-sub-attach stream=272 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1729│CONN_LIFECYCLE: conn=695 role=brain stream-subscriber stream=272 wall_ms=1784292660355 mono_ms=245991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1730│CONN_LIFECYCLE: conn=695 role=brain stream-subscriber stream=272 wall_ms=1784292660355 mono_ms=245991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1731│CONN_LIFECYCLE: conn=696 role=brain wall_ms=1784292660356 mono_ms=245991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1745│CONN_LIFECYCLE: conn=701 role=brain wall_ms=1784292662262 mono_ms=247898 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1746│CONN_LIFECYCLE: conn=701 role=brain stream-subscriber stream=275 wall_ms=1784292662262 mono_ms=247898 event=stream-sub-attach stream=275 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1747│CONN_LIFECYCLE: conn=701 role=brain stream-subscriber stream=275 wall_ms=1784292662268 mono_ms=247904 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1748│CONN_LIFECYCLE: conn=704 role=brain wall_ms=1784292662268 mono_ms=247904 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1749│CONN_LIFECYCLE: conn=704 role=brain wall_ms=1784292662268 mono_ms=247904 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1751│CONN_LIFECYCLE: conn=702 role=brain wall_ms=1784292662268 mono_ms=247904 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1752│CONN_LIFECYCLE: conn=703 role=brain stream-subscriber stream=273 wall_ms=1784292662268 mono_ms=247904 event=stream-sub-attach stream=273 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1753│CONN_LIFECYCLE: conn=702 role=brain stream-subscriber stream=274 wall_ms=1784292662268 mono_ms=247904 event=stream-sub-attach stream=274 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1754│CONN_LIFECYCLE: conn=703 role=brain stream-subscriber stream=273 wall_ms=1784292662277 mono_ms=247913 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1755│CONN_LIFECYCLE: conn=705 role=brain wall_ms=1784292662277 mono_ms=247913 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1756│CONN_LIFECYCLE: conn=705 role=brain wall_ms=1784292662277 mono_ms=247913 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1767│CONN_LIFECYCLE: conn=710 role=brain wall_ms=1784292662963 mono_ms=248599 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1768│CONN_LIFECYCLE: conn=712 role=brain stream-subscriber stream=278 wall_ms=1784292662963 mono_ms=248599 event=stream-sub-attach stream=278 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1769│CONN_LIFECYCLE: conn=713 role=brain stream-subscriber stream=276 wall_ms=1784292662963 mono_ms=248599 event=stream-sub-attach stream=276 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1770│CONN_LIFECYCLE: conn=712 role=brain stream-subscriber stream=278 wall_ms=1784292662963 mono_ms=248599 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1771│CONN_LIFECYCLE: conn=713 role=brain stream-subscriber stream=276 wall_ms=1784292662963 mono_ms=248599 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1772│CONN_LIFECYCLE: conn=711 role=brain wall_ms=1784292662964 mono_ms=248600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1773│CONN_LIFECYCLE: conn=714 role=brain wall_ms=1784292662964 mono_ms=248600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1774│CONN_LIFECYCLE: conn=711 role=brain stream-subscriber stream=277 wall_ms=1784292662964 mono_ms=248600 event=stream-sub-attach stream=277 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1775│CONN_LIFECYCLE: conn=714 role=brain stream-subscriber stream=279 wall_ms=1784292662964 mono_ms=248600 event=stream-sub-attach stream=279 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1776│CONN_LIFECYCLE: conn=712 role=brain stream-subscriber stream=278 wall_ms=1784292662966 mono_ms=248602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1777│CONN_LIFECYCLE: conn=715 role=brain wall_ms=1784292662966 mono_ms=248602 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1778│CONN_LIFECYCLE: conn=715 role=brain wall_ms=1784292662966 mono_ms=248602 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1789│CONN_LIFECYCLE: conn=719 role=brain wall_ms=1784292665069 mono_ms=250705 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1790│CONN_LIFECYCLE: conn=720 role=brain stream-subscriber stream=280 wall_ms=1784292665069 mono_ms=250705 event=stream-sub-attach stream=280 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1791│CONN_LIFECYCLE: conn=720 role=brain stream-subscriber stream=280 wall_ms=1784292665069 mono_ms=250705 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1792│CONN_LIFECYCLE: conn=720 role=brain stream-subscriber stream=280 wall_ms=1784292665072 mono_ms=250708 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1793│CONN_LIFECYCLE: conn=721 role=brain wall_ms=1784292665072 mono_ms=250708 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1800│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1801│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1802│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1803│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669787 mono_ms=255423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1804│CONN_LIFECYCLE: conn=725 role=brain wall_ms=1784292669787 mono_ms=255423 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1810│CONN_LIFECYCLE: conn=728 role=brain wall_ms=1784292674903 mono_ms=260539 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1811│CONN_LIFECYCLE: conn=728 role=brain stream-subscriber stream=282 wall_ms=1784292674903 mono_ms=260539 event=stream-sub-attach stream=282 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1812│CONN_LIFECYCLE: conn=728 role=brain stream-subscriber stream=282 wall_ms=1784292674911 mono_ms=260547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1813│CONN_LIFECYCLE: conn=729 role=brain wall_ms=1784292674911 mono_ms=260547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1814│CONN_LIFECYCLE: conn=729 role=brain wall_ms=1784292674911 mono_ms=260547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1823│CONN_LIFECYCLE: conn=734 role=brain wall_ms=1784292677412 mono_ms=263048 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1824│CONN_LIFECYCLE: conn=734 role=brain stream-subscriber stream=283 wall_ms=1784292677412 mono_ms=263048 event=stream-sub-attach stream=283 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1825│CONN_LIFECYCLE: conn=736 role=brain wall_ms=1784292677416 mono_ms=263052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1826│CONN_LIFECYCLE: conn=735 role=brain wall_ms=1784292677416 mono_ms=263052 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1827│CONN_LIFECYCLE: conn=736 role=brain stream-subscriber stream=285 wall_ms=1784292677416 mono_ms=263052 event=stream-sub-attach stream=285 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1828│CONN_LIFECYCLE: conn=735 role=brain stream-subscriber stream=284 wall_ms=1784292677416 mono_ms=263052 event=stream-sub-attach stream=284 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1829│CONN_LIFECYCLE: conn=735 role=brain stream-subscriber stream=284 wall_ms=1784292677419 mono_ms=263054 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1830│CONN_LIFECYCLE: conn=737 role=brain wall_ms=1784292677419 mono_ms=263055 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1831│CONN_LIFECYCLE: conn=737 role=brain wall_ms=1784292677419 mono_ms=263055 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1842│CONN_LIFECYCLE: conn=742 role=brain wall_ms=1784292678014 mono_ms=263650 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1843│CONN_LIFECYCLE: conn=742 role=brain stream-subscriber stream=287 wall_ms=1784292678014 mono_ms=263650 event=stream-sub-attach stream=287 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1844│CONN_LIFECYCLE: conn=742 role=brain stream-subscriber stream=287 wall_ms=1784292678016 mono_ms=263652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1845│CONN_LIFECYCLE: conn=744 role=brain wall_ms=1784292678016 mono_ms=263652 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1846│CONN_LIFECYCLE: conn=744 role=brain wall_ms=1784292678017 mono_ms=263652 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1847│CONN_LIFECYCLE: conn=743 role=brain wall_ms=1784292678025 mono_ms=263661 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1848│CONN_LIFECYCLE: conn=743 role=brain stream-subscriber stream=286 wall_ms=1784292678025 mono_ms=263661 event=stream-sub-attach stream=286 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1849│CONN_LIFECYCLE: conn=743 role=brain stream-subscriber stream=286 wall_ms=1784292678030 mono_ms=263666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1850│CONN_LIFECYCLE: conn=745 role=brain wall_ms=1784292678030 mono_ms=263666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1851│CONN_LIFECYCLE: conn=745 role=brain wall_ms=1784292678030 mono_ms=263666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1854│CONN_LIFECYCLE: conn=747 role=brain wall_ms=1784292679619 mono_ms=265255 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1855│CONN_LIFECYCLE: conn=747 role=brain stream-subscriber stream=288 wall_ms=1784292679619 mono_ms=265255 event=stream-sub-attach stream=288 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1856│CONN_LIFECYCLE: conn=747 role=brain stream-subscriber stream=288 wall_ms=1784292679622 mono_ms=265258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1857│CONN_LIFECYCLE: conn=748 role=brain wall_ms=1784292679622 mono_ms=265258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1858│CONN_LIFECYCLE: conn=748 role=brain wall_ms=1784292679622 mono_ms=265258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1868│CONN_LIFECYCLE: conn=753 role=brain wall_ms=1784292688450 mono_ms=274086 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1869│CONN_LIFECYCLE: conn=755 role=brain stream-subscriber stream=289 wall_ms=1784292688450 mono_ms=274086 event=stream-sub-attach stream=289 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1870│CONN_LIFECYCLE: conn=754 role=brain stream-subscriber stream=290 wall_ms=1784292688450 mono_ms=274086 event=stream-sub-attach stream=290 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1871│CONN_LIFECYCLE: conn=755 role=brain stream-subscriber stream=289 wall_ms=1784292688450 mono_ms=274086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1872│CONN_LIFECYCLE: conn=754 role=brain stream-subscriber stream=290 wall_ms=1784292688450 mono_ms=274086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1873│CONN_LIFECYCLE: conn=756 role=brain stream-subscriber stream=291 wall_ms=1784292688450 mono_ms=274086 event=stream-sub-attach stream=291 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1874│CONN_LIFECYCLE: conn=756 role=brain stream-subscriber stream=291 wall_ms=1784292688450 mono_ms=274086 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1875│CONN_LIFECYCLE: conn=756 role=brain stream-subscriber stream=291 wall_ms=1784292689387 mono_ms=275023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1876│CONN_LIFECYCLE: conn=757 role=brain wall_ms=1784292689387 mono_ms=275023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1886│CONN_LIFECYCLE: conn=761 role=brain wall_ms=1784292689854 mono_ms=275490 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1887│CONN_LIFECYCLE: conn=761 role=brain stream-subscriber stream=302 wall_ms=1784292689854 mono_ms=275490 event=stream-sub-attach stream=302 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1888│CONN_LIFECYCLE: conn=761 role=brain stream-subscriber stream=302 wall_ms=1784292689862 mono_ms=275498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1889│CONN_LIFECYCLE: conn=762 role=brain wall_ms=1784292689862 mono_ms=275498 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1890│CONN_LIFECYCLE: conn=762 role=brain wall_ms=1784292689863 mono_ms=275498 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1903│CONN_LIFECYCLE: conn=768 role=brain wall_ms=1784292692462 mono_ms=278098 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1904│CONN_LIFECYCLE: conn=768 role=brain stream-subscriber stream=305 wall_ms=1784292692462 mono_ms=278098 event=stream-sub-attach stream=305 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1905│CONN_LIFECYCLE: conn=768 role=brain stream-subscriber stream=305 wall_ms=1784292692467 mono_ms=278103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1906│CONN_LIFECYCLE: conn=770 role=brain wall_ms=1784292692467 mono_ms=278103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1907│CONN_LIFECYCLE: conn=770 role=brain wall_ms=1784292692467 mono_ms=278103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1909│CONN_LIFECYCLE: conn=767 role=brain wall_ms=1784292692477 mono_ms=278113 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1910│CONN_LIFECYCLE: conn=769 role=brain stream-subscriber stream=303 wall_ms=1784292692477 mono_ms=278113 event=stream-sub-attach stream=303 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1911│CONN_LIFECYCLE: conn=767 role=brain stream-subscriber stream=304 wall_ms=1784292692477 mono_ms=278113 event=stream-sub-attach stream=304 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1912│CONN_LIFECYCLE: conn=767 role=brain stream-subscriber stream=304 wall_ms=1784292692479 mono_ms=278115 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1913│CONN_LIFECYCLE: conn=771 role=brain wall_ms=1784292692479 mono_ms=278115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1914│CONN_LIFECYCLE: conn=771 role=brain wall_ms=1784292692479 mono_ms=278115 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1925│CONN_LIFECYCLE: conn=776 role=brain wall_ms=1784292693162 mono_ms=278797 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1926│CONN_LIFECYCLE: conn=777 role=brain stream-subscriber stream=308 wall_ms=1784292693162 mono_ms=278798 event=stream-sub-attach stream=308 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1927│CONN_LIFECYCLE: conn=779 role=brain stream-subscriber stream=306 wall_ms=1784292693162 mono_ms=278798 event=stream-sub-attach stream=306 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1928│CONN_LIFECYCLE: conn=777 role=brain stream-subscriber stream=308 wall_ms=1784292693162 mono_ms=278798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1929│CONN_LIFECYCLE: conn=779 role=brain stream-subscriber stream=306 wall_ms=1784292693162 mono_ms=278798 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1930│CONN_LIFECYCLE: conn=778 role=brain wall_ms=1784292693163 mono_ms=278799 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1931│CONN_LIFECYCLE: conn=778 role=brain stream-subscriber stream=309 wall_ms=1784292693163 mono_ms=278799 event=stream-sub-attach stream=309 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1932│CONN_LIFECYCLE: conn=777 role=brain stream-subscriber stream=308 wall_ms=1784292693165 mono_ms=278800 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1933│CONN_LIFECYCLE: conn=781 role=brain wall_ms=1784292693165 mono_ms=278801 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1934│CONN_LIFECYCLE: conn=781 role=brain wall_ms=1784292693165 mono_ms=278801 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1935│CONN_LIFECYCLE: conn=780 role=brain wall_ms=1784292693166 mono_ms=278802 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1936│CONN_LIFECYCLE: conn=780 role=brain stream-subscriber stream=307 wall_ms=1784292693166 mono_ms=278802 event=stream-sub-attach stream=307 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1937│CONN_LIFECYCLE: conn=779 role=brain stream-subscriber stream=306 wall_ms=1784292693167 mono_ms=278803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1938│CONN_LIFECYCLE: conn=782 role=brain wall_ms=1784292693167 mono_ms=278803 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1939│CONN_LIFECYCLE: conn=782 role=brain wall_ms=1784292693167 mono_ms=278803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1947│CONN_LIFECYCLE: conn=785 role=brain wall_ms=1784292695167 mono_ms=280803 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1948│CONN_LIFECYCLE: conn=786 role=brain stream-subscriber stream=310 wall_ms=1784292695168 mono_ms=280803 event=stream-sub-attach stream=310 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1949│CONN_LIFECYCLE: conn=786 role=brain stream-subscriber stream=310 wall_ms=1784292695168 mono_ms=280804 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1950│CONN_LIFECYCLE: conn=786 role=brain stream-subscriber stream=310 wall_ms=1784292695170 mono_ms=280806 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1951│CONN_LIFECYCLE: conn=787 role=brain wall_ms=1784292695170 mono_ms=280806 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1956│CONN_LIFECYCLE: conn=789 role=brain wall_ms=1784292699780 mono_ms=285416 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1957│CONN_LIFECYCLE: conn=790 role=brain stream-subscriber stream=311 wall_ms=1784292699781 mono_ms=285416 event=stream-sub-attach stream=311 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1958│CONN_LIFECYCLE: conn=790 role=brain stream-subscriber stream=311 wall_ms=1784292699781 mono_ms=285416 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1959│CONN_LIFECYCLE: conn=790 role=brain stream-subscriber stream=311 wall_ms=1784292699781 mono_ms=285417 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1960│CONN_LIFECYCLE: conn=791 role=brain wall_ms=1784292699781 mono_ms=285417 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1963│CONN_LIFECYCLE: conn=792 role=brain wall_ms=1784292700382 mono_ms=286018 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1964│CONN_LIFECYCLE: conn=793 role=brain stream-subscriber stream=312 wall_ms=1784292700382 mono_ms=286018 event=stream-sub-attach stream=312 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1965│CONN_LIFECYCLE: conn=793 role=brain stream-subscriber stream=312 wall_ms=1784292700382 mono_ms=286018 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1966│CONN_LIFECYCLE: conn=793 role=brain stream-subscriber stream=312 wall_ms=1784292700385 mono_ms=286020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1967│CONN_LIFECYCLE: conn=794 role=brain wall_ms=1784292700385 mono_ms=286020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1970│CONN_LIFECYCLE: conn=795 role=brain wall_ms=1784292700583 mono_ms=286218 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1971│CONN_LIFECYCLE: conn=796 role=brain stream-subscriber stream=313 wall_ms=1784292700583 mono_ms=286219 event=stream-sub-attach stream=313 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1972│CONN_LIFECYCLE: conn=796 role=brain stream-subscriber stream=313 wall_ms=1784292700583 mono_ms=286219 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1973│CONN_LIFECYCLE: conn=796 role=brain stream-subscriber stream=313 wall_ms=1784292700583 mono_ms=286219 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1974│CONN_LIFECYCLE: conn=797 role=brain wall_ms=1784292700583 mono_ms=286219 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1977│CONN_LIFECYCLE: conn=798 role=brain wall_ms=1784292700683 mono_ms=286319 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1978│CONN_LIFECYCLE: conn=799 role=brain stream-subscriber stream=314 wall_ms=1784292700683 mono_ms=286319 event=stream-sub-attach stream=314 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1979│CONN_LIFECYCLE: conn=799 role=brain stream-subscriber stream=314 wall_ms=1784292700684 mono_ms=286319 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1980│CONN_LIFECYCLE: conn=799 role=brain stream-subscriber stream=314 wall_ms=1784292700684 mono_ms=286320 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1981│CONN_LIFECYCLE: conn=800 role=brain wall_ms=1784292700684 mono_ms=286320 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1987│CONN_LIFECYCLE: conn=803 role=brain wall_ms=1784292704797 mono_ms=290433 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1988│CONN_LIFECYCLE: conn=803 role=brain stream-subscriber stream=320 wall_ms=1784292704797 mono_ms=290433 event=stream-sub-attach stream=320 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1989│CONN_LIFECYCLE: conn=803 role=brain stream-subscriber stream=320 wall_ms=1784292704800 mono_ms=290436 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1990│CONN_LIFECYCLE: conn=804 role=brain wall_ms=1784292704800 mono_ms=290436 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1991│CONN_LIFECYCLE: conn=804 role=brain wall_ms=1784292704800 mono_ms=290436 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1994│CONN_LIFECYCLE: conn=806 role=brain wall_ms=1784292704998 mono_ms=290634 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1995│CONN_LIFECYCLE: conn=806 role=brain stream-subscriber stream=321 wall_ms=1784292704998 mono_ms=290634 event=stream-sub-attach stream=321 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1996│CONN_LIFECYCLE: conn=806 role=brain stream-subscriber stream=321 wall_ms=1784292705006 mono_ms=290642 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1997│CONN_LIFECYCLE: conn=807 role=brain wall_ms=1784292705006 mono_ms=290642 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1998│CONN_LIFECYCLE: conn=807 role=brain wall_ms=1784292705006 mono_ms=290642 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2007│CONN_LIFECYCLE: conn=812 role=brain wall_ms=1784292707607 mono_ms=293243 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2008│CONN_LIFECYCLE: conn=812 role=brain stream-subscriber stream=324 wall_ms=1784292707607 mono_ms=293243 event=stream-sub-attach stream=324 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2009│CONN_LIFECYCLE: conn=812 role=brain stream-subscriber stream=324 wall_ms=1784292707613 mono_ms=293249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2010│CONN_LIFECYCLE: conn=815 role=brain wall_ms=1784292707613 mono_ms=293249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2011│CONN_LIFECYCLE: conn=815 role=brain wall_ms=1784292707613 mono_ms=293249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2013│CONN_LIFECYCLE: conn=813 role=brain wall_ms=1784292707617 mono_ms=293253 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2014│CONN_LIFECYCLE: conn=814 role=brain stream-subscriber stream=323 wall_ms=1784292707617 mono_ms=293253 event=stream-sub-attach stream=323 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2015│CONN_LIFECYCLE: conn=813 role=brain stream-subscriber stream=322 wall_ms=1784292707618 mono_ms=293253 event=stream-sub-attach stream=322 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2016│CONN_LIFECYCLE: conn=814 role=brain stream-subscriber stream=323 wall_ms=1784292707620 mono_ms=293255 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2017│CONN_LIFECYCLE: conn=816 role=brain wall_ms=1784292707620 mono_ms=293256 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2018│CONN_LIFECYCLE: conn=816 role=brain wall_ms=1784292707620 mono_ms=293256 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2027│CONN_LIFECYCLE: conn=821 role=brain wall_ms=1784292708209 mono_ms=293845 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2028│CONN_LIFECYCLE: conn=820 role=brain stream-subscriber stream=325 wall_ms=1784292708209 mono_ms=293845 event=stream-sub-attach stream=325 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2029│CONN_LIFECYCLE: conn=821 role=brain stream-subscriber stream=326 wall_ms=1784292708209 mono_ms=293845 event=stream-sub-attach stream=326 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2030│CONN_LIFECYCLE: conn=821 role=brain stream-subscriber stream=326 wall_ms=1784292708211 mono_ms=293847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2031│CONN_LIFECYCLE: conn=822 role=brain wall_ms=1784292708211 mono_ms=293847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2032│CONN_LIFECYCLE: conn=822 role=brain wall_ms=1784292708211 mono_ms=293847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2039│CONN_LIFECYCLE: conn=825 role=brain wall_ms=1784292711823 mono_ms=297459 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2040│CONN_LIFECYCLE: conn=826 role=brain stream-subscriber stream=327 wall_ms=1784292711824 mono_ms=297459 event=stream-sub-attach stream=327 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2041│CONN_LIFECYCLE: conn=826 role=brain stream-subscriber stream=327 wall_ms=1784292711824 mono_ms=297460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2042│CONN_LIFECYCLE: conn=826 role=brain stream-subscriber stream=327 wall_ms=1784292711824 mono_ms=297460 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2043│CONN_LIFECYCLE: conn=827 role=brain wall_ms=1784292711824 mono_ms=297460 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2046│CONN_LIFECYCLE: conn=828 role=brain wall_ms=1784292712024 mono_ms=297660 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2047│CONN_LIFECYCLE: conn=829 role=brain stream-subscriber stream=328 wall_ms=1784292712024 mono_ms=297660 event=stream-sub-attach stream=328 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2048│CONN_LIFECYCLE: conn=829 role=brain stream-subscriber stream=328 wall_ms=1784292712024 mono_ms=297660 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2049│CONN_LIFECYCLE: conn=829 role=brain stream-subscriber stream=328 wall_ms=1784292712024 mono_ms=297660 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2050│CONN_LIFECYCLE: conn=830 role=brain wall_ms=1784292712025 mono_ms=297660 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2053│CONN_LIFECYCLE: conn=831 role=brain wall_ms=1784292712225 mono_ms=297860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2054│CONN_LIFECYCLE: conn=832 role=brain stream-subscriber stream=329 wall_ms=1784292712225 mono_ms=297861 event=stream-sub-attach stream=329 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2055│CONN_LIFECYCLE: conn=832 role=brain stream-subscriber stream=329 wall_ms=1784292712225 mono_ms=297861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2056│CONN_LIFECYCLE: conn=832 role=brain stream-subscriber stream=329 wall_ms=1784292712225 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2057│CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2060│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n*2061│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n*2063│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2064│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292716294 mono_ms=301930 event=stream-sub-release stream=331 [REQ-CONN-POISON-ATTRIBUTION]\n*2065│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292716344 mono_ms=301980 event=stream-sub-attach stream=332 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2066│CONN_LIFECYCLE: conn=834 role=brain wall_ms=1784292716396 mono_ms=302032 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2067│CONN_LIFECYCLE: conn=834 role=brain wall_ms=1784292716396 mono_ms=302032 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2068│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292716841 mono_ms=302476 event=stream-sub-release stream=332 [REQ-CONN-POISON-ATTRIBUTION]\n*2069│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292716884 mono_ms=302519 event=stream-sub-attach stream=333 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2070│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292717552 mono_ms=303188 event=stream-sub-release stream=333 [REQ-CONN-POISON-ATTRIBUTION]\n*2071│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292717594 mono_ms=303229 event=stream-sub-attach stream=334 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2072│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292718159 mono_ms=303794 event=stream-sub-release stream=334 [REQ-CONN-POISON-ATTRIBUTION]\n 2073│CONN_LIFECYCLE: conn=835 role=brain wall_ms=1784292719651 mono_ms=305287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2074│CONN_LIFECYCLE: conn=836 role=brain wall_ms=1784292719651 mono_ms=305287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2078│CONN_LIFECYCLE: conn=837 role=brain wall_ms=1784292719651 mono_ms=305287 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2079│CONN_LIFECYCLE: conn=839 role=brain stream-subscriber stream=336 wall_ms=1784292719651 mono_ms=305287 event=stream-sub-attach stream=336 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2080│CONN_LIFECYCLE: conn=838 role=brain stream-subscriber stream=335 wall_ms=1784292719651 mono_ms=305287 event=stream-sub-attach stream=335 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2081│CONN_LIFECYCLE: conn=840 role=brain stream-subscriber stream=337 wall_ms=1784292719651 mono_ms=305287 event=stream-sub-attach stream=337 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2082│CONN_LIFECYCLE: conn=839 role=brain stream-subscriber stream=336 wall_ms=1784292719651 mono_ms=305287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2083│CONN_LIFECYCLE: conn=838 role=brain stream-subscriber stream=335 wall_ms=1784292719651 mono_ms=305287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2084│CONN_LIFECYCLE: conn=840 role=brain stream-subscriber stream=337 wall_ms=1784292719651 mono_ms=305287 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2087│CONN_LIFECYCLE: conn=842 role=brain wall_ms=1784292719853 mono_ms=305489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2088│CONN_LIFECYCLE: conn=842 role=brain stream-subscriber stream=338 wall_ms=1784292719853 mono_ms=305489 event=stream-sub-attach stream=338 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2089│CONN_LIFECYCLE: conn=842 role=brain stream-subscriber stream=338 wall_ms=1784292719856 mono_ms=305492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2090│CONN_LIFECYCLE: conn=843 role=brain wall_ms=1784292719856 mono_ms=305492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2091│CONN_LIFECYCLE: conn=843 role=brain wall_ms=1784292719856 mono_ms=305492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2094│CONN_LIFECYCLE: conn=845 role=brain wall_ms=1784292719953 mono_ms=305589 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2095│CONN_LIFECYCLE: conn=845 role=brain stream-subscriber stream=339 wall_ms=1784292719953 mono_ms=305589 event=stream-sub-attach stream=339 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2096│CONN_LIFECYCLE: conn=845 role=brain stream-subscriber stream=339 wall_ms=1784292719980 mono_ms=305615 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2097│CONN_LIFECYCLE: conn=846 role=brain wall_ms=1784292719980 mono_ms=305616 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2098│CONN_LIFECYCLE: conn=846 role=brain wall_ms=1784292719980 mono_ms=305616 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2104│CONN_LIFECYCLE: conn=847 role=brain wall_ms=1784292720955 mono_ms=306591 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2105│CONN_LIFECYCLE: conn=848 role=brain stream-subscriber stream=340 wall_ms=1784292720956 mono_ms=306591 event=stream-sub-attach stream=340 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2106│CONN_LIFECYCLE: conn=848 role=brain stream-subscriber stream=340 wall_ms=1784292720956 mono_ms=306591 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2107│CONN_LIFECYCLE: conn=848 role=brain stream-subscriber stream=340 wall_ms=1784292720956 mono_ms=306592 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2108│CONN_LIFECYCLE: conn=849 role=brain wall_ms=1784292720956 mono_ms=306592 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2119│CONN_LIFECYCLE: conn=852 role=brain wall_ms=1784292723464 mono_ms=309100 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2120│CONN_LIFECYCLE: conn=857 role=brain stream-subscriber stream=343 wall_ms=1784292723464 mono_ms=309100 event=stream-sub-attach stream=343 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2121│CONN_LIFECYCLE: conn=858 role=brain stream-subscriber stream=341 wall_ms=1784292723464 mono_ms=309100 event=stream-sub-attach stream=341 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2122│CONN_LIFECYCLE: conn=857 role=brain stream-subscriber stream=343 wall_ms=1784292723464 mono_ms=309100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2123│CONN_LIFECYCLE: conn=858 role=brain stream-subscriber stream=341 wall_ms=1784292723464 mono_ms=309100 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2124│CONN_LIFECYCLE: conn=855 role=brain wall_ms=1784292723465 mono_ms=309101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2125│CONN_LIFECYCLE: conn=855 role=brain stream-subscriber stream=342 wall_ms=1784292723465 mono_ms=309101 event=stream-sub-attach stream=342 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2126│CONN_LIFECYCLE: conn=856 role=brain wall_ms=1784292723467 mono_ms=309103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2127│CONN_LIFECYCLE: conn=856 role=brain stream-subscriber stream=344 wall_ms=1784292723467 mono_ms=309103 event=stream-sub-attach stream=344 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2128│CONN_LIFECYCLE: conn=856 role=brain stream-subscriber stream=344 wall_ms=1784292723470 mono_ms=309106 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2129│CONN_LIFECYCLE: conn=859 role=brain wall_ms=1784292723470 mono_ms=309106 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2130│CONN_LIFECYCLE: conn=859 role=brain wall_ms=1784292723470 mono_ms=309106 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2135│CONN_LIFECYCLE: conn=861 role=brain wall_ms=1784292725271 mono_ms=310907 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2136│CONN_LIFECYCLE: conn=862 role=brain stream-subscriber stream=345 wall_ms=1784292725271 mono_ms=310907 event=stream-sub-attach stream=345 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2137│CONN_LIFECYCLE: conn=862 role=brain stream-subscriber stream=345 wall_ms=1784292725271 mono_ms=310907 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2138│CONN_LIFECYCLE: conn=863 role=brain wall_ms=1784292726467 mono_ms=312102 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2139│CONN_LIFECYCLE: conn=863 role=brain wall_ms=1784292726467 mono_ms=312102 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2142│CONN_LIFECYCLE: conn=865 role=brain wall_ms=1784292729686 mono_ms=315322 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2143│CONN_LIFECYCLE: conn=865 role=brain stream-subscriber stream=346 wall_ms=1784292729687 mono_ms=315322 event=stream-sub-attach stream=346 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2144│CONN_LIFECYCLE: conn=865 role=brain stream-subscriber stream=346 wall_ms=1784292729705 mono_ms=315341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2145│CONN_LIFECYCLE: conn=866 role=brain wall_ms=1784292729705 mono_ms=315341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2146│CONN_LIFECYCLE: conn=866 role=brain wall_ms=1784292729705 mono_ms=315341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2149│CONN_LIFECYCLE: conn=868 role=brain wall_ms=1784292729787 mono_ms=315422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2150│CONN_LIFECYCLE: conn=868 role=brain stream-subscriber stream=348 wall_ms=1784292729787 mono_ms=315422 event=stream-sub-attach stream=348 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2151│CONN_LIFECYCLE: conn=868 role=brain stream-subscriber stream=348 wall_ms=1784292729792 mono_ms=315428 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2152│CONN_LIFECYCLE: conn=869 role=brain wall_ms=1784292729792 mono_ms=315428 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2153│CONN_LIFECYCLE: conn=869 role=brain wall_ms=1784292729792 mono_ms=315428 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2156│CONN_LIFECYCLE: conn=871 role=brain wall_ms=1784292729888 mono_ms=315523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2157│CONN_LIFECYCLE: conn=871 role=brain stream-subscriber stream=347 wall_ms=1784292729888 mono_ms=315523 event=stream-sub-attach stream=347 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2158│CONN_LIFECYCLE: conn=871 role=brain stream-subscriber stream=347 wall_ms=1784292729890 mono_ms=315526 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2159│CONN_LIFECYCLE: conn=872 role=brain wall_ms=1784292729890 mono_ms=315526 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2160│CONN_LIFECYCLE: conn=872 role=brain wall_ms=1784292729890 mono_ms=315526 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2162│CONN_LIFECYCLE: conn=873 role=brain wall_ms=1784292730789 mono_ms=316425 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2163│CONN_LIFECYCLE: conn=874 role=brain stream-subscriber stream=349 wall_ms=1784292730789 mono_ms=316425 event=stream-sub-attach stream=349 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2164│CONN_LIFECYCLE: conn=874 role=brain stream-subscriber stream=349 wall_ms=1784292730789 mono_ms=316425 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2165│CONN_LIFECYCLE: conn=875 role=brain wall_ms=1784292731498 mono_ms=317133 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2166│CONN_LIFECYCLE: conn=875 role=brain wall_ms=1784292731498 mono_ms=317134 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2192│CONN_LIFECYCLE: conn=886 role=brain wall_ms=1784292735209 mono_ms=320844 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2193│CONN_LIFECYCLE: conn=886 role=brain stream-subscriber stream=350 wall_ms=1784292735209 mono_ms=320844 event=stream-sub-attach stream=350 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2194│CONN_LIFECYCLE: conn=886 role=brain stream-subscriber stream=350 wall_ms=1784292735211 mono_ms=320847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2195│CONN_LIFECYCLE: conn=887 role=brain wall_ms=1784292735211 mono_ms=320847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2196│CONN_LIFECYCLE: conn=887 role=brain wall_ms=1784292735211 mono_ms=320847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2197│CONN_LIFECYCLE: conn=885 role=brain wall_ms=1784292735213 mono_ms=320848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2198│CONN_LIFECYCLE: conn=885 role=brain stream-subscriber stream=351 wall_ms=1784292735213 mono_ms=320849 event=stream-sub-attach stream=351 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2199│CONN_LIFECYCLE: conn=885 role=brain stream-subscriber stream=351 wall_ms=1784292735221 mono_ms=320857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2200│CONN_LIFECYCLE: conn=888 role=brain wall_ms=1784292735221 mono_ms=320857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2201│CONN_LIFECYCLE: conn=888 role=brain wall_ms=1784292735221 mono_ms=320857 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2212│CONN_LIFECYCLE: conn=895 role=brain wall_ms=1784292744841 mono_ms=330477 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2213│CONN_LIFECYCLE: conn=895 role=brain stream-subscriber stream=362 wall_ms=1784292744841 mono_ms=330477 event=stream-sub-attach stream=362 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2214│CONN_LIFECYCLE: conn=895 role=brain stream-subscriber stream=362 wall_ms=1784292744850 mono_ms=330485 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2215│CONN_LIFECYCLE: conn=897 role=brain wall_ms=1784292744850 mono_ms=330485 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2216│CONN_LIFECYCLE: conn=897 role=brain wall_ms=1784292744850 mono_ms=330485 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2217│CONN_LIFECYCLE: conn=896 role=brain wall_ms=1784292744853 mono_ms=330489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2218│CONN_LIFECYCLE: conn=896 role=brain stream-subscriber stream=364 wall_ms=1784292744853 mono_ms=330489 event=stream-sub-attach stream=364 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2219│CONN_LIFECYCLE: conn=894 role=brain wall_ms=1784292744853 mono_ms=330489 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2220│CONN_LIFECYCLE: conn=894 role=brain stream-subscriber stream=363 wall_ms=1784292744853 mono_ms=330489 event=stream-sub-attach stream=363 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2221│CONN_LIFECYCLE: conn=894 role=brain stream-subscriber stream=363 wall_ms=1784292744856 mono_ms=330491 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2222│CONN_LIFECYCLE: conn=898 role=brain wall_ms=1784292744856 mono_ms=330492 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2223│CONN_LIFECYCLE: conn=898 role=brain wall_ms=1784292744856 mono_ms=330492 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2233│CONN_LIFECYCLE: conn=904 role=brain wall_ms=1784292748453 mono_ms=334089 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2234│CONN_LIFECYCLE: conn=904 role=brain stream-subscriber stream=366 wall_ms=1784292748453 mono_ms=334089 event=stream-sub-attach stream=366 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2235│CONN_LIFECYCLE: conn=904 role=brain stream-subscriber stream=366 wall_ms=1784292748455 mono_ms=334091 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2236│CONN_LIFECYCLE: conn=905 role=brain wall_ms=1784292748455 mono_ms=334091 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2237│CONN_LIFECYCLE: conn=905 role=brain wall_ms=1784292748455 mono_ms=334091 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2238│CONN_LIFECYCLE: conn=903 role=brain wall_ms=1784292748460 mono_ms=334096 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2239│CONN_LIFECYCLE: conn=903 role=brain stream-subscriber stream=365 wall_ms=1784292748460 mono_ms=334096 event=stream-sub-attach stream=365 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2240│CONN_LIFECYCLE: conn=903 role=brain stream-subscriber stream=365 wall_ms=1784292748465 mono_ms=334101 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2241│CONN_LIFECYCLE: conn=906 role=brain wall_ms=1784292748465 mono_ms=334101 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2242│CONN_LIFECYCLE: conn=906 role=brain wall_ms=1784292748465 mono_ms=334101 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2247│CONN_LIFECYCLE: conn=910 role=brain wall_ms=1784292750058 mono_ms=335694 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2248│CONN_LIFECYCLE: conn=910 role=brain stream-subscriber stream=367 wall_ms=1784292750058 mono_ms=335694 event=stream-sub-attach stream=367 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2249│CONN_LIFECYCLE: conn=910 role=brain stream-subscriber stream=367 wall_ms=1784292750061 mono_ms=335696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2250│CONN_LIFECYCLE: conn=911 role=brain wall_ms=1784292750061 mono_ms=335696 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2251│CONN_LIFECYCLE: conn=911 role=brain wall_ms=1784292750061 mono_ms=335696 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2252│CONN_LIFECYCLE: conn=909 role=brain wall_ms=1784292750077 mono_ms=335713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2253│CONN_LIFECYCLE: conn=909 role=brain stream-subscriber stream=368 wall_ms=1784292750077 mono_ms=335713 event=stream-sub-attach stream=368 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2254│CONN_LIFECYCLE: conn=909 role=brain stream-subscriber stream=368 wall_ms=1784292750085 mono_ms=335721 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2255│CONN_LIFECYCLE: conn=912 role=brain wall_ms=1784292750085 mono_ms=335721 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2256│CONN_LIFECYCLE: conn=912 role=brain wall_ms=1784292750085 mono_ms=335721 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2266│CONN_LIFECYCLE: conn=915 role=brain wall_ms=1784292760189 mono_ms=345824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2267│CONN_LIFECYCLE: conn=916 role=brain stream-subscriber stream=374 wall_ms=1784292760189 mono_ms=345824 event=stream-sub-attach stream=374 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2268│CONN_LIFECYCLE: conn=916 role=brain stream-subscriber stream=374 wall_ms=1784292760189 mono_ms=345825 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2269│CONN_LIFECYCLE: conn=916 role=brain stream-subscriber stream=374 wall_ms=1784292760192 mono_ms=345828 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2270│CONN_LIFECYCLE: conn=917 role=brain wall_ms=1784292760192 mono_ms=345828 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2273│CONN_LIFECYCLE: conn=918 role=brain wall_ms=1784292760690 mono_ms=346326 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2274│CONN_LIFECYCLE: conn=919 role=brain stream-subscriber stream=375 wall_ms=1784292760690 mono_ms=346326 event=stream-sub-attach stream=375 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2275│CONN_LIFECYCLE: conn=919 role=brain stream-subscriber stream=375 wall_ms=1784292760691 mono_ms=346326 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2276│CONN_LIFECYCLE: conn=919 role=brain stream-subscriber stream=375 wall_ms=1784292760691 mono_ms=346326 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2277│CONN_LIFECYCLE: conn=920 role=brain wall_ms=1784292760691 mono_ms=346327 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2289│CONN_LIFECYCLE: conn=925 role=brain wall_ms=1784292761092 mono_ms=346727 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2290│CONN_LIFECYCLE: conn=927 role=brain stream-subscriber stream=380 wall_ms=1784292761092 mono_ms=346727 event=stream-sub-attach stream=380 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2291│CONN_LIFECYCLE: conn=926 role=brain wall_ms=1784292761092 mono_ms=346727 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2292│CONN_LIFECYCLE: conn=929 role=brain stream-subscriber stream=376 wall_ms=1784292761092 mono_ms=346727 event=stream-sub-attach stream=376 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2293│CONN_LIFECYCLE: conn=927 role=brain stream-subscriber stream=380 wall_ms=1784292761092 mono_ms=346727 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2294│CONN_LIFECYCLE: conn=929 role=brain stream-subscriber stream=376 wall_ms=1784292761092 mono_ms=346728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2295│CONN_LIFECYCLE: conn=932 role=brain stream-subscriber stream=378 wall_ms=1784292761092 mono_ms=346728 event=stream-sub-attach stream=378 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2296│CONN_LIFECYCLE: conn=932 role=brain stream-subscriber stream=378 wall_ms=1784292761092 mono_ms=346728 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2297│CONN_LIFECYCLE: conn=933 role=brain wall_ms=1784292761492 mono_ms=347128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2298│CONN_LIFECYCLE: conn=933 role=brain wall_ms=1784292761492 mono_ms=347128 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2299│CONN_LIFECYCLE: conn=934 role=brain stream-subscriber stream=382 wall_ms=1784292761493 mono_ms=347128 event=stream-sub-attach stream=382 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2300│CONN_LIFECYCLE: conn=934 role=brain stream-subscriber stream=382 wall_ms=1784292761493 mono_ms=347128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2301│CONN_LIFECYCLE: conn=928 role=brain wall_ms=1784292761848 mono_ms=347483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2302│CONN_LIFECYCLE: conn=928 role=brain stream-subscriber stream=381 wall_ms=1784292761848 mono_ms=347483 event=stream-sub-attach stream=381 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2303│CONN_LIFECYCLE: conn=935 role=brain wall_ms=1784292761849 mono_ms=347485 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2304│CONN_LIFECYCLE: conn=935 role=brain wall_ms=1784292761849 mono_ms=347485 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2305│CONN_LIFECYCLE: conn=927 role=brain stream-subscriber stream=380 wall_ms=1784292761850 mono_ms=347485 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2318│CONN_LIFECYCLE: conn=930 role=brain wall_ms=1784292761864 mono_ms=347499 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2319│CONN_LIFECYCLE: conn=931 role=brain stream-subscriber stream=379 wall_ms=1784292761864 mono_ms=347499 event=stream-sub-attach stream=379 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2320│CONN_LIFECYCLE: conn=930 role=brain stream-subscriber stream=377 wall_ms=1784292761864 mono_ms=347499 event=stream-sub-attach stream=377 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2321│CONN_LIFECYCLE: conn=931 role=brain stream-subscriber stream=379 wall_ms=1784292761867 mono_ms=347503 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2322│CONN_LIFECYCLE: conn=940 role=brain wall_ms=1784292761867 mono_ms=347503 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2323│CONN_LIFECYCLE: conn=940 role=brain wall_ms=1784292761867 mono_ms=347503 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2331│CONN_LIFECYCLE: conn=943 role=brain wall_ms=1784292762797 mono_ms=348433 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2332│CONN_LIFECYCLE: conn=944 role=brain stream-subscriber stream=383 wall_ms=1784292762798 mono_ms=348433 event=stream-sub-attach stream=383 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2333│CONN_LIFECYCLE: conn=944 role=brain stream-subscriber stream=383 wall_ms=1784292762798 mono_ms=348433 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2334│CONN_LIFECYCLE: conn=944 role=brain stream-subscriber stream=383 wall_ms=1784292762798 mono_ms=348434 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2335│CONN_LIFECYCLE: conn=945 role=brain wall_ms=1784292762798 mono_ms=348434 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2338│CONN_LIFECYCLE: conn=946 role=brain wall_ms=1784292762897 mono_ms=348533 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2339│CONN_LIFECYCLE: conn=947 role=brain stream-subscriber stream=384 wall_ms=1784292762898 mono_ms=348533 event=stream-sub-attach stream=384 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2340│CONN_LIFECYCLE: conn=947 role=brain stream-subscriber stream=384 wall_ms=1784292762898 mono_ms=348533 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2341│CONN_LIFECYCLE: conn=947 role=brain stream-subscriber stream=384 wall_ms=1784292762898 mono_ms=348534 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2342│CONN_LIFECYCLE: conn=948 role=brain wall_ms=1784292762898 mono_ms=348534 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2346│CONN_LIFECYCLE: conn=950 role=brain wall_ms=1784292765108 mono_ms=350744 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2347│CONN_LIFECYCLE: conn=950 role=brain stream-subscriber stream=385 wall_ms=1784292765108 mono_ms=350744 event=stream-sub-attach stream=385 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2348│CONN_LIFECYCLE: conn=950 role=brain stream-subscriber stream=385 wall_ms=1784292765111 mono_ms=350746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2349│CONN_LIFECYCLE: conn=951 role=brain wall_ms=1784292765111 mono_ms=350746 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2350│CONN_LIFECYCLE: conn=951 role=brain wall_ms=1784292765111 mono_ms=350746 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2362│CONN_LIFECYCLE: conn=957 role=brain wall_ms=1784292773031 mono_ms=358667 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2363│CONN_LIFECYCLE: conn=959 role=brain stream-subscriber stream=386 wall_ms=1784292773031 mono_ms=358667 event=stream-sub-attach stream=386 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*2364│CONN_LIFECYCLE: conn=960 role=brain stream-subscriber stream=388 wall_ms=1784292773031 mono_ms=358667 event=stream-sub-attach stream=388 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2365│CONN_LIFECYCLE: conn=959 role=brain stream-subscriber stream=386 wall_ms=1784292773031 mono_ms=358667 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2366│CONN_LIFECYCLE: conn=960 role=brain stream-subscriber stream=388 wall_ms=1784292773031 mono_ms=358667 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2367│CONN_LIFECYCLE: conn=958 role=brain wall_ms=1784292773032 mono_ms=358668 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2368│CONN_LIFECYCLE: conn=958 role=brain stream-subscriber stream=389 wall_ms=1784292773032 mono_ms=358668 event=stream-sub-attach stream=389 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2369│CONN_LIFECYCLE: conn=958 role=brain stream-subscriber stream=389 wall_ms=1784292773035 mono_ms=358670 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2370│CONN_LIFECYCLE: conn=962 role=brain wall_ms=1784292773035 mono_ms=358670 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2371│CONN_LIFECYCLE: conn=962 role=brain wall_ms=1784292773035 mono_ms=358670 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2372│CONN_LIFECYCLE: conn=961 role=brain wall_ms=1784292773044 mono_ms=358679 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2373│CONN_LIFECYCLE: conn=961 role=brain stream-subscriber stream=387 wall_ms=1784292773044 mono_ms=358679 event=stream-sub-attach stream=387 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2374│CONN_LIFECYCLE: conn=961 role=brain stream-subscriber stream=387 wall_ms=1784292773049 mono_ms=358685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2375│CONN_LIFECYCLE: conn=963 role=brain wall_ms=1784292773049 mono_ms=358685 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2376│CONN_LIFECYCLE: conn=963 role=brain wall_ms=1784292773049 mono_ms=358685 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2378│CONN_LIFECYCLE: conn=964 role=brain wall_ms=1784292773332 mono_ms=358968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2379│CONN_LIFECYCLE: conn=965 role=brain stream-subscriber stream=390 wall_ms=1784292773332 mono_ms=358968 event=stream-sub-attach stream=390 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2380│CONN_LIFECYCLE: conn=965 role=brain stream-subscriber stream=390 wall_ms=1784292773332 mono_ms=358968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2381│CONN_LIFECYCLE: conn=965 role=brain stream-subscriber stream=390 wall_ms=1784292773333 mono_ms=358968 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2382│CONN_LIFECYCLE: conn=966 role=brain wall_ms=1784292773333 mono_ms=358968 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2385│CONN_LIFECYCLE: conn=967 role=brain wall_ms=1784292773532 mono_ms=359168 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2386│CONN_LIFECYCLE: conn=968 role=brain stream-subscriber stream=391 wall_ms=1784292773533 mono_ms=359168 event=stream-sub-attach stream=391 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2387│CONN_LIFECYCLE: conn=968 role=brain stream-subscriber stream=391 wall_ms=1784292773533 mono_ms=359168 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2388│CONN_LIFECYCLE: conn=968 role=brain stream-subscriber stream=391 wall_ms=1784292773533 mono_ms=359169 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2389│CONN_LIFECYCLE: conn=969 role=brain wall_ms=1784292773533 mono_ms=359169 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2392│CONN_LIFECYCLE: conn=970 role=brain wall_ms=1784292773733 mono_ms=359368 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2393│CONN_LIFECYCLE: conn=971 role=brain stream-subscriber stream=392 wall_ms=1784292773733 mono_ms=359369 event=stream-sub-attach stream=392 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2394│CONN_LIFECYCLE: conn=971 role=brain stream-subscriber stream=392 wall_ms=1784292773733 mono_ms=359369 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2395│CONN_LIFECYCLE: conn=971 role=brain stream-subscriber stream=392 wall_ms=1784292773734 mono_ms=359369 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2396│CONN_LIFECYCLE: conn=972 role=brain wall_ms=1784292773734 mono_ms=359370 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2400│CONN_LIFECYCLE: conn=974 role=brain wall_ms=1784292775139 mono_ms=360775 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2401│CONN_LIFECYCLE: conn=974 role=brain stream-subscriber stream=393 wall_ms=1784292775139 mono_ms=360775 event=stream-sub-attach stream=393 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2402│CONN_LIFECYCLE: conn=974 role=brain stream-subscriber stream=393 wall_ms=1784292775148 mono_ms=360784 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2403│CONN_LIFECYCLE: conn=975 role=brain wall_ms=1784292775148 mono_ms=360784 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2404│CONN_LIFECYCLE: conn=975 role=brain wall_ms=1784292775148 mono_ms=360784 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2409│CONN_LIFECYCLE: conn=978 role=brain wall_ms=1784292780154 mono_ms=365790 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*2410│CONN_LIFECYCLE: conn=978 role=brain stream-subscriber stream=394 wall_ms=1784292780154 mono_ms=365790 event=stream-sub-attach stream=394 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2411│CONN_LIFECYCLE: conn=978 role=brain stream-subscriber stream=394 wall_ms=1784292780157 mono_ms=365792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2412│CONN_LIFECYCLE: conn=979 role=brain wall_ms=1784292780157 mono_ms=365793 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2413│CONN_LIFECYCLE: conn=979 role=brain wall_ms=1784292780157 mono_ms=365793 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2425│CONN_LIFECYCLE: conn=982 role=brain wall_ms=1784292781257 mono_ms=366893 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2426│CONN_LIFECYCLE: conn=983 role=brain stream-subscriber stream=395 wall_ms=1784292781258 mono_ms=366893 event=stream-sub-attach stream=395 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2427│CONN_LIFECYCLE: conn=983 role=brain stream-subscriber stream=395 wall_ms=1784292781258 mono_ms=366893 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2428│CONN_LIFECYCLE: conn=983 role=brain stream-subscriber stream=395 wall_ms=1784292781258 mono_ms=366894 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2429│CONN_LIFECYCLE: conn=984 role=brain wall_ms=1784292781258 mono_ms=366894 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2430│CONN_LIFECYCLE: conn=984 role=brain wall_ms=1784292781258 mono_ms=366894 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2431│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292781291 mono_ms=366927 event=stream-sub-attach stream=406 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2432│CONN_LIFECYCLE: conn=985 role=brain wall_ms=1784292781992 mono_ms=367627 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2433│CONN_LIFECYCLE: conn=985 role=brain wall_ms=1784292781992 mono_ms=367628 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2434│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292782130 mono_ms=367766 event=stream-sub-release stream=406 [REQ-CONN-POISON-ATTRIBUTION]\n*2435│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292782172 mono_ms=367808 event=stream-sub-attach stream=407 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2436│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292784281 mono_ms=369917 event=stream-sub-release stream=407 [REQ-CONN-POISON-ATTRIBUTION]\n*2437│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292784334 mono_ms=369969 event=stream-sub-attach stream=408 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2438│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292784701 mono_ms=370336 event=stream-sub-release stream=408 [REQ-CONN-POISON-ATTRIBUTION]","truncation":{"content":" 1023|CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1024|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1025|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1026|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n 1027|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1030|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1031|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1032|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1033|CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1034|CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1038|CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1039|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1040|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1041|CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1042|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1043|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1044|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1045|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1046|CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1047|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1048|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1049|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1050|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1053|CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1054|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1055|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1056|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1057|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1063|CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1064|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1065|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1066|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1067|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1068|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1069|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1083|CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1084|CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1085|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1086|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1087|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1088|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1094|CONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1095|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1096|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1097|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1098|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1102|CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1103|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1104|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1105|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1106|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1107|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1108|CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1111|CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1112|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1113|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1114|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1115|CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1119|CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1120|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1121|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1122|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1123|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1145|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1146|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1147|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1148|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1149|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1150|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1151|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1152|CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1154|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\n*1155|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1156|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\n*1157|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1158|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1159|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1160|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1161|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1162|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1163|CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1165|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\n*1166|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1167|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1168|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1169|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1170|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1171|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1172|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1173|CONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1174|CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1175|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1176|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1177|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1181|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\n*1182|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1183|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\n*1184|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1185|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\n*1186|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1187|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1188|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1189|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1190|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1191|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1192|CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1195|CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1196|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1197|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1198|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1199|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1201|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n*1202|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1203|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n*1204|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1205|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1206|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1207|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n*1208|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1209|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n 1210|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1211|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1214|CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1215|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1216|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1217|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1218|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1231|CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1232|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1233|CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1234|CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1235|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1236|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1237|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1242|CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1243|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1244|CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1245|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1246|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1247|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1261|CONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1262|CONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1263|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1264|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1265|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1266|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1271|CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1272|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1273|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1274|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1275|CONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1278|CONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1279|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1280|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1281|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1282|CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1285|CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1286|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1288|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1289|CONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1295|CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1296|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1297|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1298|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1299|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1300|CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1301|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1302|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1309|CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1310|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1311|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1312|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1313|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1319|CONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1320|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1321|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1322|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1323|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1324|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1325|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1326|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1338|CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342|CONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1355|CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784292601859 mono_ms=187495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1357|CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=199 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=199 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1358|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1359|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1360|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1366|CONN_LIFECYCLE: conn=546 role=brain wall_ms=1784292601959 mono_ms=187595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1367|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601959 mono_ms=187595 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1368|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601964 mono_ms=187600 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1369|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601964 mono_ms=187600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1370|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601965 mono_ms=187601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1378|CONN_LIFECYCLE: conn=551 role=brain wall_ms=1784292602560 mono_ms=188196 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1379|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1380|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1381|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1382|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1383|CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784292602561 mono_ms=188197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1384|CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=208 wall_ms=1784292602561 mono_ms=188197 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1385|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1386|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1387|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1391|CONN_LIFECYCLE: conn=555 role=brain wall_ms=1784292602569 mono_ms=188205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1392|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602569 mono_ms=188205 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1393|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1394|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1395|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1400|CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784292604768 mono_ms=190404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1401|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1402|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604771 mono_ms=190407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1404|CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784292604771 mono_ms=190407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1411|CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784292608884 mono_ms=194520 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1412|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1413|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414|CONN_LIFECYCLE: conn=567 role=brain wall_ms=1784292608885 mono_ms=194521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1415|CONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608885 mono_ms=194521 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1416|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1417|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1418|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1429|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614605 mono_ms=200241 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1430|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614613 mono_ms=200249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1431|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1432|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1441|CONN_LIFECYCLE: conn=578 role=brain wall_ms=1784292617012 mono_ms=202648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1442|CONN_LIFECYCLE: conn=578 role=brain stream-subscriber stream=215 wall_ms=1784292617012 mono_ms=202648 event=stream-sub-attach stream=215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1443|CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1444|CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1445|CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1446|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1448|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1460|CONN_LIFECYCLE: conn=586 role=brain wall_ms=1784292617614 mono_ms=203250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1461|CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617614 mono_ms=203250 event=stream-sub-attach stream=219 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1462|CONN_LIFECYCLE: conn=586 role=brain stream-subscriber stream=219 wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1463|CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1464|CONN_LIFECYCLE: conn=588 role=brain wall_ms=1784292617616 mono_ms=203252 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1465|CONN_LIFECYCLE: conn=587 role=brain wall_ms=1784292617624 mono_ms=203260 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1466|CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617624 mono_ms=203260 event=stream-sub-attach stream=218 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1467|CONN_LIFECYCLE: conn=587 role=brain stream-subscriber stream=218 wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1468|CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1469|CONN_LIFECYCLE: conn=589 role=brain wall_ms=1784292617629 mono_ms=203265 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1474|CONN_LIFECYCLE: conn=592 role=brain wall_ms=1784292623933 mono_ms=209569 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1475|CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623933 mono_ms=209569 event=stream-sub-attach stream=220 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1476|CONN_LIFECYCLE: conn=592 role=brain stream-subscriber stream=220 wall_ms=1784292623935 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1477|CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623935 mono_ms=209571 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1478|CONN_LIFECYCLE: conn=593 role=brain wall_ms=1784292623936 mono_ms=209571 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1486|CONN_LIFECYCLE: conn=597 role=brain wall_ms=1784292625838 mono_ms=211474 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1487|CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=222 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1488|CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=221 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1489|CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=stream-sub-attach stream=223 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1490|CONN_LIFECYCLE: conn=598 role=brain stream-subscriber stream=222 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1491|CONN_LIFECYCLE: conn=599 role=brain stream-subscriber stream=221 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1492|CONN_LIFECYCLE: conn=600 role=brain stream-subscriber stream=223 wall_ms=1784292625839 mono_ms=211475 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1495|CONN_LIFECYCLE: conn=602 role=brain wall_ms=1784292629652 mono_ms=215288 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1496|CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629652 mono_ms=215288 event=stream-sub-attach stream=224 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1497|CONN_LIFECYCLE: conn=602 role=brain stream-subscriber stream=224 wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1498|CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1499|CONN_LIFECYCLE: conn=603 role=brain wall_ms=1784292629661 mono_ms=215297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1513|CONN_LIFECYCLE: conn=608 role=brain wall_ms=1784292632061 mono_ms=217697 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1514|CONN_LIFECYCLE: conn=610 role=brain stream-subscriber stream=225 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=225 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1515|CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632061 mono_ms=217697 event=stream-sub-attach stream=227 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1516|CONN_LIFECYCLE: conn=608 role=brain stream-subscriber stream=227 wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1517|CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1518|CONN_LIFECYCLE: conn=611 role=brain wall_ms=1784292632067 mono_ms=217703 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1522|CONN_LIFECYCLE: conn=609 role=brain wall_ms=1784292632074 mono_ms=217710 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1523|CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632074 mono_ms=217710 event=stream-sub-attach stream=226 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1524|CONN_LIFECYCLE: conn=609 role=brain stream-subscriber stream=226 wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1525|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1526|CONN_LIFECYCLE: conn=613 role=brain wall_ms=1784292632077 mono_ms=217713 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1534|CONN_LIFECYCLE: conn=617 role=brain wall_ms=1784292632763 mono_ms=218398 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1535|CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=230 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1536|CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=stream-sub-attach stream=228 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1537|CONN_LIFECYCLE: conn=618 role=brain stream-subscriber stream=230 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1538|CONN_LIFECYCLE: conn=620 role=brain stream-subscriber stream=228 wall_ms=1784292632763 mono_ms=218399 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1539|CONN_LIFECYCLE: conn=619 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1540|CONN_LIFECYCLE: conn=621 role=brain wall_ms=1784292632764 mono_ms=218400 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1541|CONN_LIFECYCLE: conn=619 role=brain stream-subscriber stream=229 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=229 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1542|CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632764 mono_ms=218400 event=stream-sub-attach stream=231 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1543|CONN_LIFECYCLE: conn=621 role=brain stream-subscriber stream=231 wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1544|CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1545|CONN_LIFECYCLE: conn=622 role=brain wall_ms=1784292632767 mono_ms=218403 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1565|CONN_LIFECYCLE: conn=629 role=brain wall_ms=1784292634870 mono_ms=220506 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1566|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=stream-sub-attach stream=237 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1567|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1568|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634872 mono_ms=220508 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1569|CONN_LIFECYCLE: conn=631 role=brain wall_ms=1784292634873 mono_ms=220509 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1574|CONN_LIFECYCLE: conn=633 role=brain wall_ms=1784292638482 mono_ms=224118 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"bytes","totalLines":895,"totalBytes":134274,"outputLines":341,"outputBytes":51110,"lastLinePartial":false,"firstLineExceedsLimit":false},"meta":{"truncation":{"direction":"head","truncatedBy":"bytes","totalLines":895,"totalBytes":134274,"outputLines":341,"outputBytes":51110,"shownRange":{"start":1,"end":341},"nextOffset":342}}},"isError":false,"timestamp":1784292984515}}
{"type":"message","id":"f435f164","parentId":"5e528114","timestamp":"2026-07-17T12:56:24.522Z","message":{"role":"toolResult","toolCallId":"call_LCHgdWOIOg9PhOBMesLG0y7a|fc_0148993141920bab016a5a2678688081959f408520d9bf7f47","toolName":"grep","content":[{"type":"text","text":"*1000|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1001|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1002|CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1003|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1005|BRAIN_RESTART: planned update respawn (generation 1)\n 1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1007|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008|=== spt brain stderr — generation 1 — pid 76764 ===\n 1009|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n*1010|CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1011|BRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\n*1012|CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1013|CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1014|CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1015|CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1016|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n*1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1018|PUMP_IPC_READER: spawned\n 1019|PUMP_IPC_READER: spawned\n 1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n*1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1023|CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1024|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1025|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1026|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1028|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*1029|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1030|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1031|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1032|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1033|CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1034|CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1035|CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1036|CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1037|CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1038|CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1039|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1040|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1041|CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1042|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1043|CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1044|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1045|CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1046|CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1047|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1048|CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1049|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1050|CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1051|CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1052|CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1053|CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1054|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1055|CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1056|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1057|CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1058|CONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1059|CONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1060|CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1061|CONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1062|CONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1063|CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1064|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1065|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1066|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1067|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1068|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1069|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1070|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1071|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1072|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1073|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1074|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1075|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1076|PAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\n 1077|PAIR_MEET_UP:BIGNET step=59476419 id=db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca addr=EndpointAddr { id: PublicKey(db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca), addrs: {Ip(100.68.35.65:59927), Ip(192.168.1.81:59927)} }\n*1078|CONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571552 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1079|CONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1080|CONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1081|CONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1082|CONN_LIFECYCLE: conn=437 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1083|CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1084|CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1085|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1086|CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1087|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1088|CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1089|CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1090|CONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1091|CONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1092|CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1093|CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1094|CONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1095|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1096|CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1097|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1098|CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1099|CONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1100|CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1101|CONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1102|CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1103|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1104|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1105|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1106|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1107|CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1108|CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1109|CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1110|CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1111|CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1112|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1113|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1114|CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1115|CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1116|CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1117|CONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1118|CONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1119|CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1120|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1121|CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1122|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1123|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1124|CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1125|CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1126|CONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1127|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1128|CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1129|CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1130|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292576906 mono_ms=162542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1131|CONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576906 mono_ms=162543 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1132|CONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576907 mono_ms=162543 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1133|CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1134|CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1135|CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1136|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1137|CONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1138|CONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1139|CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292576913 mono_ms=162549 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1140|CONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1141|CONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1142|CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1143|CONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1144|CONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1145|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1146|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1147|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1148|CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1149|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1150|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1151|CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1152|CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1153|CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1154|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\n 1155|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1156|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\n 1157|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1158|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1159|CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1160|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1161|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1162|CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1163|CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1164|CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1165|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\n 1166|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1167|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1168|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1169|CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1170|CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1171|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1172|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1173|CONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1174|CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1175|CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1176|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1177|CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1178|CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1179|CONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1180|CONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1181|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\n 1182|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1183|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\n 1184|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1185|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\n 1186|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1187|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1188|CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1189|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1190|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1191|CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1192|CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1193|CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1194|CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1195|CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1196|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1197|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1198|CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1199|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1200|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1201|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n 1202|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1203|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n 1204|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1205|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1206|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1207|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n 1208|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1209|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n*1210|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1211|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1212|CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1213|CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1214|CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1215|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1216|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1217|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1218|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1219|CONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1220|CONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1221|CONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1222|CONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1223|CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1224|CONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1225|CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1226|CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1227|CONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1228|CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1229|CONN_LIFECYCLE: conn=493 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1230|CONN_LIFECYCLE: conn=491 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1231|CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1232|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1233|CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1234|CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1235|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1236|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1237|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1238|CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1239|CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1240|CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1241|CONN_LIFECYCLE: conn=490 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1242|CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1243|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1244|CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1245|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1246|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1247|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1248|CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1249|CONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1250|CONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1251|CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1252|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n 1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n*1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":200,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":200}],"truncated":true,"perFileLimitReached":200,"displayContent":"*1000│CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1001│CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1002│CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1003│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*1004│CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1005│BRAIN_RESTART: planned update respawn (generation 1)\n 1006│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1007│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008│=== spt brain stderr — generation 1 — pid 76764 ===\n 1009│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n*1010│CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1011│BRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\n*1012│CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1013│CONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1014│CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1015│CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1016│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n*1017│CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1018│PUMP_IPC_READER: spawned\n 1019│PUMP_IPC_READER: spawned\n 1020│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n*1021│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1022│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1023│CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1024│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1025│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1026│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1028│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n*1029│CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1030│CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1031│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1032│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1033│CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1034│CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1035│CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1036│CONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1037│CONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1038│CONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1039│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1040│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1041│CONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1042│CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1043│CONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1044│CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1045│CONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1046│CONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1047│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1048│CONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1049│CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1050│CONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1051│CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1052│CONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1053│CONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1054│CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1055│CONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1056│CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1057│CONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1058│CONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1059│CONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1060│CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1061│CONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1062│CONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1063│CONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1064│CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1065│CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1066│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1067│CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1068│CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1069│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1070│CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1071│CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1072│CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1073│CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1074│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1075│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1076│PAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\n 1077│PAIR_MEET_UP:BIGNET step=59476419 id=db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca addr=EndpointAddr { id: PublicKey(db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca), addrs: {Ip(100.68.35.65:59927), Ip(192.168.1.81:59927)} }\n*1078│CONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571552 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1079│CONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1080│CONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1081│CONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1082│CONN_LIFECYCLE: conn=437 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1083│CONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1084│CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1085│CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1086│CONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1087│CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1088│CONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1089│CONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1090│CONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1091│CONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1092│CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1093│CONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1094│CONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1095│CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1096│CONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1097│CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1098│CONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1099│CONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1100│CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1101│CONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1102│CONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1103│CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1104│CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1105│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1106│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1107│CONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1108│CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1109│CONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1110│CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1111│CONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1112│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1113│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1114│CONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1115│CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1116│CONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1117│CONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1118│CONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1119│CONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1120│CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1121│CONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1122│CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1123│CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1124│CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1125│CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1126│CONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1127│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1128│CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1129│CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1130│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292576906 mono_ms=162542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1131│CONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576906 mono_ms=162543 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1132│CONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576907 mono_ms=162543 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1133│CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1134│CONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1135│CONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1136│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1137│CONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1138│CONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1139│CONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292576913 mono_ms=162549 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1140│CONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1141│CONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1142│CONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1143│CONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1144│CONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1145│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1146│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1147│CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1148│CONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1149│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1150│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1151│CONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1152│CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1153│CONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1154│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\n 1155│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1156│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\n 1157│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1158│CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1159│CONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1160│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1161│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1162│CONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1163│CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1164│CONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1165│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\n 1166│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1167│CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1168│CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1169│CONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1170│CONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1171│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1172│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1173│CONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1174│CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1175│CONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1176│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1177│CONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1178│CONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1179│CONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1180│CONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1181│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\n 1182│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1183│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\n 1184│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1185│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\n 1186│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1187│CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1188│CONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1189│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1190│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1191│CONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1192│CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1193│CONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1194│CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1195│CONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1196│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1197│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1198│CONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1199│CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1200│CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1201│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n 1202│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1203│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n 1204│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1205│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1206│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1207│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n 1208│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1209│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n*1210│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1211│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1212│CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1213│CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1214│CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1215│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1216│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1217│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1218│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1219│CONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1220│CONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1221│CONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1222│CONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1223│CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1224│CONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1225│CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1226│CONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1227│CONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1228│CONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1229│CONN_LIFECYCLE: conn=493 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1230│CONN_LIFECYCLE: conn=491 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1231│CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1232│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1233│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1234│CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1235│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1236│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1237│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1238│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1239│CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1240│CONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1241│CONN_LIFECYCLE: conn=490 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1242│CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1243│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1244│CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1245│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1246│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1247│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1248│CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1249│CONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1250│CONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1251│CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1252│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1253│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1254│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n 1255│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n*1256│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1257│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784292984522}}
{"type":"message","id":"e303dfe0","parentId":"f435f164","timestamp":"2026-07-17T12:56:24.523Z","message":{"role":"toolResult","toolCallId":"call_OWZIauFh35skDsr05zqDKX69|fc_0148993141920bab016a5a2678688c81959bb561213939aa34","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brain.rs\n 50|    KIND_NET_SENT,\n*51|    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n 52|    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\n 53|    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n 54|    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n...\n 845|                }\n*846|                KIND_NET_STREAMS_REPLY => {\n 847|                    let ev: NetStreamsReply = serde_json::from_value(env.payload)\n 848|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 849|                    return Ok(BrokerEvent::NetStreams(ev));\n...\n 1510|    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\n*1511|    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\n*1512|        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\n 1513|        loop {\n 1514|            match self.read_event()? {\n 1515|                BrokerEvent::NetStreams(ev) => return Ok(ev),\n## broker.rs\n 65|    KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY,\n*66|    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n 67|    KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED, KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE,\n 68|    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n 69|    KIND_MET_MEMBER, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET, KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SPAWN,\n...\n 3296|                }\n*3297|                KIND_NET_STREAMS => {\n*3298|                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3299|                        send_error(&send, &msg);\n 3300|                    }\n 3301|                }\n...\n 4722|    /// brain uses to find streams that arrived while it was down.\n*4723|    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4724|        let host = self.net.get().ok_or(\"net disabled\")?;\n 4725|        // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-\n 4726|        // initiated rows never cross the IPC — the dispatcher only ever\n...\n 4730|        let frame = Envelope::new(\n*4731|            KIND_NET_STREAMS_REPLY,\n 4732|            serde_json::to_value(NetStreamsReply {\n 4733|                streams: host.dispatch_stream_infos(),\n 4734|            })"}],"details":{"scopePath":"crates/spt-daemon/src/brain.rs, crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/nethost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":9,"fileCount":2,"files":["crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":4},{"path":"crates/spt-daemon/src/broker.rs","count":5}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## brain.rs\n   50│    KIND_NET_SENT,\n  *51│    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n   52│    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\n   53│    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n   54│    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n     │...\n  845│                }\n *846│                KIND_NET_STREAMS_REPLY => {\n  847│                    let ev: NetStreamsReply = serde_json::from_value(env.payload)\n  848│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n  849│                    return Ok(BrokerEvent::NetStreams(ev));\n     │...\n 1510│    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\n*1511│    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\n*1512│        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\n 1513│        loop {\n 1514│            match self.read_event()? {\n 1515│                BrokerEvent::NetStreams(ev) => return Ok(ev),\n## broker.rs\n   65│    KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND_STALL_EVICTS_REPLY,\n  *66│    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n   67│    KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED, KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE,\n   68│    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n   69│    KIND_MET_MEMBER, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET, KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SPAWN,\n     │...\n 3296│                }\n*3297│                KIND_NET_STREAMS => {\n*3298│                    if let Err(msg) = self.dispatch_net_streams(&send) {\n 3299│                        send_error(&send, &msg);\n 3300│                    }\n 3301│                }\n     │...\n 4722│    /// brain uses to find streams that arrived while it was down.\n*4723│    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n 4724│        let host = self.net.get().ok_or(\"net disabled\")?;\n 4725│        // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-\n 4726│        // initiated rows never cross the IPC — the dispatcher only ever\n     │...\n 4730│        let frame = Envelope::new(\n*4731│            KIND_NET_STREAMS_REPLY,\n 4732│            serde_json::to_value(NetStreamsReply {\n 4733│                streams: host.dispatch_stream_infos(),\n 4734│            })"},"isError":false,"timestamp":1784292984523}}
{"type":"message","id":"4b0e2fc4","parentId":"e303dfe0","timestamp":"2026-07-17T12:56:24.539Z","message":{"role":"toolResult","toolCallId":"call_8lJ7fEID82fjrUXEAmGaW2Ox|fc_0148993141920bab016a5a2678689481959fbd7f17a224d50a","toolName":"read","content":[{"type":"text","text":"    /// cross-operator guard). That silent re-take fires NO `Displaced` notice and\n    /// ORPHANS the prior local controller (the broker stops writing its output but\n    /// does not close the conn), FREEZING the session immediately; a >15s\n    /// `stall_evict_controller` is a separate, later, output-dependent symptom\n    /// (only an actively-producing stolen session blocks long enough to evict).\n    /// That is correct for `attach` (a serve loop that WILL drive the session), but\n    /// it is why a brain-respawn must NOT resume-re-attach as Control — it would\n    /// silently STEAL every local/free controller (incl. the operator's local\n    /// `spt rc`) it never drains, freezing the session\n    /// (REQ-BRAIN-RESUME-NO-CONTROL-STEAL). [`Brain::resume_sessions`] re-attaches\n    /// as Viewer instead; Control is reserved for sessions the daemon brain drives.\n    // [doc->REQ-BRAIN-RESUME-NO-CONTROL-STEAL]\n    fn subscribe(&mut self, session_id: u64, from_seq: u64) -> io::Result<()> {\n        self.subscribe_with(session_id, from_seq, AttachIntent::Control, 0, None)\n    }\n\n    /// Release this connection's controller/viewer role on `session_id`\n    /// (REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\n    /// the viewport ends so the broker clears `driven_by` / `viewer_count`\n    /// promptly. Best-effort: a dropped connection clears the role anyway.\n    pub fn detach_session(&mut self, session_id: u64) -> io::Result<()> {\n        self.detach_session_gen(session_id, None)\n    }\n\n    /// Generation-validated release (ADR-0038 Amendment fix 6): the broker\n    /// clears the controller only if its generation still matches `gen` — a\n    /// STALE worker's late detach can never clear a replacement controller.\n    // [impl->REQ-SERVE-OWNERSHIP-GENERATION]\n    pub fn detach_session_gen(&mut self, session_id: u64, gen: Option<u64>) -> io::Result<()> {\n        self.send(\n            KIND_UNSUBSCRIBE,\n            serde_json::to_value(UnsubscribeReq { session_id, gen })\n                .expect(\"UnsubscribeReq serializes\"),\n        )\n    }\n\n    /// The role-aware subscribe (REQ-RCVIEW-1): `intent` selects viewer/control/\n    /// take, `by` carries the operator identity (`Some(node)` remote, `None`\n    /// local). The broker replies the resolved [`SubscribeOutcome`] as a\n    /// [`BrokerEvent::Subscribed`].\n    fn subscribe_with(\n        &mut self,\n        session_id: u64,\n        from_seq: u64,\n        intent: AttachIntent,\n        gen: u64,\n        by: Option<String>,\n    ) -> io::Result<()> {\n        // P1c (operator-stream boundary, kitsubito RACEDIAG): a resume-mode brain\n        // (seeded map) that subscribes from `from_seq` must RESET this session's\n        // dedup cursor to `from_seq` — the broker's replay from `from_seq` is then\n        // re-delivered (and the operator's render cursor dedups the overlap),\n        // never lost. WHY THIS, NOT just `read_event`'s `or_insert`: on a re-serve,\n        // `serve_attach` may CONSUME a handoff-replay frame at the K boundary\n        // BEFORE it is `attached` (the frame is dropped by the `if attached` gate\n        // but the snap-above cursor still advanced past K); `attach_as(sid, 0)`\n        // then re-subscribes from 0, and without this reset the broker's re-send of\n        // seq K arrives below the advanced cursor and is deduped → seq K never\n        // reaches the operator viewport → a forward gap. Resetting to `from_seq`\n        // makes the re-subscribe re-deliver everything from its floor. A cold-start\n        // brain (empty map — e.g. the production dispatch serve brain) keeps the\n        // legacy `next_seq` path; this only arms in resume mode.\n        // [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\n        if !self.session_cursors.is_empty() {\n            self.session_cursors.insert(session_id, from_seq);\n        }\n        self.send(\n            KIND_SUBSCRIBE,\n            serde_json::to_value(SubscribeReq {\n                session_id,\n                from_seq,\n                intent,\n                by,\n                gen,\n            })\n            .expect(\"SubscribeReq serializes\"),\n        )\n    }\n\n    fn send(&mut self, kind: &str, payload: serde_json::Value) -> io::Result<()> {\n        let env = Envelope::new(kind, payload);\n        match &mut self.conn {\n            BrainConn::Whole(stream) => write_frame(stream, &env),\n            BrainConn::Split { send, .. } => write_frame(send, &env),\n        }\n    }\n\n    /// Read one framed [`Envelope`], bounded by an optional wall-clock\n    /// `deadline`. The carrier dispatch (REQ-HAZARD-PUMP-IPC-DEADLINE):\n    ///\n    /// - [`BrainConn::Whole`] — the ordinary blocking client: a direct\n    ///   [`read_frame`]; `deadline` is irrelevant (a whole brain never sets\n    ///   `io_timeout`, so callers always pass `None` here).\n    /// - [`BrainConn::Split`] — the pump carrier: the reader thread already owns\n    ///   the blocking read, so a bounded read is just [`Receiver::recv_timeout`]\n    ///   on the remaining budget. A `Timeout` surfaces [`io::ErrorKind::TimedOut`]\n    ///   — the poison signal the pump escalates to a supervised restart (NEVER a\n    ///   per-peer retry). A `Disconnected` channel means the reader thread exited\n    ///   (the conn hung up); surface it as `UnexpectedEof`.\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    fn read_frame_until(&mut self, deadline: Option<Instant>) -> io::Result<Envelope> {\n        match &mut self.conn {\n            BrainConn::Whole(stream) => read_frame(stream),\n            BrainConn::Split { frames, .. } => match deadline {\n                Some(dl) => {\n                    // Total-wait bound: each recv is the REMAINING budget to the\n                    // call's entry deadline, so unrelated frames dripping in\n                    // cannot reset it (the per-read-timeout wedge the ruling\n                    // forbids). A non-positive remaining → recv_timeout(ZERO),\n                    // which still drains an already-queued frame before timing out.\n                    let remaining = dl.saturating_duration_since(Instant::now());\n                    match frames.recv_timeout(remaining) {\n                        Ok(framed) => framed,\n                        Err(RecvTimeoutError::Timeout) => Err(io::Error::new(\n                            io::ErrorKind::TimedOut,\n                            \"brain IPC read deadline elapsed\",\n                        )),\n                        Err(RecvTimeoutError::Disconnected) => Err(io::Error::new(\n                            io::ErrorKind::UnexpectedEof,\n                            \"brain IPC reader thread ended (conn closed)\",\n                        )),\n                    }\n                }\n                None => frames.recv().map_err(|_| {\n                    io::Error::new(\n…\n                    )\n                })?,\n            },\n        }\n    }\n\n[Showing lines 1779-1903 of 2370. Use :1904 to continue]"}],"details":{"truncation":{"content":"    /// cross-operator guard). That silent re-take fires NO `Displaced` notice and\r\n    /// ORPHANS the prior local controller (the broker stops writing its output but\r\n    /// does not close the conn), FREEZING the session immediately; a >15s\r\n    /// `stall_evict_controller` is a separate, later, output-dependent symptom\r\n    /// (only an actively-producing stolen session blocks long enough to evict).\r\n    /// That is correct for `attach` (a serve loop that WILL drive the session), but\r\n    /// it is why a brain-respawn must NOT resume-re-attach as Control — it would\r\n    /// silently STEAL every local/free controller (incl. the operator's local\r\n    /// `spt rc`) it never drains, freezing the session\r\n    /// (REQ-BRAIN-RESUME-NO-CONTROL-STEAL). [`Brain::resume_sessions`] re-attaches\r\n    /// as Viewer instead; Control is reserved for sessions the daemon brain drives.\r\n    // [doc->REQ-BRAIN-RESUME-NO-CONTROL-STEAL]\r\n    fn subscribe(&mut self, session_id: u64, from_seq: u64) -> io::Result<()> {\r\n        self.subscribe_with(session_id, from_seq, AttachIntent::Control, 0, None)\r\n    }\r\n\r\n    /// Release this connection's controller/viewer role on `session_id`\r\n    /// (REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\r\n    /// the viewport ends so the broker clears `driven_by` / `viewer_count`\r\n    /// promptly. Best-effort: a dropped connection clears the role anyway.\r\n    pub fn detach_session(&mut self, session_id: u64) -> io::Result<()> {\r\n        self.detach_session_gen(session_id, None)\r\n    }\r\n\r\n    /// Generation-validated release (ADR-0038 Amendment fix 6): the broker\r\n    /// clears the controller only if its generation still matches `gen` — a\r\n    /// STALE worker's late detach can never clear a replacement controller.\r\n    // [impl->REQ-SERVE-OWNERSHIP-GENERATION]\r\n    pub fn detach_session_gen(&mut self, session_id: u64, gen: Option<u64>) -> io::Result<()> {\r\n        self.send(\r\n            KIND_UNSUBSCRIBE,\r\n            serde_json::to_value(UnsubscribeReq { session_id, gen })\r\n                .expect(\"UnsubscribeReq serializes\"),\r\n        )\r\n    }\r\n\r\n    /// The role-aware subscribe (REQ-RCVIEW-1): `intent` selects viewer/control/\r\n    /// take, `by` carries the operator identity (`Some(node)` remote, `None`\r\n    /// local). The broker replies the resolved [`SubscribeOutcome`] as a\r\n    /// [`BrokerEvent::Subscribed`].\r\n    fn subscribe_with(\r\n        &mut self,\r\n        session_id: u64,\r\n        from_seq: u64,\r\n        intent: AttachIntent,\r\n        gen: u64,\r\n        by: Option<String>,\r\n    ) -> io::Result<()> {\r\n        // P1c (operator-stream boundary, kitsubito RACEDIAG): a resume-mode brain\r\n        // (seeded map) that subscribes from `from_seq` must RESET this session's\r\n        // dedup cursor to `from_seq` — the broker's replay from `from_seq` is then\r\n        // re-delivered (and the operator's render cursor dedups the overlap),\r\n        // never lost. WHY THIS, NOT just `read_event`'s `or_insert`: on a re-serve,\r\n        // `serve_attach` may CONSUME a handoff-replay frame at the K boundary\r\n        // BEFORE it is `attached` (the frame is dropped by the `if attached` gate\r\n        // but the snap-above cursor still advanced past K); `attach_as(sid, 0)`\r\n        // then re-subscribes from 0, and without this reset the broker's re-send of\r\n        // seq K arrives below the advanced cursor and is deduped → seq K never\r\n        // reaches the operator viewport → a forward gap. Resetting to `from_seq`\r\n        // makes the re-subscribe re-deliver everything from its floor. A cold-start\r\n        // brain (empty map — e.g. the production dispatch serve brain) keeps the\r\n        // legacy `next_seq` path; this only arms in resume mode.\r\n        // [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\r\n        if !self.session_cursors.is_empty() {\r\n            self.session_cursors.insert(session_id, from_seq);\r\n        }\r\n        self.send(\r\n            KIND_SUBSCRIBE,\r\n            serde_json::to_value(SubscribeReq {\r\n                session_id,\r\n                from_seq,\r\n                intent,\r\n                by,\r\n                gen,\r\n            })\r\n            .expect(\"SubscribeReq serializes\"),\r\n        )\r\n    }\r\n\r\n    fn send(&mut self, kind: &str, payload: serde_json::Value) -> io::Result<()> {\r\n        let env = Envelope::new(kind, payload);\r\n        match &mut self.conn {\r\n            BrainConn::Whole(stream) => write_frame(stream, &env),\r\n            BrainConn::Split { send, .. } => write_frame(send, &env),\r\n        }\r\n    }\r\n\r\n    /// Read one framed [`Envelope`], bounded by an optional wall-clock\r\n    /// `deadline`. The carrier dispatch (REQ-HAZARD-PUMP-IPC-DEADLINE):\r\n    ///\r\n    /// - [`BrainConn::Whole`] — the ordinary blocking client: a direct\r\n    ///   [`read_frame`]; `deadline` is irrelevant (a whole brain never sets\r\n    ///   `io_timeout`, so callers always pass `None` here).\r\n    /// - [`BrainConn::Split`] — the pump carrier: the reader thread already owns\r\n    ///   the blocking read, so a bounded read is just [`Receiver::recv_timeout`]\r\n    ///   on the remaining budget. A `Timeout` surfaces [`io::ErrorKind::TimedOut`]\r\n    ///   — the poison signal the pump escalates to a supervised restart (NEVER a\r\n    ///   per-peer retry). A `Disconnected` channel means the reader thread exited\r\n    ///   (the conn hung up); surface it as `UnexpectedEof`.\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    fn read_frame_until(&mut self, deadline: Option<Instant>) -> io::Result<Envelope> {\r\n        match &mut self.conn {\r\n            BrainConn::Whole(stream) => read_frame(stream),\r\n            BrainConn::Split { frames, .. } => match deadline {\r\n                Some(dl) => {\r\n                    // Total-wait bound: each recv is the REMAINING budget to the\r\n                    // call's entry deadline, so unrelated frames dripping in\r\n                    // cannot reset it (the per-read-timeout wedge the ruling\r\n                    // forbids). A non-positive remaining → recv_timeout(ZERO),\r\n                    // which still drains an already-queued frame before timing out.\r\n                    let remaining = dl.saturating_duration_since(Instant::now());\r\n                    match frames.recv_timeout(remaining) {\r\n                        Ok(framed) => framed,\r\n                        Err(RecvTimeoutError::Timeout) => Err(io::Error::new(\r\n                            io::ErrorKind::TimedOut,\r\n                            \"brain IPC read deadline elapsed\",\r\n                        )),\r\n                        Err(RecvTimeoutError::Disconnected) => Err(io::Error::new(\r\n                            io::ErrorKind::UnexpectedEof,\r\n                            \"brain IPC reader thread ended (conn closed)\",\r\n                        )),\r\n                    }\r\n                }\r\n                None => frames.recv().map_err(|_| {\r\n                    io::Error::new(\r","truncated":true,"truncatedBy":"lines","totalLines":592,"totalBytes":6956,"outputLines":125,"outputBytes":6956,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// cross-operator guard). That silent re-take fires NO `Displaced` notice and\r\n    /// ORPHANS the prior local controller (the broker stops writing its output but\r\n    /// does not close the conn), FREEZING the session immediately; a >15s\r\n    /// `stall_evict_controller` is a separate, later, output-dependent symptom\r\n    /// (only an actively-producing stolen session blocks long enough to evict).\r\n    /// That is correct for `attach` (a serve loop that WILL drive the session), but\r\n    /// it is why a brain-respawn must NOT resume-re-attach as Control — it would\r\n    /// silently STEAL every local/free controller (incl. the operator's local\r\n    /// `spt rc`) it never drains, freezing the session\r\n    /// (REQ-BRAIN-RESUME-NO-CONTROL-STEAL). [`Brain::resume_sessions`] re-attaches\r\n    /// as Viewer instead; Control is reserved for sessions the daemon brain drives.\r\n    // [doc->REQ-BRAIN-RESUME-NO-CONTROL-STEAL]\r\n    fn subscribe(&mut self, session_id: u64, from_seq: u64) -> io::Result<()> {\r\n        self.subscribe_with(session_id, from_seq, AttachIntent::Control, 0, None)\r\n    }\r\n\r\n    /// Release this connection's controller/viewer role on `session_id`\r\n    /// (REQ-RCVIEW-1) — the explicit detach a `serve_attach` worker sends when\r\n    /// the viewport ends so the broker clears `driven_by` / `viewer_count`\r\n    /// promptly. Best-effort: a dropped connection clears the role anyway.\r\n    pub fn detach_session(&mut self, session_id: u64) -> io::Result<()> {\r\n        self.detach_session_gen(session_id, None)\r\n    }\r\n\r\n    /// Generation-validated release (ADR-0038 Amendment fix 6): the broker\r\n    /// clears the controller only if its generation still matches `gen` — a\r\n    /// STALE worker's late detach can never clear a replacement controller.\r\n    // [impl->REQ-SERVE-OWNERSHIP-GENERATION]\r\n    pub fn detach_session_gen(&mut self, session_id: u64, gen: Option<u64>) -> io::Result<()> {\r\n        self.send(\r\n            KIND_UNSUBSCRIBE,\r\n            serde_json::to_value(UnsubscribeReq { session_id, gen })\r\n                .expect(\"UnsubscribeReq serializes\"),\r\n        )\r\n    }\r\n\r\n    /// The role-aware subscribe (REQ-RCVIEW-1): `intent` selects viewer/control/\r\n    /// take, `by` carries the operator identity (`Some(node)` remote, `None`\r\n    /// local). The broker replies the resolved [`SubscribeOutcome`] as a\r\n    /// [`BrokerEvent::Subscribed`].\r\n    fn subscribe_with(\r\n        &mut self,\r\n        session_id: u64,\r\n        from_seq: u64,\r\n        intent: AttachIntent,\r\n        gen: u64,\r\n        by: Option<String>,\r\n    ) -> io::Result<()> {\r\n        // P1c (operator-stream boundary, kitsubito RACEDIAG): a resume-mode brain\r\n        // (seeded map) that subscribes from `from_seq` must RESET this session's\r\n        // dedup cursor to `from_seq` — the broker's replay from `from_seq` is then\r\n        // re-delivered (and the operator's render cursor dedups the overlap),\r\n        // never lost. WHY THIS, NOT just `read_event`'s `or_insert`: on a re-serve,\r\n        // `serve_attach` may CONSUME a handoff-replay frame at the K boundary\r\n        // BEFORE it is `attached` (the frame is dropped by the `if attached` gate\r\n        // but the snap-above cursor still advanced past K); `attach_as(sid, 0)`\r\n        // then re-subscribes from 0, and without this reset the broker's re-send of\r\n        // seq K arrives below the advanced cursor and is deduped → seq K never\r\n        // reaches the operator viewport → a forward gap. Resetting to `from_seq`\r\n        // makes the re-subscribe re-deliver everything from its floor. A cold-start\r\n        // brain (empty map — e.g. the production dispatch serve brain) keeps the\r\n        // legacy `next_seq` path; this only arms in resume mode.\r\n        // [impl->REQ-HAZARD-CONTROLLER-WRITER-REORDER]\r\n        if !self.session_cursors.is_empty() {\r\n            self.session_cursors.insert(session_id, from_seq);\r\n        }\r\n        self.send(\r\n            KIND_SUBSCRIBE,\r\n            serde_json::to_value(SubscribeReq {\r\n                session_id,\r\n                from_seq,\r\n                intent,\r\n                by,\r\n                gen,\r\n            })\r\n            .expect(\"SubscribeReq serializes\"),\r\n        )\r\n    }\r\n\r\n    fn send(&mut self, kind: &str, payload: serde_json::Value) -> io::Result<()> {\r\n        let env = Envelope::new(kind, payload);\r\n        match &mut self.conn {\r\n            BrainConn::Whole(stream) => write_frame(stream, &env),\r\n            BrainConn::Split { send, .. } => write_frame(send, &env),\r\n        }\r\n    }\r\n\r\n    /// Read one framed [`Envelope`], bounded by an optional wall-clock\r\n    /// `deadline`. The carrier dispatch (REQ-HAZARD-PUMP-IPC-DEADLINE):\r\n    ///\r\n    /// - [`BrainConn::Whole`] — the ordinary blocking client: a direct\r\n    ///   [`read_frame`]; `deadline` is irrelevant (a whole brain never sets\r\n    ///   `io_timeout`, so callers always pass `None` here).\r\n    /// - [`BrainConn::Split`] — the pump carrier: the reader thread already owns\r\n    ///   the blocking read, so a bounded read is just [`Receiver::recv_timeout`]\r\n    ///   on the remaining budget. A `Timeout` surfaces [`io::ErrorKind::TimedOut`]\r\n    ///   — the poison signal the pump escalates to a supervised restart (NEVER a\r\n    ///   per-peer retry). A `Disconnected` channel means the reader thread exited\r\n    ///   (the conn hung up); surface it as `UnexpectedEof`.\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    fn read_frame_until(&mut self, deadline: Option<Instant>) -> io::Result<Envelope> {\r\n        match &mut self.conn {\r\n            BrainConn::Whole(stream) => read_frame(stream),\r\n            BrainConn::Split { frames, .. } => match deadline {\r\n                Some(dl) => {\r\n                    // Total-wait bound: each recv is the REMAINING budget to the\r\n                    // call's entry deadline, so unrelated frames dripping in\r\n                    // cannot reset it (the per-read-timeout wedge the ruling\r\n                    // forbids). A non-positive remaining → recv_timeout(ZERO),\r\n                    // which still drains an already-queued frame before timing out.\r\n                    let remaining = dl.saturating_duration_since(Instant::now());\r\n                    match frames.recv_timeout(remaining) {\r\n                        Ok(framed) => framed,\r\n                        Err(RecvTimeoutError::Timeout) => Err(io::Error::new(\r\n                            io::ErrorKind::TimedOut,\r\n                            \"brain IPC read deadline elapsed\",\r\n                        )),\r\n                        Err(RecvTimeoutError::Disconnected) => Err(io::Error::new(\r\n                            io::ErrorKind::UnexpectedEof,\r\n                            \"brain IPC reader thread ended (conn closed)\",\r\n                        )),\r\n                    }\r\n                }\r\n                None => frames.recv().map_err(|_| {\r\n                    io::Error::new(\r\n…\n                    )\n                })?,\n            },\n        }\n    }","startLine":1779,"lineNumbers":[1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,null,1906,1907,1908,1909,1910]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2370,"totalBytes":6956,"outputLines":125,"outputBytes":6956,"shownRange":{"start":1779,"end":1903},"nextOffset":1904}}},"isError":false,"timestamp":1784292984539}}
{"type":"message","id":"d339b5bc","parentId":"4b0e2fc4","timestamp":"2026-07-17T12:56:42.152Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing startup and failure timings**\n\n**Investigating stream table growth and retirement**"},{"type":"toolCall","id":"call_zZ8SRODiodabkapny3E4fa2M|fc_0148993141920bab016a5a268a07548195ab89fa04a18e226c","name":"read","arguments":{"i":"Reading stream enumeration filter","path":"crates/spt-daemon/src/nethost.rs","selector":"1850-1930,2050-2180"}},{"type":"toolCall","id":"call_eNMfbTPndL7UqdOsw3AFKsld|fc_0148993141920bab016a5a268a076881959581f12de267b4b4","name":"read","arguments":{"i":"Reading broker stream dispatch","path":"crates/spt-daemon/src/broker.rs","selector":"4710-4750"}},{"type":"toolCall","id":"call_M0QMeKfZRhsLHPfZXnLXhmC9|fc_0148993141920bab016a5a268a07708195b78096dfd17e6731","name":"read","arguments":{"i":"Reading net stream client call","path":"crates/spt-daemon/src/brain.rs","selector":"1495-1530"}},{"type":"toolCall","id":"call_YvtV649XsTCroX9wxhNK96ej|fc_0148993141920bab016a5a268a0778819586334d4b3d9d9e81","name":"grep","arguments":{"i":"Finding dispatcher retire implementation","pattern":"net_stream_retire|dispatch_net_stream_retire|retire_terminal|KIND_NET_STREAM_RETIRE","path":"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_VXfKnp8VSvV3FcLbNVCczV2z|fc_0148993141920bab016a5a268a07848195a1f571eac01073a1","name":"grep","arguments":{"i":"Finding one-way stream terminal source","pattern":"one.?way|terminal|finished|retire","path":"crates/spt-daemon/src/nethost.rs","selector":"1200-2300","case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_2IsL3I8aSMHDV9MDmOmAJGj4|fc_0148993141920bab016a5a268a07888195bdd6c780564661dd","name":"read","arguments":{"i":"Inspecting current stream activity tail","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"2500-2800"}},{"type":"toolCall","id":"call_K1hPOkFjHXXsNEbzic5rEK08|fc_0148993141920bab016a5a268a07948195b0347c677f03f303","name":"read","arguments":{"i":"Reading registry snapshot sizes","path":"C:/Users/decid/AppData/Local/spt-core/identity/registry","selector":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":40088,"output":772,"cacheRead":139776,"cacheWrite":0,"totalTokens":180636,"reasoningTokens":382,"cost":{"input":0.20044,"output":0.02316,"cacheRead":0.06988799999999999,"cacheWrite":0,"total":0.293488}},"stopReason":"toolUse","timestamp":1784292984591,"responseId":"resp_0148993141920bab016a5a2678cc2c8195b3ef626d2e8f4ce4","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a267a1c3c8195be95640c428c43be","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiaKTRWmGWEBE1xbkR7vzMj1FNLy3cg_WVLBeD1PFFHMkXl_ET4wcEIBDdJDBW6tKRqkGHGt0zmfOyAeeRKIb9OaDz4SjjvqhGspRTeYTA2K7-VNiQjngE7qWIwtI08oMpR0xpDSdaz4_9-xmhznRmd-rKKz2JoATRrrg2zAPXgo9VdIxnSya-w8YdjaEgwc1VNjeGSdfMS5Lin04SP5u84oRo2GSxrjsNoceKMdIy8l2aFUCnjeeH76h9dtm9J-7Dp7xh9qMULPJoDkNeq07BT7WW6P69MT6TObtaSNMtqSADCU5TGma4YvZ74chLyEVHUAakFZzbmvScxn2m5WtJTo3Mm8FW4IwU89yh3WsoVNYZVchCK_RmAcf48dX9MnsEvuDx2_cQwsq2GgLCWKWBQfzoOZnh_CmFuk6caUqj-LbVvtys0iPNnmlXF1q8uCw1OvcglL7o90Wz3tgVUjWA1ghQ9OBy5Abf1idQuzAgxWdysmCo5QVQ9lFueUf6pauwlvVfb0LQXAQovkKg19n9OF1S72TBuPqQHEwMNhiGT386NAtYqIr8KZdsVeJjvK2nP9fjhYWRRHhZHdGc39PabX127nUW8KmiW-DCk3SuthJoqHzmUpLWdrGMEwaeYQPLBVW387ZdMSm2I6hxHCGryWlXL7fHy5ngMIGLxRsAA684e31EBnDdn6JP-Dnq5RQysTXZJ9zomQgOxqzlHER1CEVMwaDJK2PmROV00HCrndo2cMKo3eDcF6txtBWs5KYfKv5hMqscn5evMKSr_LUo8n6RX23NnfS0GRNMzJDQzHm5hdlgnasAT5Nqfk6KkFeamwHvemVx6-0HpgZzRWfvOJmTrY1WiyCbYsn59RkrxF1GSxWtxDuF0YYHVwsZz1ixvLsvGULuQ0PF3cO2HyMvD3ilbDCofL-EiyvhsHBGcU-kUmbqHO5KrEwESS1qQ6IozSuf94qoWK8ZTN5ZkAvEoAc-V2bX9IeEGWf0R-AKE8GXeFD4D2F1f-do5FRbw2hbRJaeb_lycgfB5Z0eHY9UcARgk6n2tjXz-5tsflmwshZSxFpIiNQ-Yts-shksAOGSkQTu9v6cW5tFX6hrn1k5OgwSiDJhyVVDnvla9GjJ8M2W7SIVHcEUTqjKaUZ9z4qcKNYORGsFAtO24mSFnyy4OT-vlTnaJrer_PMQDcm9WM7cxndOEloALX30kbdBYNdb1shxFjyygsfxk7HAH3RZzhLSSh7Fg19TF5A7yT3qLiM6MOHPAgRCaINtdMPbY5ydpTJbVZRx-OwmQQ70WoDZuXuAnLODMrGvWa483MY_PCdAR6csHg0dqaY1Nw1F-4HT8Z03RTfcCfz9GizLmycjKuJYl5bB-dzBUmFGHRxtGaaQUkBW1vR4Tqz-rAwenRh2gv92Iu9kmaLdmkTVgI0LEaNPl_YHYWutZiStsUe5O28pG4ArlbyYBvbkRXg_bWSlVf-BCOkaKMJEMUQBewzptUyNciaxAH6bxBxIKuJOLs5vtYqNbUsSBxVamj8Zy3rVofKJQyizdFsmDFxX62NTt-R_PWdcyNoMFff4QY_s2MlbmFECP3w1ntp8mjKr_CtGmB-P0zy-4FAGj5zoiALIImcrU4XzHl-g7FfO23bxBjCjk2fJvyB01AyKWJLimcpVhxbe5gxCde_MYmiGKhB5-qxNhBB5MbaBse0Ft0xg5DVfMJ4P0LBcqIpCFW0jIiAf0_ulhb_HbfeiW9dFqSdgWwFNpc0ifdBR6ZrNsveqecCkvjC2O0wLuF-D8XMmNnmQOVxLd2SqIaTBYXZGJt21Yi35s-lvtI_7OQQOuDP9-VfAa_-b93EhIEipk00sKbVXwqGWjkz6OU47U9D4F6aXRH4dP5RhTvrpP3dCCbZjqachRsIhymJ71m4gy_OQRx9AghoDmRSLU5ncvbhyROe24xjXLb9QNn0KSoreilY8i9WSUNSfrCasK8HGJ1vY2-dSGcD6drz4-uUHjnkZNty08H7m6R8umpWm69n591nmmE0iaXxCMjyVHWbf5ZFj7Ni8ZQyOEFls9jaGnkxhMmJrD0p9EKoRgU8G6kQXfVQq8IrHIGuMFUw8Izl8tio_lOlgkUxDZRZBOn3N5o_IeYNpTCDGpg1_iQdxB424H4ruchtCm1P8O_5Xe9Q2phQNy2SRJoL07uUKZ20I1Khv_wu4QvWxaAqiNdyxPkTk9n64C3IiRABgj3fzKImLL5eQbET50YYpYC0qTQNQIeCZ7jyg9Mzke38hD9LRUKlk3DqNBX5B1oskqhH3iCZbsLY1L8A-7N6om2iasixaBuA4QolpeUs-I5V_M7I_7BHH9Xad1YAiqALUTDumGgUjSBbsEo1wASHxZ4fch8Euzt3IAd2bX2FKU5OoZMmgaoOPNdtjhhB-saqhId2TnuSYzzhwu9SJ3Cc7vKDdBbYbzwuKsTesmbGJzfNxqbVnv8MIDajSDoLh3LCcrfkg86nLfKu9364VU5jkHAa40T3qTJROb9VWxDV_JqAA5Znhknxqe6gL4BlpqAN5oKINiF-UXLi9dPljXCWV9m3RP9PzuPuAIXJWwU5sXhGXZYp89QUIAtgj87qkWHzfWcMLMGBkc3xXYdyY0AJPnxiqEmnY_MPX014mwKVV-M6V35ZKrcI2FwmSlMSq2lNpuES3eXBXl6okleEsfWWSPO17BEOJ4eoPp0SepxeJgBIPTG4MBVDM9zvJOHqOahCLKix2HeN8jnX3PKUkLOA18MarsfLryEl6rgr5poxN2uv5XNm8BRFuG01dM-009v5O68iUkKUbgSHSu2v1bxfLmwnn55g2KQ_dPzaU2VkDFQLwRwoTA_PBFxIc0oq-HZH6lsBgd2a19SlJXkdy8xFQcK--XG6QIHz73GcduZH-xlKslGE0LBJFNwxE6p4NhWVeZF6ogSMJX2hyIipUmMUqH2aRmlR54Y2LaxgPmvQhtasXEeSj7h6UCay_atLvUOaM2R_JvDYDmYO-_VJgkfuw3lzkvBGWFj3n2dS5QrVDsScSJFBoH_gCh_nclNULU147cPaQUBbLP9kT3bPUH0bjXgcZDXNuxZKrlR9Z_dB_1vIusLrmQycwK00k6GyorYALXv8yJf15EQ1jKvy2GT3RXkYOFMncPdO9KvhOHSuvGBJ8SVQzXPnnJd5-33L1Dt9lO7R11a5o1kxQCUKB4A3f-fhTOlnzXpbMNoNj1bChi7nHVg4G7LFzhAf9_PWhNfYS8DNbKcbbZMnXfXwVeu4QltrDE2Xdkc6NbCY_yiWzksKalzhsy9xSNsVN3w3MI=","summary":[{"type":"summary_text","text":"**Analyzing startup and failure timings**"},{"type":"summary_text","text":"**Investigating stream table growth and retirement**"}]},{"id":"fc_0148993141920bab016a5a268a07548195ab89fa04a18e226c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading stream enumeration filter\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1850-1930,2050-2180\"}","call_id":"call_zZ8SRODiodabkapny3E4fa2M","name":"read"},{"id":"fc_0148993141920bab016a5a268a076881959581f12de267b4b4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading broker stream dispatch\",\"path\":\"crates/spt-daemon/src/broker.rs\",\"selector\":\"4710-4750\"}","call_id":"call_eNMfbTPndL7UqdOsw3AFKsld","name":"read"},{"id":"fc_0148993141920bab016a5a268a07708195b78096dfd17e6731","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading net stream client call\",\"path\":\"crates/spt-daemon/src/brain.rs\",\"selector\":\"1495-1530\"}","call_id":"call_M0QMeKfZRhsLHPfZXnLXhmC9","name":"read"},{"id":"fc_0148993141920bab016a5a268a0778819586334d4b3d9d9e81","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding dispatcher retire implementation\",\"pattern\":\"net_stream_retire|dispatch_net_stream_retire|retire_terminal|KIND_NET_STREAM_RETIRE\",\"path\":\"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_YvtV649XsTCroX9wxhNK96ej","name":"grep"},{"id":"fc_0148993141920bab016a5a268a07848195a1f571eac01073a1","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding one-way stream terminal source\",\"pattern\":\"one.?way|terminal|finished|retire\",\"path\":\"crates/spt-daemon/src/nethost.rs\",\"selector\":\"1200-2300\",\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_VXfKnp8VSvV3FcLbNVCczV2z","name":"grep"},{"id":"fc_0148993141920bab016a5a268a07888195bdd6c780564661dd","type":"function_call","status":"completed","arguments":"{\"i\":\"Inspecting current stream activity tail\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"2500-2800\"}","call_id":"call_2IsL3I8aSMHDV9MDmOmAJGj4","name":"read"},{"id":"fc_0148993141920bab016a5a268a07948195b0347c677f03f303","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry snapshot sizes\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/registry\",\"selector\":null}","call_id":"call_K1hPOkFjHXXsNEbzic5rEK08","name":"read"}]},"duration":17557.918099999428,"ttft":1533.2123999893665,"contextSnapshot":{"promptTokens":179864,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zZ8SRODiodabkapny3E4fa2M|fc_0148993141920bab016a5a268a07548195ab89fa04a18e226c","toolName":"read","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Reading stream enumeration filter"},"id":"a644db7a","parentId":"d339b5bc","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_eNMfbTPndL7UqdOsw3AFKsld|fc_0148993141920bab016a5a268a076881959581f12de267b4b4","toolName":"read","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"crates/spt-daemon/src/broker.rs"},"intent":"Reading broker stream dispatch"},"id":"c07cd10d","parentId":"a644db7a","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_M0QMeKfZRhsLHPfZXnLXhmC9|fc_0148993141920bab016a5a268a07708195b78096dfd17e6731","toolName":"read","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"crates/spt-daemon/src/brain.rs"},"intent":"Reading net stream client call"},"id":"a7c97e96","parentId":"c07cd10d","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_YvtV649XsTCroX9wxhNK96ej|fc_0148993141920bab016a5a268a0778819586334d4b3d9d9e81","toolName":"grep","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs"},"intent":"Finding dispatcher retire implementation"},"id":"aa054f0c","parentId":"a7c97e96","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_VXfKnp8VSvV3FcLbNVCczV2z|fc_0148993141920bab016a5a268a07848195a1f571eac01073a1","toolName":"grep","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"crates/spt-daemon/src/nethost.rs"},"intent":"Finding one-way stream terminal source"},"id":"751d248a","parentId":"aa054f0c","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_2IsL3I8aSMHDV9MDmOmAJGj4|fc_0148993141920bab016a5a268a07888195bdd6c780564661dd","toolName":"read","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Inspecting current stream activity tail"},"id":"17cf8014","parentId":"751d248a","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_K1hPOkFjHXXsNEbzic5rEK08|fc_0148993141920bab016a5a268a07948195b0347c677f03f303","toolName":"read","startedAt":"2026-07-17T12:56:42.153Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/registry"},"intent":"Reading registry snapshot sizes"},"id":"4076ec10","parentId":"17cf8014","timestamp":"2026-07-17T12:56:42.153Z"}
{"type":"message","id":"cf5adb99","parentId":"4076ec10","timestamp":"2026-07-17T12:56:42.157Z","message":{"role":"toolResult","toolCallId":"call_K1hPOkFjHXXsNEbzic5rEK08|fc_0148993141920bab016a5a268a07948195b0347c677f03f303","toolName":"read","content":[{"type":"text","text":".\n  - heard.meta\n  - BIGNET.json\n  - SPT_DEV.json\n  - BS-Resources.json  7.6KB     2d ago"}],"details":{"isDirectory":true,"resolvedPath":"C:\\Users\\decid\\AppData\\Local\\spt-core\\identity\\registry","meta":{"source":{"type":"path","value":"C:\\Users\\decid\\AppData\\Local\\spt-core\\identity\\registry"}}},"isError":false,"timestamp":1784293002156}}
{"type":"message","id":"aee5fa8c","parentId":"cf5adb99","timestamp":"2026-07-17T12:56:42.160Z","message":{"role":"toolResult","toolCallId":"call_VXfKnp8VSvV3FcLbNVCczV2z|fc_0148993141920bab016a5a268a07848195a1f571eac01073a1","toolName":"grep","content":[{"type":"text","text":" 1863|    /// streams (including peer-initiated ones that arrived while it was down).\n*1864|    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\n 1865|    /// enumeration is exactly what a future dispatcher generation would replay.\n 1866|    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n 1867|        self.stream_infos_filtered(true)\n...\n 1887|            .iter()\n*1888|            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n 1889|            .filter(|(_, e)| include_local || !e.initiated_locally)\n 1890|            .map(|(id, e)| {\n 1891|                let log = e.log.lock().unwrap();\n...\n 1896|                    next_seq: log.next_seq,\n*1897|                    finished: log.finished,\n 1898|                    initiated_locally: e.initiated_locally,\n 1899|                    floor_seq: log.floor_seq(),\n 1900|                    lifetime: e.lifetime,\n...\n 1906|    /// PHYSICAL bounded-lifetime gauges (ADR-0040, KH 7.44): `(rows held,\n*1907|    /// seats installed)` — retirement-blind on purpose: these count what the\n 1908|    /// process actually retains (the resource truth the eligibility view\n 1909|    /// hides), the `net-status` additive fields and the R7 plateau seam's\n 1910|    /// observable.\n...\n 1921|\n*1922|    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\n 1923|    /// serve loop ran to completion — its exchange is over, so no future\n 1924|    /// dispatcher generation may rediscover and replay it (the control-steal\n*1925|    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n 1926|    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n 1927|    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n*1928|    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n*1929|    /// reply sends when it removed the entry (see the `retired` field note).\n 1930|    /// Physical teardown stays with the conn-close sweep. Returns whether this\n*1931|    /// call newly retired the row (idempotent; absent row = false).\n*1932|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1933|    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1934|        let Some(entry) = self\n 1935|            .shared\n 1936|            .streams\n...\n 1944|        let newly = !entry\n*1945|            .retired\n 1946|            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1947|        if newly {\n*1948|            // A retired exchange's request bytes are dead weight — free the\n 1949|            // ring; the pinned opener and cursors stay (cheap, bounded).\n*1950|            // The retire sweep also releases the SEAT (ADR-0040 decision 5):\n*1951|            // a retired exchange is never served again, so its subscriber —\n 1952|            // if the serving worker's explicit unsubscribe raced or was lost\n 1953|            // to an N-1 window — must not park a writer thread until conn\n 1954|            // close. Seat taken under the log lock, dismissed OUTSIDE it.\n...\n 1967|\n*1968|    /// TERMINAL retire (ADR-0040 decisions 1+5, REQ-ONEWAY-STREAM-TERMINAL):\n*1969|    /// eligibility retire PLUS physical teardown — the caller vouched the\n*1970|    /// exchange is over on BOTH halves (a one-way family's successful FIN, or\n 1971|    /// a requester that consumed its whole reply), so nothing can ever flush\n 1972|    /// on this row again and the eligibility-only retention rationale (the\n 1973|    /// late-reply flush ordering) does not apply. The row leaves the table,\n...\n 1978|    /// (KH 7.44 — the O(history) resource growth the hertz census measured).\n*1979|    // [impl->REQ-ONEWAY-STREAM-TERMINAL]\n 1980|    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1981|    pub fn retire_stream_terminal(&self, stream_id: u64) -> bool {\n 1982|        let Some(entry) = self.shared.streams.lock().unwrap().remove(&stream_id) else {\n 1983|            return false;\n 1984|        };\n 1985|        let newly = !entry\n*1986|            .retired\n 1987|            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1988|        // Seat teardown OUTSIDE the table lock (the join must never park a\n*1989|        // producer or another dispatch). Any seat goes — a terminal row can\n 1990|        // never be served again, so there is no newer-subscriber identity to\n 1991|        // protect (contrast the unsubscribe verb's take_seat_if).\n 1992|        let seat = entry.log.lock().unwrap().subscriber.take();\n...\n 2005|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*2006|        // A retired row answers no-such-stream: classification exists only to\n*2007|        // serve, and a retired exchange must never be served again.\n*2008|        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n 2009|            return None;\n 2010|        }\n 2011|        let line = entry.log.lock().unwrap().opener_line();\n...\n 2029|    /// may have been lagging the sender at the backpressure cap). Returns\n*2030|    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n*2031|    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n 2032|    // [impl->REQ-SHELL-4]\n 2033|    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n 2034|        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n...\n 2268|        // The BYTES are retained + drained in arrival order, framing-agnostic.\n*2269|        let (bytes, _finished) = log.drain();\n 2270|        assert_eq!(\n 2271|            bytes,\n 2272|            b\"xa-much-larger-coalesced-read-carrying-many-logical-sender-writes\".to_vec()"}],"details":{"scopePath":"crates/spt-daemon/src/nethost.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/nethost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":28,"fileCount":1,"files":["crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/nethost.rs","count":28}],"truncated":false,"displayContent":" 1863│    /// streams (including peer-initiated ones that arrived while it was down).\n*1864│    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\n 1865│    /// enumeration is exactly what a future dispatcher generation would replay.\n 1866│    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n 1867│        self.stream_infos_filtered(true)\n     │...\n 1887│            .iter()\n*1888│            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n 1889│            .filter(|(_, e)| include_local || !e.initiated_locally)\n 1890│            .map(|(id, e)| {\n 1891│                let log = e.log.lock().unwrap();\n     │...\n 1896│                    next_seq: log.next_seq,\n*1897│                    finished: log.finished,\n 1898│                    initiated_locally: e.initiated_locally,\n 1899│                    floor_seq: log.floor_seq(),\n 1900│                    lifetime: e.lifetime,\n     │...\n 1906│    /// PHYSICAL bounded-lifetime gauges (ADR-0040, KH 7.44): `(rows held,\n*1907│    /// seats installed)` — retirement-blind on purpose: these count what the\n 1908│    /// process actually retains (the resource truth the eligibility view\n 1909│    /// hides), the `net-status` additive fields and the R7 plateau seam's\n 1910│    /// observable.\n     │...\n 1921│\n*1922│    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\n 1923│    /// serve loop ran to completion — its exchange is over, so no future\n 1924│    /// dispatcher generation may rediscover and replay it (the control-steal\n*1925│    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n 1926│    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n 1927│    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n*1928│    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n*1929│    /// reply sends when it removed the entry (see the `retired` field note).\n 1930│    /// Physical teardown stays with the conn-close sweep. Returns whether this\n*1931│    /// call newly retired the row (idempotent; absent row = false).\n*1932│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1933│    pub fn retire_stream(&self, stream_id: u64) -> bool {\n 1934│        let Some(entry) = self\n 1935│            .shared\n 1936│            .streams\n     │...\n 1944│        let newly = !entry\n*1945│            .retired\n 1946│            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1947│        if newly {\n*1948│            // A retired exchange's request bytes are dead weight — free the\n 1949│            // ring; the pinned opener and cursors stay (cheap, bounded).\n*1950│            // The retire sweep also releases the SEAT (ADR-0040 decision 5):\n*1951│            // a retired exchange is never served again, so its subscriber —\n 1952│            // if the serving worker's explicit unsubscribe raced or was lost\n 1953│            // to an N-1 window — must not park a writer thread until conn\n 1954│            // close. Seat taken under the log lock, dismissed OUTSIDE it.\n     │...\n 1967│\n*1968│    /// TERMINAL retire (ADR-0040 decisions 1+5, REQ-ONEWAY-STREAM-TERMINAL):\n*1969│    /// eligibility retire PLUS physical teardown — the caller vouched the\n*1970│    /// exchange is over on BOTH halves (a one-way family's successful FIN, or\n 1971│    /// a requester that consumed its whole reply), so nothing can ever flush\n 1972│    /// on this row again and the eligibility-only retention rationale (the\n 1973│    /// late-reply flush ordering) does not apply. The row leaves the table,\n     │...\n 1978│    /// (KH 7.44 — the O(history) resource growth the hertz census measured).\n*1979│    // [impl->REQ-ONEWAY-STREAM-TERMINAL]\n 1980│    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1981│    pub fn retire_stream_terminal(&self, stream_id: u64) -> bool {\n 1982│        let Some(entry) = self.shared.streams.lock().unwrap().remove(&stream_id) else {\n 1983│            return false;\n 1984│        };\n 1985│        let newly = !entry\n*1986│            .retired\n 1987│            .swap(true, std::sync::atomic::Ordering::SeqCst);\n 1988│        // Seat teardown OUTSIDE the table lock (the join must never park a\n*1989│        // producer or another dispatch). Any seat goes — a terminal row can\n 1990│        // never be served again, so there is no newer-subscriber identity to\n 1991│        // protect (contrast the unsubscribe verb's take_seat_if).\n 1992│        let seat = entry.log.lock().unwrap().subscriber.take();\n     │...\n 2005│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n*2006│        // A retired row answers no-such-stream: classification exists only to\n*2007│        // serve, and a retired exchange must never be served again.\n*2008│        if entry.retired.load(std::sync::atomic::Ordering::SeqCst) {\n 2009│            return None;\n 2010│        }\n 2011│        let line = entry.log.lock().unwrap().opener_line();\n     │...\n 2029│    /// may have been lagging the sender at the backpressure cap). Returns\n*2030│    /// `(bytes, finished)`; `finished` ⇒ the read side ended (the poller closes).\n*2031│    /// `None` ⇒ no such stream. Empty bytes + `finished == false` ⇒ nothing pending.\n 2032│    // [impl->REQ-SHELL-4]\n 2033│    pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {\n 2034│        let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);\n     │...\n 2268│        // The BYTES are retained + drained in arrival order, framing-agnostic.\n*2269│        let (bytes, _finished) = log.drain();\n 2270│        assert_eq!(\n 2271│            bytes,\n 2272│            b\"xa-much-larger-coalesced-read-carrying-many-logical-sender-writes\".to_vec()"},"isError":false,"timestamp":1784293002160}}
{"type":"message","id":"e1066255","parentId":"aee5fa8c","timestamp":"2026-07-17T12:56:42.162Z","message":{"role":"toolResult","toolCallId":"call_YvtV649XsTCroX9wxhNK96ej|fc_0148993141920bab016a5a268a0778819586334d4b3d9d9e81","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brain.rs\n 52|    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\n*53|    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n 54|    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n 55|    KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,\n 56|    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n...\n 1528|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1529|    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n*1530|        self.net_stream_retire_with(stream_id, false)\n 1531|    }\n 1532|\n 1533|    /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical\n...\n 1540|    // [impl->REQ-ONEWAY-STREAM-TERMINAL]\n*1541|    pub fn net_stream_retire_terminal(&mut self, stream_id: u64) -> io::Result<bool> {\n*1542|        self.net_stream_retire_with(stream_id, true)\n 1543|    }\n 1544|\n*1545|    fn net_stream_retire_with(&mut self, stream_id: u64, terminal: bool) -> io::Result<bool> {\n 1546|        self.send(\n*1547|            KIND_NET_STREAM_RETIRE,\n 1548|            serde_json::to_value(NetStreamRetireReq {\n 1549|                stream_id,\n 1550|                terminal,\n...\n 1555|            match self.read_event()? {\n*1556|                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1557|                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1558|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1559|                    return Ok(reply.removed);\n## broker.rs\n 66|    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n*67|    KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED, KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE,\n 68|    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n 69|    KIND_MET_MEMBER, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET, KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SPAWN,\n 70|    KIND_SPAWNED, KIND_SPAWN_CONFLICT, KIND_SPAWN_FRESH, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n...\n 3301|                }\n*3302|                KIND_NET_STREAM_RETIRE => {\n*3303|                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n 3304|                        send_error(&send, &msg);\n 3305|                    }\n 3306|                }\n...\n 4770|    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*4771|    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4772|        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4773|            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4774|        let host = self.net.get().ok_or(\"net disabled\")?;\n...\n 4784|        let frame = Envelope::new(\n*4785|            KIND_NET_STREAM_RETIRED,\n 4786|            serde_json::to_value(NetStreamRetired {\n 4787|                stream_id: req.stream_id,\n 4788|                removed,"}],"details":{"scopePath":"crates/spt-daemon/src/brain.rs, crates/spt-daemon/src/broker.rs, crates/spt-daemon/src/nethost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":13,"fileCount":2,"files":["crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":8},{"path":"crates/spt-daemon/src/broker.rs","count":5}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## brain.rs\n   52│    KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,\n  *53│    KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,\n   54│    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n   55│    KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,\n   56│    KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,\n     │...\n 1528│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*1529│    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n*1530│        self.net_stream_retire_with(stream_id, false)\n 1531│    }\n 1532│\n 1533│    /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical\n     │...\n 1540│    // [impl->REQ-ONEWAY-STREAM-TERMINAL]\n*1541│    pub fn net_stream_retire_terminal(&mut self, stream_id: u64) -> io::Result<bool> {\n*1542│        self.net_stream_retire_with(stream_id, true)\n 1543│    }\n 1544│\n*1545│    fn net_stream_retire_with(&mut self, stream_id: u64, terminal: bool) -> io::Result<bool> {\n 1546│        self.send(\n*1547│            KIND_NET_STREAM_RETIRE,\n 1548│            serde_json::to_value(NetStreamRetireReq {\n 1549│                stream_id,\n 1550│                terminal,\n     │...\n 1555│            match self.read_event()? {\n*1556│                BrokerEvent::Other(env) if env.kind == KIND_NET_STREAM_RETIRED => {\n 1557│                    let reply: NetStreamRetired = serde_json::from_value(env.payload)\n 1558│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 1559│                    return Ok(reply.removed);\n## broker.rs\n   66│    KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,\n  *67│    KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED, KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE,\n   68│    KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,\n   69│    KIND_MET_MEMBER, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET, KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SPAWN,\n   70│    KIND_SPAWNED, KIND_SPAWN_CONFLICT, KIND_SPAWN_FRESH, KIND_SUBSCRIBE, KIND_UNSUBSCRIBE,\n     │...\n 3301│                }\n*3302│                KIND_NET_STREAM_RETIRE => {\n*3303│                    if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {\n 3304│                        send_error(&send, &msg);\n 3305│                    }\n 3306│                }\n     │...\n 4770│    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n*4771│    fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n 4772│        let req: NetStreamRetireReq = serde_json::from_value(env.payload)\n 4773│            .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;\n 4774│        let host = self.net.get().ok_or(\"net disabled\")?;\n     │...\n 4784│        let frame = Envelope::new(\n*4785│            KIND_NET_STREAM_RETIRED,\n 4786│            serde_json::to_value(NetStreamRetired {\n 4787│                stream_id: req.stream_id,\n 4788│                removed,"},"isError":false,"timestamp":1784293002161}}
{"type":"message","id":"1128ba7b","parentId":"e1066255","timestamp":"2026-07-17T12:56:42.180Z","message":{"role":"toolResult","toolCallId":"call_zZ8SRODiodabkapny3E4fa2M|fc_0148993141920bab016a5a268a07548195ab89fa04a18e226c","toolName":"read","content":[{"type":"text","text":"    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n…\n    }\n\n    /// A stream's serve lease (ADR-0038 Amendment fix 4) — the cancellation\n    /// handle the DAEMON-LIFECYCLE C2 work consumes. `None` = no such stream.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\n        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .get(&stream_id)\n            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n    }\n\n    /// Every held stream's info — the query a re-attaching brain uses to find\n    /// streams (including peer-initiated ones that arrived while it was down).\n    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\n    /// enumeration is exactly what a future dispatcher generation would replay.\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n        self.stream_infos_filtered(true)\n    }\n\n    /// The DISPATCH enumeration (ADR-0040 decision 2,\n    /// REQ-STREAM-INFOS-SERVER-FILTER): `stream_infos` with\n    /// `initiated_locally` rows excluded SERVER-SIDE, before any clone or\n    /// serialization — the wire (`net-streams`) serves this, so the\n    /// dispatcher's every-100ms poll never pays O(local history) IPC merely\n    /// to skip its own node's rows client-side. The dispatcher keeps its\n    /// client-side guard (double-filter harmless, N-1 compatible both ways).\n    /// In-process introspection (tests, the loopback-pair diff) keeps the\n    /// unfiltered [`Self::stream_infos`].\n    // [impl->REQ-STREAM-INFOS-SERVER-FILTER]\n    pub fn dispatch_stream_infos(&self) -> Vec<NetStreamInfo> {\n        self.stream_infos_filtered(false)\n    }\n\n    fn stream_infos_filtered(&self, include_local: bool) -> Vec<NetStreamInfo> {\n        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .filter(|(_, e)| include_local || !e.initiated_locally)\n            .map(|(id, e)| {\n                let log = e.log.lock().unwrap();\n                NetStreamInfo {\n                    stream_id: *id,\n                    conn_id: e.conn_id,\n                    remote_id_hex: e.remote_id_hex.clone(),\n                    next_seq: log.next_seq,\n                    finished: log.finished,\n                    initiated_locally: e.initiated_locally,\n                    floor_seq: log.floor_seq(),\n                    lifetime: e.lifetime,\n                }\n            })\n            .collect()\n    }\n\n    /// PHYSICAL bounded-lifetime gauges (ADR-0040, KH 7.44): `(rows held,\n    /// seats installed)` — retirement-blind on purpose: these count what the\n    /// process actually retains (the resource truth the eligibility view\n    /// hides), the `net-status` additive fields and the R7 plateau seam's\n    /// observable.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    pub fn stream_counts(&self) -> (u64, u64) {\n        let streams = self.shared.streams.lock().unwrap();\n        let rows = streams.len() as u64;\n        let seats = streams\n            .values()\n            .filter(|e| e.log.lock().unwrap().subscriber.is_some())\n            .count() as u64;\n        (rows, seats)\n    }\n\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\n    /// serve loop ran to completion — its exchange is over, so no future\n    /// dispatcher generation may rediscover and replay it (the control-steal\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n    /// reply sends when it removed the entry (see the `retired` field note).\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\n…\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n…\n            .map(|e| e.log.lock().unwrap().ring.len())\n    }\n\n    /// Inbound (peer-initiated) stream rows currently held on `conn_id` — the\n    /// candidate set [`Self::open_loopback_pair`] diffs to find the peer it just\n    /// minted.\n    fn inbound_rows_on(&self, conn_id: u64) -> HashSet<u64> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .iter()\n            .filter(|(_, e)| e.conn_id == conn_id && !e.initiated_locally)\n            .map(|(id, _)| *id)\n            .collect()\n    }\n\n    /// Open a same-node loopback tunnel stream PAIR (M11-W3, REQ-SHELL-4) and\n    /// return `(owner_stream, shell_stream)` — the operator row the owner side\n    /// drives and the cross-wired peer row the shell side drives. The loopback\n    /// `open_stream` mints both rows in-process (one `duplex` wires them, so a\n    /// write to either send appears on the other's read log). Serialized so the\n    /// before/after diff sees exactly the one peer row this open minted.\n    // [impl->REQ-SHELL-4]\n    pub fn open_loopback_pair(&self) -> io::Result<(u64, u64)> {\n        let _guard = self.loopback_pair_lock.lock().unwrap();\n        let (conn_id, _) = self.dial_loopback();\n        let before = self.inbound_rows_on(conn_id);\n        let owner_stream = self.open_stream(conn_id, crate::msg::StreamLifetime::Durable)?;\n        let shell_stream = self\n            .inbound_rows_on(conn_id)\n            .difference(&before)\n            .copied()\n            .next()\n            .ok_or_else(|| io::Error::other(\"loopback peer row not registered\"))?;\n        Ok((owner_stream, shell_stream))\n    }\n\n    /// Attach `sub` as a stream's read subscriber, replaying from `from_seq`\n    /// (gapless resume — the PTY `subscribe` discipline on a QUIC stream).\n    // [impl->REQ-DAEMON-2]\n    pub(crate) fn subscribe_stream(\n        &self,\n        stream_id: u64,\n        sub: SharedSend,\n        from_seq: u64,\n    ) -> io::Result<()> {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            let e = streams.get(&stream_id).ok_or_else(|| {\n                io::Error::new(\n                    io::ErrorKind::NotFound,\n                    format!(\"no such stream {stream_id}\"),\n                )\n            })?;\n            Arc::clone(&e.log)\n        };\n        // Install the seat WITH its replay snapshot in one atomic critical\n        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\n        // handoff is a memory move; the seat's writer thread performs every\n        // conn write outside the mutex, replay first, live after — so a\n        // producer appending concurrently can never slot a live frame into\n        // the middle of the replay (the \"got seq 134 want 6\" re-serve red).\n        // A replay write failure poisons the seat writer-side; the next\n        // producer enqueue halt-and-removes it (the T1 discipline).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\n        Ok(())\n    }\n\n    /// Explicitly release `sub`'s subscriber seat on a stream (ADR-0040\n    /// decision 5, REQ-SEAT-LIFETIME-BOUNDED — the `net-stream-unsubscribe`\n    /// verb's engine): identity-checked take under the log lock (a caller can\n    /// only release its OWN seat, never a newer subscriber's — the detach_if\n    /// discipline), then the seat's writer thread is stopped AND JOINED\n    /// outside every lock. Idempotent; `false` = no seat / someone else's\n    /// seat / no such stream (all tolerated).\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    pub(crate) fn unsubscribe_stream(&self, stream_id: u64, sub: &SharedSend) -> bool {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n        };\n        let Some(log) = log else {\n            return false;\n        };\n        let seat = log.lock().unwrap().take_seat_if(sub);\n        match seat {\n            Some(seat) => {\n                sub.lifecycle_event(\"stream-sub-release\", &format!(\"stream={stream_id}\"));\n                seat.dismiss();\n                true\n            }\n            None => false,\n        }\n    }\n\n    /// Detach `sub` from a stream iff it is the current subscriber (brain\n    /// disconnect cleanup; the stream + its ring persist).\n    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n        };\n        if let Some(log) = log {\n            log.lock().unwrap().detach_if(sub);\n        }\n    }\n\n    /// Attach `sub` as the presence subscriber, replaying liveness events from\n    /// `from_seq` (D4c) — the stream `subscribe` discipline on the conn table.\n    // [impl->REQ-EP-4]\n    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\n        // Same atomic install-with-replay discipline as subscribe_stream\n        // (the PresenceLog mirror): the seat's writer drains the replay\n        // before any live event, conn I/O outside the mutex. A replay write\n        // failure poisons the seat; the next push halt-and-removes it — the\n        // brain re-subscribes from its cursor.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        let _ = self\n            .shared\n            .presence\n            .lock()\n            .unwrap()\n            .begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before\n    }\n\n    /// Detach `sub` from presence iff it is the current subscriber (brain\n    /// disconnect cleanup; the log + its ring persist).\n    pub(crate) fn detach_presence_sub(&self, sub: &SharedSend) {\n        self.shared.presence.lock().unwrap().detach_if(sub);\n    }"}],"details":{"displayContent":{"text":"    pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {\n…\n    }\n\n    /// A stream's serve lease (ADR-0038 Amendment fix 4) — the cancellation\n    /// handle the DAEMON-LIFECYCLE C2 work consumes. `None` = no such stream.\n    // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n    pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {\n        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .get(&stream_id)\n            .map(|e| Arc::clone(&e.log.lock().unwrap().lease))\n    }\n\n    /// Every held stream's info — the query a re-attaching brain uses to find\n    /// streams (including peer-initiated ones that arrived while it was down).\n    /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this\n    /// enumeration is exactly what a future dispatcher generation would replay.\n    pub fn stream_infos(&self) -> Vec<NetStreamInfo> {\n        self.stream_infos_filtered(true)\n    }\n\n    /// The DISPATCH enumeration (ADR-0040 decision 2,\n    /// REQ-STREAM-INFOS-SERVER-FILTER): `stream_infos` with\n    /// `initiated_locally` rows excluded SERVER-SIDE, before any clone or\n    /// serialization — the wire (`net-streams`) serves this, so the\n    /// dispatcher's every-100ms poll never pays O(local history) IPC merely\n    /// to skip its own node's rows client-side. The dispatcher keeps its\n    /// client-side guard (double-filter harmless, N-1 compatible both ways).\n    /// In-process introspection (tests, the loopback-pair diff) keeps the\n    /// unfiltered [`Self::stream_infos`].\n    // [impl->REQ-STREAM-INFOS-SERVER-FILTER]\n    pub fn dispatch_stream_infos(&self) -> Vec<NetStreamInfo> {\n        self.stream_infos_filtered(false)\n    }\n\n    fn stream_infos_filtered(&self, include_local: bool) -> Vec<NetStreamInfo> {\n        let streams = self.shared.streams.lock().unwrap();\n        streams\n            .iter()\n            .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))\n            .filter(|(_, e)| include_local || !e.initiated_locally)\n            .map(|(id, e)| {\n                let log = e.log.lock().unwrap();\n                NetStreamInfo {\n                    stream_id: *id,\n                    conn_id: e.conn_id,\n                    remote_id_hex: e.remote_id_hex.clone(),\n                    next_seq: log.next_seq,\n                    finished: log.finished,\n                    initiated_locally: e.initiated_locally,\n                    floor_seq: log.floor_seq(),\n                    lifetime: e.lifetime,\n                }\n            })\n            .collect()\n    }\n\n    /// PHYSICAL bounded-lifetime gauges (ADR-0040, KH 7.44): `(rows held,\n    /// seats installed)` — retirement-blind on purpose: these count what the\n    /// process actually retains (the resource truth the eligibility view\n    /// hides), the `net-status` additive fields and the R7 plateau seam's\n    /// observable.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    pub fn stream_counts(&self) -> (u64, u64) {\n        let streams = self.shared.streams.lock().unwrap();\n        let rows = streams.len() as u64;\n        let seats = streams\n            .values()\n            .filter(|e| e.log.lock().unwrap().subscriber.is_some())\n            .count() as u64;\n        (rows, seats)\n    }\n\n    /// Retire a stream row (ADR-0038 A): the dispatcher reports a stream whose\n    /// serve loop ran to completion — its exchange is over, so no future\n    /// dispatcher generation may rediscover and replay it (the control-steal\n    /// hazard). Retirement is ELIGIBILITY-VISIBILITY, not teardown: the row is\n    /// hidden from [`stream_infos`](Self::stream_infos) and the opener query\n    /// and its ring is freed, but the entry (send half, subscriber, pump) stays\n    /// alive so an in-flight reply always flushes — retire raced fire-and-forget\n    /// reply sends when it removed the entry (see the `retired` field note).\n    /// Physical teardown stays with the conn-close sweep. Returns whether this\n…\n    fn ring_len(&self, stream_id: u64) -> Option<usize> {\n        self.shared\n…\n            .map(|e| e.log.lock().unwrap().ring.len())\n    }\n\n    /// Inbound (peer-initiated) stream rows currently held on `conn_id` — the\n    /// candidate set [`Self::open_loopback_pair`] diffs to find the peer it just\n    /// minted.\n    fn inbound_rows_on(&self, conn_id: u64) -> HashSet<u64> {\n        self.shared\n            .streams\n            .lock()\n            .unwrap()\n            .iter()\n            .filter(|(_, e)| e.conn_id == conn_id && !e.initiated_locally)\n            .map(|(id, _)| *id)\n            .collect()\n    }\n\n    /// Open a same-node loopback tunnel stream PAIR (M11-W3, REQ-SHELL-4) and\n    /// return `(owner_stream, shell_stream)` — the operator row the owner side\n    /// drives and the cross-wired peer row the shell side drives. The loopback\n    /// `open_stream` mints both rows in-process (one `duplex` wires them, so a\n    /// write to either send appears on the other's read log). Serialized so the\n    /// before/after diff sees exactly the one peer row this open minted.\n    // [impl->REQ-SHELL-4]\n    pub fn open_loopback_pair(&self) -> io::Result<(u64, u64)> {\n        let _guard = self.loopback_pair_lock.lock().unwrap();\n        let (conn_id, _) = self.dial_loopback();\n        let before = self.inbound_rows_on(conn_id);\n        let owner_stream = self.open_stream(conn_id, crate::msg::StreamLifetime::Durable)?;\n        let shell_stream = self\n            .inbound_rows_on(conn_id)\n            .difference(&before)\n            .copied()\n            .next()\n            .ok_or_else(|| io::Error::other(\"loopback peer row not registered\"))?;\n        Ok((owner_stream, shell_stream))\n    }\n\n    /// Attach `sub` as a stream's read subscriber, replaying from `from_seq`\n    /// (gapless resume — the PTY `subscribe` discipline on a QUIC stream).\n    // [impl->REQ-DAEMON-2]\n    pub(crate) fn subscribe_stream(\n        &self,\n        stream_id: u64,\n        sub: SharedSend,\n        from_seq: u64,\n    ) -> io::Result<()> {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            let e = streams.get(&stream_id).ok_or_else(|| {\n                io::Error::new(\n                    io::ErrorKind::NotFound,\n                    format!(\"no such stream {stream_id}\"),\n                )\n            })?;\n            Arc::clone(&e.log)\n        };\n        // Install the seat WITH its replay snapshot in one atomic critical\n        // section (ADR-0038 Amendment fix 3, gate follow-up): the snapshot\n        // handoff is a memory move; the seat's writer thread performs every\n        // conn write outside the mutex, replay first, live after — so a\n        // producer appending concurrently can never slot a live frame into\n        // the middle of the replay (the \"got seq 134 want 6\" re-serve red).\n        // A replay write failure poisons the seat writer-side; the next\n        // producer enqueue halt-and-removes it (the T1 discipline).\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        log.lock().unwrap().begin_attach(Arc::clone(&sub), from_seq)?;\n        Ok(())\n    }\n\n    /// Explicitly release `sub`'s subscriber seat on a stream (ADR-0040\n    /// decision 5, REQ-SEAT-LIFETIME-BOUNDED — the `net-stream-unsubscribe`\n    /// verb's engine): identity-checked take under the log lock (a caller can\n    /// only release its OWN seat, never a newer subscriber's — the detach_if\n    /// discipline), then the seat's writer thread is stopped AND JOINED\n    /// outside every lock. Idempotent; `false` = no seat / someone else's\n    /// seat / no such stream (all tolerated).\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    pub(crate) fn unsubscribe_stream(&self, stream_id: u64, sub: &SharedSend) -> bool {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n        };\n        let Some(log) = log else {\n            return false;\n        };\n        let seat = log.lock().unwrap().take_seat_if(sub);\n        match seat {\n            Some(seat) => {\n                sub.lifecycle_event(\"stream-sub-release\", &format!(\"stream={stream_id}\"));\n                seat.dismiss();\n                true\n            }\n            None => false,\n        }\n    }\n\n    /// Detach `sub` from a stream iff it is the current subscriber (brain\n    /// disconnect cleanup; the stream + its ring persist).\n    pub(crate) fn detach_stream_sub(&self, stream_id: u64, sub: &SharedSend) {\n        let log = {\n            let streams = self.shared.streams.lock().unwrap();\n            streams.get(&stream_id).map(|e| Arc::clone(&e.log))\n        };\n        if let Some(log) = log {\n            log.lock().unwrap().detach_if(sub);\n        }\n    }\n\n    /// Attach `sub` as the presence subscriber, replaying liveness events from\n    /// `from_seq` (D4c) — the stream `subscribe` discipline on the conn table.\n    // [impl->REQ-EP-4]\n    pub(crate) fn subscribe_presence(&self, sub: SharedSend, from_seq: u64) {\n        // Same atomic install-with-replay discipline as subscribe_stream\n        // (the PresenceLog mirror): the seat's writer drains the replay\n        // before any live event, conn I/O outside the mutex. A replay write\n        // failure poisons the seat; the next push halt-and-removes it — the\n        // brain re-subscribes from its cursor.\n        // [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]\n        let _ = self\n            .shared\n            .presence\n            .lock()\n            .unwrap()\n            .begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before\n    }\n\n    /// Detach `sub` from presence iff it is the current subscriber (brain\n    /// disconnect cleanup; the log + its ring persist).\n    pub(crate) fn detach_presence_sub(&self, sub: &SharedSend) {\n        self.shared.presence.lock().unwrap().detach_if(sub);\n    }","startLine":1816,"lineNumbers":[1816,null,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,null,2044,2045,null,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\nethost.rs"}}},"isError":false,"timestamp":1784293002180}}
{"type":"message","id":"1bcfbb81","parentId":"1128ba7b","timestamp":"2026-07-17T12:56:42.203Z","message":{"role":"toolResult","toolCallId":"call_M0QMeKfZRhsLHPfZXnLXhmC9|fc_0148993141920bab016a5a268a07708195b78096dfd17e6731","toolName":"read","content":[{"type":"text","text":"    pub fn net_stream_send(\n…\n    ) -> io::Result<Option<NetSent>> {\n        self.send(\n…\n        )?;\n        if op.is_none() {\n            return Ok(None);\n        }\n        let want_seq = op.map(|o| o.seq);\n        let deadline = self.call_deadline();\n        loop {\n            match self.read_event_until(deadline)? {\n                BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// List the streams the broker holds (D4b) — how a re-attaching brain\n    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\n    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\n        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\n        loop {\n            match self.read_event()? {\n                BrokerEvent::NetStreams(ev) => return Ok(ev),\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\n                _ => continue,\n            }\n        }\n    }\n\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A).\n    /// The dispatcher calls this when a serve loop runs to completion, so no\n    /// future dispatcher generation rediscovers and replays the stream\n    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\n    /// answers `error` (KH-2.3 N-1 window — retirement then waits for the\n    /// broker to cycle onto the new binary).\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\n    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\n        self.net_stream_retire_with(stream_id, false)\n    }\n\n    /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical\n\n[Showing lines 1494-1533 of 2370. Use :1534 to continue]"}],"details":{"truncation":{"content":"        )?;\r\n        if op.is_none() {\r\n            return Ok(None);\r\n        }\r\n        let want_seq = op.map(|o| o.seq);\r\n        let deadline = self.call_deadline();\r\n        loop {\r\n            match self.read_event_until(deadline)? {\r\n                BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),\r\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\r\n                _ => continue,\r\n            }\r\n        }\r\n    }\r\n\r\n    /// List the streams the broker holds (D4b) — how a re-attaching brain\r\n    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\r\n    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\r\n        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\r\n        loop {\r\n            match self.read_event()? {\r\n                BrokerEvent::NetStreams(ev) => return Ok(ev),\r\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\r\n                _ => continue,\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A).\r\n    /// The dispatcher calls this when a serve loop runs to completion, so no\r\n    /// future dispatcher generation rediscovers and replays the stream\r\n    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\r\n    /// answers `error` (KH-2.3 N-1 window — retirement then waits for the\r\n    /// broker to cycle onto the new binary).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\r\n        self.net_stream_retire_with(stream_id, false)\r\n    }\r\n\r\n    /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical\r","truncated":true,"truncatedBy":"lines","totalLines":877,"totalBytes":1764,"outputLines":40,"outputBytes":1764,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn net_stream_send(\n…\n    ) -> io::Result<Option<NetSent>> {\n        self.send(\n…\n        )?;\r\n        if op.is_none() {\r\n            return Ok(None);\r\n        }\r\n        let want_seq = op.map(|o| o.seq);\r\n        let deadline = self.call_deadline();\r\n        loop {\r\n            match self.read_event_until(deadline)? {\r\n                BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),\r\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\r\n                _ => continue,\r\n            }\r\n        }\r\n    }\r\n\r\n    /// List the streams the broker holds (D4b) — how a re-attaching brain\r\n    /// finds streams (incl. peer-initiated ones) that arrived while it was down.\r\n    pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {\r\n        self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;\r\n        loop {\r\n            match self.read_event()? {\r\n                BrokerEvent::NetStreams(ev) => return Ok(ev),\r\n                BrokerEvent::Error { message } => return Err(io::Error::other(message)),\r\n                _ => continue,\r\n            }\r\n        }\r\n    }\r\n\r\n    /// Retire a completed stream row from redispatch eligibility (ADR-0038 A).\r\n    /// The dispatcher calls this when a serve loop runs to completion, so no\r\n    /// future dispatcher generation rediscovers and replays the stream\r\n    /// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker\r\n    /// answers `error` (KH-2.3 N-1 window — retirement then waits for the\r\n    /// broker to cycle onto the new binary).\r\n    // [impl->REQ-REDISPATCH-FINISHED-RETIRE]\r\n    pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {\r\n        self.net_stream_retire_with(stream_id, false)\r\n    }\r\n\r\n    /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical\r","startLine":1477,"lineNumbers":[1477,null,1483,1484,null,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brain.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2370,"totalBytes":1764,"outputLines":40,"outputBytes":1764,"shownRange":{"start":1494,"end":1533},"nextOffset":1534}}},"isError":false,"timestamp":1784293002203}}
{"type":"message","id":"19c87ed6","parentId":"1bcfbb81","timestamp":"2026-07-17T12:56:42.245Z","message":{"role":"toolResult","toolCallId":"call_eNMfbTPndL7UqdOsw3AFKsld|fc_0148993141920bab016a5a268a076881959581f12de267b4b4","toolName":"read","content":[{"type":"text","text":"    fn dispatch_net_stream_send(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n…\n        match req.op_id {\n…\n            Some(op) => {\n…\n                let frame = Envelope::new(\n…\n                    serde_json::to_value(NetSent {\n                        stream_id: req.stream_id,\n                        op_id: op,\n                        applied_now: outcome == Outcome::Applied,\n                    })\n                    .expect(\"NetSent serializes\"),\n                );\n                send_frame(send, &frame);\n                Ok(())\n            }\n        }\n    }\n\n    /// List every stream the broker holds (D4b) — the query a re-attaching\n    /// brain uses to find streams that arrived while it was down.\n    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-\n        // initiated rows never cross the IPC — the dispatcher only ever\n        // skipped them client-side, and serializing the full local history\n        // every 100ms poll was the O(history) enumeration cost of KH 7.44.\n        // [impl->REQ-STREAM-INFOS-SERVER-FILTER]\n        let frame = Envelope::new(\n            KIND_NET_STREAMS_REPLY,\n            serde_json::to_value(NetStreamsReply {\n                streams: host.dispatch_stream_infos(),\n            })\n            .expect(\"NetStreamsReply serializes\"),\n        );\n        send_frame(send, &frame);\n        Ok(())\n    }\n\n    /// Release the calling connection's subscriber seat on a stream (ADR-0040\n    /// decision 5) — seat removed, writer thread stopped and joined, cursor\n    /// dropped caller-side. Identity-checked: only the caller's own seat.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    fn dispatch_net_stream_unsubscribe(\n        &self,\n        env: Envelope,\n        send: &SharedSend,\n    ) -> Result<u64, String> {\n        let req: NetStreamUnsubscribeReq = serde_json::from_value(env.payload)\n            .map_err(|e| format!(\"bad net-stream-unsubscribe payload: {e}\"))?;\n        let host = self.net.get().ok_or(\"net disabled\")?;\n        let removed = host.unsubscribe_stream(req.stream_id, send);\n…\n    }\n\n[Showing lines 4709-4753 of 6771. Use :4754 to continue]"}],"details":{"truncation":{"content":"                        stream_id: req.stream_id,\r\n                        op_id: op,\r\n                        applied_now: outcome == Outcome::Applied,\r\n                    })\r\n                    .expect(\"NetSent serializes\"),\r\n                );\r\n                send_frame(send, &frame);\r\n                Ok(())\r\n            }\r\n        }\r\n    }\r\n\r\n    /// List every stream the broker holds (D4b) — the query a re-attaching\r\n    /// brain uses to find streams that arrived while it was down.\r\n    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\r\n        let host = self.net.get().ok_or(\"net disabled\")?;\r\n        // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-\r\n        // initiated rows never cross the IPC — the dispatcher only ever\r\n        // skipped them client-side, and serializing the full local history\r\n        // every 100ms poll was the O(history) enumeration cost of KH 7.44.\r\n        // [impl->REQ-STREAM-INFOS-SERVER-FILTER]\r\n        let frame = Envelope::new(\r\n            KIND_NET_STREAMS_REPLY,\r\n            serde_json::to_value(NetStreamsReply {\r\n                streams: host.dispatch_stream_infos(),\r\n            })\r\n            .expect(\"NetStreamsReply serializes\"),\r\n        );\r\n        send_frame(send, &frame);\r\n        Ok(())\r\n    }\r\n\r\n    /// Release the calling connection's subscriber seat on a stream (ADR-0040\r\n    /// decision 5) — seat removed, writer thread stopped and joined, cursor\r\n    /// dropped caller-side. Identity-checked: only the caller's own seat.\r\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\r\n    fn dispatch_net_stream_unsubscribe(\r\n        &self,\r\n        env: Envelope,\r\n        send: &SharedSend,\r\n    ) -> Result<u64, String> {\r\n        let req: NetStreamUnsubscribeReq = serde_json::from_value(env.payload)\r\n            .map_err(|e| format!(\"bad net-stream-unsubscribe payload: {e}\"))?;\r\n        let host = self.net.get().ok_or(\"net disabled\")?;\r\n        let removed = host.unsubscribe_stream(req.stream_id, send);\r","truncated":true,"truncatedBy":"lines","totalLines":2063,"totalBytes":2020,"outputLines":45,"outputBytes":2020,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn dispatch_net_stream_send(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {\n…\n        match req.op_id {\n…\n            Some(op) => {\n…\n                let frame = Envelope::new(\n…\n                    serde_json::to_value(NetSent {\n                        stream_id: req.stream_id,\r\n                        op_id: op,\r\n                        applied_now: outcome == Outcome::Applied,\r\n                    })\r\n                    .expect(\"NetSent serializes\"),\r\n                );\r\n                send_frame(send, &frame);\r\n                Ok(())\r\n            }\r\n        }\r\n    }\r\n\r\n    /// List every stream the broker holds (D4b) — the query a re-attaching\r\n    /// brain uses to find streams that arrived while it was down.\r\n    fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {\r\n        let host = self.net.get().ok_or(\"net disabled\")?;\r\n        // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-\r\n        // initiated rows never cross the IPC — the dispatcher only ever\r\n        // skipped them client-side, and serializing the full local history\r\n        // every 100ms poll was the O(history) enumeration cost of KH 7.44.\r\n        // [impl->REQ-STREAM-INFOS-SERVER-FILTER]\r\n        let frame = Envelope::new(\r\n            KIND_NET_STREAMS_REPLY,\r\n            serde_json::to_value(NetStreamsReply {\r\n                streams: host.dispatch_stream_infos(),\r\n            })\r\n            .expect(\"NetStreamsReply serializes\"),\r\n        );\r\n        send_frame(send, &frame);\r\n        Ok(())\r\n    }\r\n\r\n    /// Release the calling connection's subscriber seat on a stream (ADR-0040\r\n    /// decision 5) — seat removed, writer thread stopped and joined, cursor\r\n    /// dropped caller-side. Identity-checked: only the caller's own seat.\r\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\r\n    fn dispatch_net_stream_unsubscribe(\r\n        &self,\r\n        env: Envelope,\r\n        send: &SharedSend,\r\n    ) -> Result<u64, String> {\r\n        let req: NetStreamUnsubscribeReq = serde_json::from_value(env.payload)\r\n            .map_err(|e| format!(\"bad net-stream-unsubscribe payload: {e}\"))?;\r\n        let host = self.net.get().ok_or(\"net disabled\")?;\r\n        let removed = host.unsubscribe_stream(req.stream_id, send);\r\n…\n    }","startLine":4683,"lineNumbers":[4683,null,4689,null,4693,null,4706,null,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,4750,4751,4752,4753,null,4764]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\broker.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":6771,"totalBytes":2020,"outputLines":45,"outputBytes":2020,"shownRange":{"start":4709,"end":4753},"nextOffset":4754}}},"isError":false,"timestamp":1784293002245}}
{"type":"message","id":"23eee793","parentId":"19c87ed6","timestamp":"2026-07-17T12:56:42.291Z","message":{"role":"toolResult","toolCallId":"call_2IsL3I8aSMHDV9MDmOmAJGj4|fc_0148993141920bab016a5a268a07888195bdd6c780564661dd","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain wall_ms=1784292795304 mono_ms=380939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795304 mono_ms=380939 event=stream-sub-attach stream=419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795306 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387758 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=425 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784292802429 mono_ms=388065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802429 mono_ms=388065 event=stream-sub-attach stream=430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802431 mono_ms=388066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802436 mono_ms=388071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain wall_ms=1784292803232 mono_ms=388867 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803232 mono_ms=388867 event=stream-sub-attach stream=432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803235 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803243 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803243 mono_ms=388879 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803244 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain wall_ms=1784292803246 mono_ms=388881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803246 mono_ms=388881 event=stream-sub-attach stream=434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain wall_ms=1784292805339 mono_ms=390974 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805339 mono_ms=390975 event=stream-sub-attach stream=435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain wall_ms=1784292810352 mono_ms=395988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810352 mono_ms=395988 event=stream-sub-attach stream=436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:BIGNET step=59476427 id=82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718 addr=EndpointAddr { id: PublicKey(82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718), addrs: {Ip(100.68.35.65:49474), Ip(192.168.1.81:49474)} }\nPAIR_MEET_UP:SPT_DEV step=59476427 id=4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8 addr=EndpointAddr { id: PublicKey(4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8), addrs: {Ip(100.68.35.65:49476), Ip(192.168.1.81:49476)} }\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain wall_ms=1784292817576 mono_ms=403212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817576 mono_ms=403212 event=stream-sub-attach stream=437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain wall_ms=1784292817578 mono_ms=403213 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817578 mono_ms=403213 event=stream-sub-attach stream=438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain wall_ms=1784292817578 mono_ms=403214 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817578 mono_ms=403214 event=stream-sub-attach stream=439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817584 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=stream-sub-attach stream=440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain wall_ms=1784292820385 mono_ms=406021 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820385 mono_ms=406021 event=stream-sub-attach stream=441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822191 mono_ms=407827 event=stream-sub-attach stream=442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407828 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=stream-sub-attach stream=443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain wall_ms=1784292825303 mono_ms=410938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825303 mono_ms=410938 event=stream-sub-attach stream=444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain wall_ms=1784292828213 mono_ms=413848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828213 mono_ms=413848 event=stream-sub-attach stream=445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain wall_ms=1784292828221 mono_ms=413857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828221 mono_ms=413857 event=stream-sub-attach stream=446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828224 mono_ms=413859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292828359 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292828362 mono_ms=413997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833830 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=457 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=459 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain wall_ms=1784292833831 mono_ms=419467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833831 mono_ms=419467 event=stream-sub-attach stream=462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833834 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=458 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=460 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833837 mono_ms=419473 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833847 mono_ms=419482 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=stream-sub-attach stream=463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=stream-sub-attach stream=464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420066 event=stream-sub-attach stream=465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=stream-sub-attach stream=466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=stream-sub-attach stream=467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain wall_ms=1784292835436 mono_ms=421071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835436 mono_ms=421071 event=stream-sub-attach stream=468 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain wall_ms=1784292840352 mono_ms=425988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840352 mono_ms=425988 event=stream-sub-attach stream=469 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476428 id=5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b addr=EndpointAddr { id: PublicKey(5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b), addrs: {Ip(100.68.35.65:60363), Ip(192.168.1.81:60363)} }\nPAIR_MEET_UP:BIGNET step=59476428 id=1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902 addr=EndpointAddr { id: PublicKey(1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902), addrs: {Ip(100.68.35.65:60362), Ip(192.168.1.81:60362)} }\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=stream-sub-attach stream=470 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=471 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=472 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain wall_ms=1784292843265 mono_ms=428900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain stream-subscriber stream=473 wall_ms=1784292843265 mono_ms=428900 event=stream-sub-attach stream=473 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 2499-2803 of 3774. Use :2804 to continue]"}],"details":{"truncation":{"content":"CONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain wall_ms=1784292795304 mono_ms=380939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795304 mono_ms=380939 event=stream-sub-attach stream=419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795306 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387758 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=425 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784292802429 mono_ms=388065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802429 mono_ms=388065 event=stream-sub-attach stream=430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802431 mono_ms=388066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802436 mono_ms=388071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain wall_ms=1784292803232 mono_ms=388867 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803232 mono_ms=388867 event=stream-sub-attach stream=432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803235 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803243 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803243 mono_ms=388879 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803244 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain wall_ms=1784292803246 mono_ms=388881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803246 mono_ms=388881 event=stream-sub-attach stream=434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain wall_ms=1784292805339 mono_ms=390974 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805339 mono_ms=390975 event=stream-sub-attach stream=435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain wall_ms=1784292810352 mono_ms=395988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810352 mono_ms=395988 event=stream-sub-attach stream=436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:BIGNET step=59476427 id=82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718 addr=EndpointAddr { id: PublicKey(82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718), addrs: {Ip(100.68.35.65:49474), Ip(192.168.1.81:49474)} }\nPAIR_MEET_UP:SPT_DEV step=59476427 id=4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8 addr=EndpointAddr { id: PublicKey(4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8), addrs: {Ip(100.68.35.65:49476), Ip(192.168.1.81:49476)} }\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain wall_ms=1784292817576 mono_ms=403212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817576 mono_ms=403212 event=stream-sub-attach stream=437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain wall_ms=1784292817578 mono_ms=403213 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817578 mono_ms=403213 event=stream-sub-attach stream=438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain wall_ms=1784292817578 mono_ms=403214 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817578 mono_ms=403214 event=stream-sub-attach stream=439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817584 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=stream-sub-attach stream=440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain wall_ms=1784292820385 mono_ms=406021 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820385 mono_ms=406021 event=stream-sub-attach stream=441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822191 mono_ms=407827 event=stream-sub-attach stream=442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407828 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=stream-sub-attach stream=443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain wall_ms=1784292825303 mono_ms=410938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825303 mono_ms=410938 event=stream-sub-attach stream=444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain wall_ms=1784292828213 mono_ms=413848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828213 mono_ms=413848 event=stream-sub-attach stream=445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain wall_ms=1784292828221 mono_ms=413857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828221 mono_ms=413857 event=stream-sub-attach stream=446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828224 mono_ms=413859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292828359 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292828362 mono_ms=413997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833830 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=457 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=459 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain wall_ms=1784292833831 mono_ms=419467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833831 mono_ms=419467 event=stream-sub-attach stream=462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833834 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=458 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=460 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833837 mono_ms=419473 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833847 mono_ms=419482 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=stream-sub-attach stream=463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=stream-sub-attach stream=464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420066 event=stream-sub-attach stream=465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=stream-sub-attach stream=466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=stream-sub-attach stream=467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain wall_ms=1784292835436 mono_ms=421071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835436 mono_ms=421071 event=stream-sub-attach stream=468 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain wall_ms=1784292840352 mono_ms=425988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840352 mono_ms=425988 event=stream-sub-attach stream=469 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476428 id=5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b addr=EndpointAddr { id: PublicKey(5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b), addrs: {Ip(100.68.35.65:60363), Ip(192.168.1.81:60363)} }\nPAIR_MEET_UP:BIGNET step=59476428 id=1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902 addr=EndpointAddr { id: PublicKey(1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902), addrs: {Ip(100.68.35.65:60362), Ip(192.168.1.81:60362)} }\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=stream-sub-attach stream=470 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=471 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=472 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain wall_ms=1784292843265 mono_ms=428900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain stream-subscriber stream=473 wall_ms=1784292843265 mono_ms=428900 event=stream-sub-attach stream=473 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":1276,"totalBytes":45997,"outputLines":305,"outputBytes":45997,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"CONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain wall_ms=1784292795304 mono_ms=380939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795304 mono_ms=380939 event=stream-sub-attach stream=419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795306 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1014 role=brain wall_ms=1784292795307 mono_ms=380942 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1015 role=brain wall_ms=1784292797089 mono_ms=382724 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387758 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1016 role=brain wall_ms=1784292802123 mono_ms=387759 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1017 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1018 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1020 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1019 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1022 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1021 role=brain wall_ms=1784292802428 mono_ms=388063 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=425 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=429 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388063 event=stream-sub-attach stream=427 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802428 mono_ms=388064 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain wall_ms=1784292802429 mono_ms=388065 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802429 mono_ms=388065 event=stream-sub-attach stream=430 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1025 role=brain stream-subscriber stream=429 wall_ms=1784292802431 mono_ms=388066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1029 role=brain wall_ms=1784292802431 mono_ms=388067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1024 role=brain stream-subscriber stream=425 wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1030 role=brain wall_ms=1784292802433 mono_ms=388069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain wall_ms=1784292802434 mono_ms=388069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=426 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802434 mono_ms=388069 event=stream-sub-attach stream=428 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1026 role=brain stream-subscriber stream=427 wall_ms=1784292802436 mono_ms=388071 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1031 role=brain wall_ms=1784292802436 mono_ms=388072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1023 role=brain stream-subscriber stream=430 wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1032 role=brain wall_ms=1784292802446 mono_ms=388081 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1027 role=brain stream-subscriber stream=426 wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1033 role=brain wall_ms=1784292802449 mono_ms=388084 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1028 role=brain stream-subscriber stream=428 wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1034 role=brain wall_ms=1784292802451 mono_ms=388087 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1035 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1036 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1037 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1038 role=brain wall_ms=1784292803230 mono_ms=388866 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=433 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=stream-sub-attach stream=431 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803231 mono_ms=388866 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain wall_ms=1784292803232 mono_ms=388867 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803232 mono_ms=388867 event=stream-sub-attach stream=432 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1041 role=brain stream-subscriber stream=433 wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1043 role=brain wall_ms=1784292803233 mono_ms=388869 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1042 role=brain stream-subscriber stream=431 wall_ms=1784292803235 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1044 role=brain wall_ms=1784292803236 mono_ms=388871 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1039 role=brain stream-subscriber stream=432 wall_ms=1784292803243 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803243 mono_ms=388879 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1045 role=brain wall_ms=1784292803244 mono_ms=388879 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain wall_ms=1784292803246 mono_ms=388881 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803246 mono_ms=388881 event=stream-sub-attach stream=434 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1040 role=brain stream-subscriber stream=434 wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1046 role=brain wall_ms=1784292803248 mono_ms=388884 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1047 role=brain wall_ms=1784292805338 mono_ms=390973 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain wall_ms=1784292805339 mono_ms=390974 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805339 mono_ms=390975 event=stream-sub-attach stream=435 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1048 role=brain stream-subscriber stream=435 wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain wall_ms=1784292810352 mono_ms=395988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810352 mono_ms=395988 event=stream-sub-attach stream=436 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1052 role=brain stream-subscriber stream=436 wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1053 role=brain wall_ms=1784292810355 mono_ms=395991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:BIGNET step=59476427 id=82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718 addr=EndpointAddr { id: PublicKey(82272e1aba7bfc29f2dc46dd7fa8e224d2014ff101e0d0b84ae208c596b99718), addrs: {Ip(100.68.35.65:49474), Ip(192.168.1.81:49474)} }\nPAIR_MEET_UP:SPT_DEV step=59476427 id=4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8 addr=EndpointAddr { id: PublicKey(4b97e27c1344ead6ba581669a70062835319feec6bed313547d3256ed51252f8), addrs: {Ip(100.68.35.65:49476), Ip(192.168.1.81:49476)} }\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1054 role=brain wall_ms=1784292812188 mono_ms=397824 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1055 role=brain wall_ms=1784292817223 mono_ms=402858 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1056 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1057 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1058 role=brain wall_ms=1784292817575 mono_ms=403210 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain wall_ms=1784292817576 mono_ms=403212 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817576 mono_ms=403212 event=stream-sub-attach stream=437 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain wall_ms=1784292817578 mono_ms=403213 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817578 mono_ms=403213 event=stream-sub-attach stream=438 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain wall_ms=1784292817578 mono_ms=403214 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817578 mono_ms=403214 event=stream-sub-attach stream=439 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1061 role=brain stream-subscriber stream=438 wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1062 role=brain wall_ms=1784292817581 mono_ms=403216 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1060 role=brain stream-subscriber stream=439 wall_ms=1784292817584 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1063 role=brain wall_ms=1784292817585 mono_ms=403220 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1059 role=brain stream-subscriber stream=437 wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1064 role=brain wall_ms=1784292817587 mono_ms=403222 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1065 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1066 role=brain wall_ms=1784292820384 mono_ms=406020 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=stream-sub-attach stream=440 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292820385 mono_ms=406020 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain wall_ms=1784292820385 mono_ms=406021 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820385 mono_ms=406021 event=stream-sub-attach stream=441 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1067 role=brain stream-subscriber stream=441 wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1069 role=brain wall_ms=1784292820394 mono_ms=406029 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407826 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1070 role=brain wall_ms=1784292822191 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822191 mono_ms=407827 event=stream-sub-attach stream=442 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1071 role=brain stream-subscriber stream=442 wall_ms=1784292822192 mono_ms=407827 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407827 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1072 role=brain wall_ms=1784292822192 mono_ms=407828 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1073 role=brain wall_ms=1784292822256 mono_ms=407891 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1074 role=brain wall_ms=1784292822492 mono_ms=408127 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=stream-sub-attach stream=443 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292822492 mono_ms=408128 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1076 role=brain wall_ms=1784292825301 mono_ms=410937 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain wall_ms=1784292825303 mono_ms=410938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825303 mono_ms=410938 event=stream-sub-attach stream=444 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1077 role=brain stream-subscriber stream=444 wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1078 role=brain wall_ms=1784292825305 mono_ms=410941 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1079 role=brain wall_ms=1784292827292 mono_ms=412927 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1080 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1081 role=brain wall_ms=1784292828211 mono_ms=413847 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain wall_ms=1784292828213 mono_ms=413848 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828213 mono_ms=413848 event=stream-sub-attach stream=445 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1083 role=brain stream-subscriber stream=445 wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1084 role=brain wall_ms=1784292828218 mono_ms=413853 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain wall_ms=1784292828221 mono_ms=413857 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828221 mono_ms=413857 event=stream-sub-attach stream=446 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1082 role=brain stream-subscriber stream=446 wall_ms=1784292828224 mono_ms=413859 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1085 role=brain wall_ms=1784292828224 mono_ms=413860 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1075 role=brain stream-subscriber stream=443 wall_ms=1784292828359 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1086 role=brain wall_ms=1784292828360 mono_ms=413995 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1068 role=brain stream-subscriber stream=440 wall_ms=1784292828362 mono_ms=413997 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1087 role=brain wall_ms=1784292828362 mono_ms=413998 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1088 role=brain wall_ms=1784292832323 mono_ms=417958 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1089 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1091 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1090 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1092 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1093 role=brain wall_ms=1784292833829 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833829 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1094 role=brain wall_ms=1784292833830 mono_ms=419465 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=457 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=461 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=stream-sub-attach stream=459 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833830 mono_ms=419465 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain wall_ms=1784292833831 mono_ms=419467 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833831 mono_ms=419467 event=stream-sub-attach stream=462 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1096 role=brain stream-subscriber stream=457 wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1101 role=brain wall_ms=1784292833833 mono_ms=419468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1099 role=brain stream-subscriber stream=461 wall_ms=1784292833834 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1102 role=brain wall_ms=1784292833835 mono_ms=419470 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=458 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain wall_ms=1784292833837 mono_ms=419472 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833837 mono_ms=419472 event=stream-sub-attach stream=460 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833837 mono_ms=419473 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1100 role=brain stream-subscriber stream=459 wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1103 role=brain wall_ms=1784292833838 mono_ms=419473 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1097 role=brain stream-subscriber stream=460 wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1104 role=brain wall_ms=1784292833844 mono_ms=419479 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1095 role=brain stream-subscriber stream=462 wall_ms=1784292833847 mono_ms=419482 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1105 role=brain wall_ms=1784292833847 mono_ms=419483 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1098 role=brain stream-subscriber stream=458 wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1106 role=brain wall_ms=1784292833861 mono_ms=419496 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1107 role=brain wall_ms=1784292834030 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=stream-sub-attach stream=463 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1108 role=brain stream-subscriber stream=463 wall_ms=1784292834031 mono_ms=419666 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1109 role=brain wall_ms=1784292834031 mono_ms=419667 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1110 role=brain wall_ms=1784292834130 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=stream-sub-attach stream=464 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1111 role=brain stream-subscriber stream=464 wall_ms=1784292834131 mono_ms=419766 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1112 role=brain wall_ms=1784292834131 mono_ms=419767 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1113 role=brain wall_ms=1784292834431 mono_ms=420066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420066 event=stream-sub-attach stream=465 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834431 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1114 role=brain stream-subscriber stream=465 wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1115 role=brain wall_ms=1784292834432 mono_ms=420067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1116 role=brain wall_ms=1784292834632 mono_ms=420267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=stream-sub-attach stream=466 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1117 role=brain stream-subscriber stream=466 wall_ms=1784292834632 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1118 role=brain wall_ms=1784292834633 mono_ms=420268 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1119 role=brain wall_ms=1784292834832 mono_ms=420468 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=stream-sub-attach stream=467 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420468 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1120 role=brain stream-subscriber stream=467 wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1121 role=brain wall_ms=1784292834833 mono_ms=420469 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1122 role=brain wall_ms=1784292835435 mono_ms=421070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain wall_ms=1784292835436 mono_ms=421071 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835436 mono_ms=421071 event=stream-sub-attach stream=468 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1123 role=brain stream-subscriber stream=468 wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1124 role=brain wall_ms=1784292835444 mono_ms=421080 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1125 role=brain wall_ms=1784292837356 mono_ms=422991 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1126 role=brain wall_ms=1784292840351 mono_ms=425987 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain wall_ms=1784292840352 mono_ms=425988 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840352 mono_ms=425988 event=stream-sub-attach stream=469 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1127 role=brain stream-subscriber stream=469 wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1128 role=brain wall_ms=1784292840355 mono_ms=425990 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476428 id=5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b addr=EndpointAddr { id: PublicKey(5e907fe95e11f759a437c2f1952e6e441db92b44966dffc6f76eb0e5da6ce11b), addrs: {Ip(100.68.35.65:60363), Ip(192.168.1.81:60363)} }\nPAIR_MEET_UP:BIGNET step=59476428 id=1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902 addr=EndpointAddr { id: PublicKey(1b1f82e2b603219067b4f36f5c442c62fda627624a3777dbc4f2ac0f6b022902), addrs: {Ip(100.68.35.65:60362), Ip(192.168.1.81:60362)} }\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1129 role=brain wall_ms=1784292841757 mono_ms=427392 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=stream-sub-attach stream=470 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1130 role=brain stream-subscriber stream=470 wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1131 role=brain wall_ms=1784292841758 mono_ms=427393 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1132 role=brain wall_ms=1784292842388 mono_ms=428023 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1133 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1134 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1135 role=brain wall_ms=1784292843263 mono_ms=428899 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=471 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=472 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain wall_ms=1784292843265 mono_ms=428900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=1137 role=brain stream-subscriber stream=473 wall_ms=1784292843265 mono_ms=428900 event=stream-sub-attach stream=473 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]","startLine":2499,"lineNumbers":[2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":3774,"totalBytes":45997,"outputLines":305,"outputBytes":45997,"shownRange":{"start":2499,"end":2803},"nextOffset":2804}}},"isError":false,"timestamp":1784293002291}}
{"type":"message","id":"9576e720","parentId":"23eee793","timestamp":"2026-07-17T12:57:04.877Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Parsing log timings for cause**"},{"type":"toolCall","id":"call_uqJascqOJHRknhcWja67awuD|fc_0148993141920bab016a5a26a0cef08195bd9b1124b219dc9a","name":"grep","arguments":{"i":"Locating CPU sample evidence","pattern":"8\\.39|6\\.44|28\\.1|63\\.91|HFENDULEAM|bursty|24/90|27/90","path":".claude;docs;C:/Users/decid/AppData/Local/spt-core","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_4L49vNKCS0d3KvcDjHYaGrwq|fc_0148993141920bab016a5a26a0cf0081959a9e0e1da28e106c","name":"grep","arguments":{"i":"Finding net status gauges","pattern":"stream_rows|stream_seats|NetStatusReply|stream_counts","path":"crates/spt-daemon/src;crates/spt/src","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_9EEJBWozGJ6lHtZvvandz4lL|fc_0148993141920bab016a5a26a0cf088195a9ab9b746dad17e7","name":"grep","arguments":{"i":"Finding status gauge output","pattern":"stream_rows|stream_seats|net_stream|rows held|seats","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_mnmJdlBl2QRZfEFtqSAPwqAt|fc_0148993141920bab016a5a26a0cf108195b8a4dc1303148fd0","name":"read","arguments":{"i":"Reading pump due kernel","path":"crates/spt-daemon/src/pump/mod.rs","selector":"340-520"}},{"type":"toolCall","id":"call_BBnA36cktecjR2d0VdU1rsBJ|fc_0148993141920bab016a5a26a0cf1481958bd6942f447039b2","name":"read","arguments":{"i":"Reading dispatch worker classification","path":"crates/spt-daemon/src/dispatch.rs","selector":"810-950,1050-1160"}},{"type":"toolCall","id":"call_xVdmJUrqGhzanA060pMfyHan|fc_0148993141920bab016a5a26a0cf1c819582bf2b89430c9442","name":"grep","arguments":{"i":"Finding registry receive batching","pattern":"serve_registry|apply_feed_batch|RegistryDecoder|RegistryFeedRecord|net_stream_unsubscribe|retire_terminal","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":202011,"output":182,"cacheRead":0,"cacheWrite":0,"totalTokens":202193,"reasoningTokens":92,"cost":{"input":1.0100550000000001,"output":0.0054600000000000004,"cacheRead":0,"cacheWrite":0,"total":1.0155150000000002}},"stopReason":"toolUse","timestamp":1784293002437,"responseId":"resp_0148993141920bab016a5a268aa72c8195a5800cda769aba48","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a268be06081959cef6ddf5a3c99a4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiagz40MAvNRnvNKWnkHNoamLaSnEAFPolhRNwJQNzpn-ecUFARnJERKuHV2NgAmnhos3yQ1ZKcuGf04Pjoc-CyF5F4YApqP5XzPM9ct1tsJZGLhfCS95QzIBQiPGOTyAvl1KQII07qyIOK_7_cesLwSOhTydLQlcHUZ_u2NN4mQW-O4sWgEisPY78L7d5-ck3OaKdSPOCHQykS-T4QYvdPtfHXvPK55msXov7ynTvqm8fIumR-_zVEMIKi7Q1IHzYuriA2TlOLiADM7g2EBMU0WLKssQx2eW6m3dk3jStaoq1wjDFFWPv7kp5ErwzE1MjILfjwbYZI7k8c27WNNiuu2by9xUdR56tJN0gXmrMaSRH4gqub_tiyzy1pprmpZINTGvoLQVPPd-ztkhEWxbNQPnEdindR6xqJ4ywP-5Wx6JcFzTW-JhktdNZr1zWIVE_vlVT3zKcvq2fbe221sQgJkHz-F1SU8xzfSEuSHKtYFNewcuCVw4TGAnteuMjGHzCWAlsvU5Uob0pwiZ5uKhE7SepWVG7xU5PJ1JHUNBwq0baCMJIXg9L1fKnicdJUQPJQeMN52RAvJoKKhogY9difBvhOxUAk3CKflKsiaEkTnOGq6X2gmMETdajOvbqt9JVsvDvSrb-bMnw-5o07nPldOUbMC7DWfJPLASPux2pn29b2m6R--YlWZt11AVK86_PY75oXFTFMNOZe8gYcARN1gRSG1tiONZnBfEB2VwJ2OziE-Om0apAvY6N9z_DetKj4Z8sJvZkITbZZgInzIMT9cgmWnXBn14hGL_vlg71xXunMc7d-GXyMEGYjChI9IEmaw1QoheUqOgU_5gUVejAR1Kw3uTRHHckDagRzh6IF9khXMBTf1YEmgsKpHE-bMgcIWG1fz-g-HvzRjTS8aHti4rtyh35ZaL5q34r-4oQkUbT7xYpgin8JXrwB2-Jpu6YbQO9Q-httIvayslXdhsyalu4LdbqR0OYO064SPlZeRqBksKzYm2RJX6aBx15RTDCY_OQtajT9kpnn5pcqSkY2xb7bL1W1CkcVaKy1wY_nkxOwxF4Agr5n16WwUHgORTYuPsGXDu2q26ZYEGHgsqUVnG9baT9G8rrz5qj9lQr-98MbAhkgmeo79aFp82kY4C6xquW0bRD5gXohr1NMpVgHQIBw47o3dn0oClFd84FMuzOkuQ-YROLrjj-5Wb8YjEyP1o1eNIMuaerRQnBt8sHwx_dNPWrQVITtsaT5iibO6ER8IXyPwMIE8wdfy-Fpcon49jcyYKDJSYI1uy9vdSkPcKW0kPHyPE8TB4ItODGUDDw_CZy0gEYB-iBj21HcfQ1iTMwiUCu8VBndwTDY9IK4PsbpataoTOecq4DJUFqATcMqI-nBblLjOVZpW8zEvbVp2s6DHpzS0D4-BUf2CbiHyRX-ejjZspp6SCyZb_BTQgZ54zhHn3eFbS41Y5sUiPDIP7ciZJg8gJnULTAv-EFeJsg==","summary":[{"type":"summary_text","text":"**Parsing log timings for cause**"}]},{"id":"fc_0148993141920bab016a5a26a0cef08195bd9b1124b219dc9a","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating CPU sample evidence\",\"pattern\":\"8\\\\.39|6\\\\.44|28\\\\.1|63\\\\.91|HFENDULEAM|bursty|24/90|27/90\",\"path\":\".claude;docs;C:/Users/decid/AppData/Local/spt-core\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_uqJascqOJHRknhcWja67awuD","name":"grep"},{"id":"fc_0148993141920bab016a5a26a0cf0081959a9e0e1da28e106c","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding net status gauges\",\"pattern\":\"stream_rows|stream_seats|NetStatusReply|stream_counts\",\"path\":\"crates/spt-daemon/src;crates/spt/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_4L49vNKCS0d3KvcDjHYaGrwq","name":"grep"},{"id":"fc_0148993141920bab016a5a26a0cf088195a9ab9b746dad17e7","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding status gauge output\",\"pattern\":\"stream_rows|stream_seats|net_stream|rows held|seats\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_9EEJBWozGJ6lHtZvvandz4lL","name":"grep"},{"id":"fc_0148993141920bab016a5a26a0cf108195b8a4dc1303148fd0","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump due kernel\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"340-520\"}","call_id":"call_mnmJdlBl2QRZfEFtqSAPwqAt","name":"read"},{"id":"fc_0148993141920bab016a5a26a0cf1481958bd6942f447039b2","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch worker classification\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"810-950,1050-1160\"}","call_id":"call_BBnA36cktecjR2d0VdU1rsBJ","name":"read"},{"id":"fc_0148993141920bab016a5a26a0cf1c819582bf2b89430c9442","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry receive batching\",\"pattern\":\"serve_registry|apply_feed_batch|RegistryDecoder|RegistryFeedRecord|net_stream_unsubscribe|retire_terminal\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_xVdmJUrqGhzanA060pMfyHan","name":"grep"}]},"duration":22439.10079999268,"ttft":1518.0531000047922,"contextSnapshot":{"promptTokens":202011,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_uqJascqOJHRknhcWja67awuD|fc_0148993141920bab016a5a26a0cef08195bd9b1124b219dc9a","toolName":"grep","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":".claude;docs;C:/Users/decid/AppData/Local/spt-core"},"intent":"Locating CPU sample evidence"},"id":"b0ee118e","parentId":"9576e720","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_4L49vNKCS0d3KvcDjHYaGrwq|fc_0148993141920bab016a5a26a0cf0081959a9e0e1da28e106c","toolName":"grep","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":"crates/spt-daemon/src;crates/spt/src"},"intent":"Finding net status gauges"},"id":"f4b7d0a0","parentId":"b0ee118e","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_9EEJBWozGJ6lHtZvvandz4lL|fc_0148993141920bab016a5a26a0cf088195a9ab9b746dad17e7","toolName":"grep","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core"},"intent":"Finding status gauge output"},"id":"5c6781cc","parentId":"f4b7d0a0","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_mnmJdlBl2QRZfEFtqSAPwqAt|fc_0148993141920bab016a5a26a0cf108195b8a4dc1303148fd0","toolName":"read","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump due kernel"},"id":"3f705ec3","parentId":"5c6781cc","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_BBnA36cktecjR2d0VdU1rsBJ|fc_0148993141920bab016a5a26a0cf1481958bd6942f447039b2","toolName":"read","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch worker classification"},"id":"2e4230d3","parentId":"3f705ec3","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_xVdmJUrqGhzanA060pMfyHan|fc_0148993141920bab016a5a26a0cf1c819582bf2b89430c9442","toolName":"grep","startedAt":"2026-07-17T12:57:04.878Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Finding registry receive batching"},"id":"66457bc7","parentId":"2e4230d3","timestamp":"2026-07-17T12:57:04.878Z"}
{"type":"message","id":"b9b9c937","parentId":"66457bc7","timestamp":"2026-07-17T12:57:04.881Z","message":{"role":"toolResult","toolCallId":"call_xVdmJUrqGhzanA060pMfyHan|fc_0148993141920bab016a5a26a0cf1c819582bf2b89430c9442","toolName":"grep","content":[{"type":"text","text":" 66|use spt_net::net::replicate::{\n*67|    FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,\n 68|};\n 69|use spt_net::net::wanmsg::{WanDecoder, WanReply};\n 70|use spt_store::contextstore::ContextStore;\n...\n 642|                };\n*643|                let (state, retire_terminal) = outcome_transition(\n 644|                    &outcome,\n 645|                    report.family,\n 646|                    attempts,\n...\n 654|                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\n*655|                if retire_terminal {\n 656|                    if let Ok(mut retire_brain) = connect(&name) {\n*657|                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\n 658|                    }\n 659|                    eprintln!(\n 660|                        \"{}\",\n...\n 942|        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n*943|        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n 944|        StreamFamily::Attach => {\n 945|            // The gate subject is the session's OWNING endpoint, resolved\n 946|            // from the broker's table (the spawn's label) — never from wire\n...\n 1086|    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\n*1087|        let _ = brain.net_stream_retire_terminal(stream_id);\n 1088|    }\n 1089|    // Seat release at serve completion — ALL families, success or failure\n 1090|    // (ADR-0040 decision 5): the serve loops above subscribe on THIS brain\n...\n 1095|    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1096|    let _ = brain.net_stream_unsubscribe(stream_id);\n 1097|    WorkerReport {\n 1098|        outcome,\n 1099|        family: Some(family),\n...\n 1117|// [impl->REQ-INST-7]\n*1118|fn serve_registry_feed(\n 1119|    brain: &mut Brain,\n 1120|    stream_id: u64,\n 1121|    origin: &str,\n...\n 1127|    }\n*1128|    let mut decoder = RegistryDecoder::new();\n 1129|    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130|    let mut merged = 0usize;\n 1131|    let mut shifted: Vec<String> = Vec::new();\n...\n 1174|) -> usize {\n*1175|    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\n 1176|    // Attention shift (D9-2): only ids this node actually hosts (a perch\n 1177|    // with a record); everything else is a no-op here.\n 1178|    // [impl->REQ-INST-3]\n...\n 1243|    /// tripped (the caller commits it).\n*1244|    fn push(&mut self, records: Vec<RegistryFeedRecord>) -> Option<FeedBatch> {\n 1245|        for rec in records {\n 1246|            match rec {\n*1247|                RegistryFeedRecord::Instance(u) => self.batch.updates.push(u),\n*1248|                RegistryFeedRecord::NodeLabel(n) => self.batch.labels.push(n),\n 1249|            }\n 1250|        }\n 1251|        if self.batch.len() >= self.bound {\n...\n 1862|        let inst = |id: &str| {\n*1863|            RegistryFeedRecord::Instance(RegistryUpdate {\n 1864|                subnet: \"home\".into(),\n 1865|                endpoint_id: id.into(),\n 1866|                instance: spt_net::net::registry::Instance {\n...\n 1885|        let lbl = || {\n*1886|            RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n 1887|                subnet: \"home\".into(),\n 1888|                node: \"bb22\".into(),\n 1889|                label: \"X\".into(),\n...\n 1913|        // An EMPTY feed commits nothing at all (zero snapshot writes ride on\n*1914|        // this: apply_feed_batch is never called with an empty remainder).\n 1915|        let mut acc = FeedAccumulator::new(10);\n 1916|        assert!(acc.push(vec![]).is_none());\n 1917|        assert!(acc.finish().is_none(), \"an empty feed commits nothing\");"}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":16,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":16}],"truncated":false,"displayContent":"   66│use spt_net::net::replicate::{\n  *67│    FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,\n   68│};\n   69│use spt_net::net::wanmsg::{WanDecoder, WanReply};\n   70│use spt_store::contextstore::ContextStore;\n     │...\n  642│                };\n *643│                let (state, retire_terminal) = outcome_transition(\n  644│                    &outcome,\n  645│                    report.family,\n  646│                    attempts,\n     │...\n  654│                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\n *655│                if retire_terminal {\n  656│                    if let Ok(mut retire_brain) = connect(&name) {\n *657│                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\n  658│                    }\n  659│                    eprintln!(\n  660│                        \"{}\",\n     │...\n  942│        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n *943│        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n  944│        StreamFamily::Attach => {\n  945│            // The gate subject is the session's OWNING endpoint, resolved\n  946│            // from the broker's table (the spawn's label) — never from wire\n     │...\n 1086│    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\n*1087│        let _ = brain.net_stream_retire_terminal(stream_id);\n 1088│    }\n 1089│    // Seat release at serve completion — ALL families, success or failure\n 1090│    // (ADR-0040 decision 5): the serve loops above subscribe on THIS brain\n     │...\n 1095│    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1096│    let _ = brain.net_stream_unsubscribe(stream_id);\n 1097│    WorkerReport {\n 1098│        outcome,\n 1099│        family: Some(family),\n     │...\n 1117│// [impl->REQ-INST-7]\n*1118│fn serve_registry_feed(\n 1119│    brain: &mut Brain,\n 1120│    stream_id: u64,\n 1121│    origin: &str,\n     │...\n 1127│    }\n*1128│    let mut decoder = RegistryDecoder::new();\n 1129│    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130│    let mut merged = 0usize;\n 1131│    let mut shifted: Vec<String> = Vec::new();\n     │...\n 1174│) -> usize {\n*1175│    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\n 1176│    // Attention shift (D9-2): only ids this node actually hosts (a perch\n 1177│    // with a record); everything else is a no-op here.\n 1178│    // [impl->REQ-INST-3]\n     │...\n 1243│    /// tripped (the caller commits it).\n*1244│    fn push(&mut self, records: Vec<RegistryFeedRecord>) -> Option<FeedBatch> {\n 1245│        for rec in records {\n 1246│            match rec {\n*1247│                RegistryFeedRecord::Instance(u) => self.batch.updates.push(u),\n*1248│                RegistryFeedRecord::NodeLabel(n) => self.batch.labels.push(n),\n 1249│            }\n 1250│        }\n 1251│        if self.batch.len() >= self.bound {\n     │...\n 1862│        let inst = |id: &str| {\n*1863│            RegistryFeedRecord::Instance(RegistryUpdate {\n 1864│                subnet: \"home\".into(),\n 1865│                endpoint_id: id.into(),\n 1866│                instance: spt_net::net::registry::Instance {\n     │...\n 1885│        let lbl = || {\n*1886│            RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n 1887│                subnet: \"home\".into(),\n 1888│                node: \"bb22\".into(),\n 1889│                label: \"X\".into(),\n     │...\n 1913│        // An EMPTY feed commits nothing at all (zero snapshot writes ride on\n*1914│        // this: apply_feed_batch is never called with an empty remainder).\n 1915│        let mut acc = FeedAccumulator::new(10);\n 1916│        assert!(acc.push(vec![]).is_none());\n 1917│        assert!(acc.finish().is_none(), \"an empty feed commits nothing\");"},"isError":false,"timestamp":1784293024880}}
{"type":"message","id":"4dabbd59","parentId":"b9b9c937","timestamp":"2026-07-17T12:57:04.893Z","message":{"role":"toolResult","toolCallId":"call_BBnA36cktecjR2d0VdU1rsBJ|fc_0148993141920bab016a5a26a0cf1481958bd6942f447039b2","toolName":"read","content":[{"type":"text","text":"fn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {\n…\n    line.get(key)\n…\n        .map(str::to_string)\n}\n\n/// A worker's report: the outcome plus the telemetry keys it resolved\n/// (family + endpoint, once the opener classified) — Amendment fix 9.\nstruct WorkerReport {\n    outcome: DispatchOutcome,\n    family: Option<StreamFamily>,\n    endpoint: Option<String>,\n}\n\nimpl WorkerReport {\n    fn bare(outcome: DispatchOutcome) -> WorkerReport {\n        WorkerReport {\n            outcome,\n            family: None,\n            endpoint: None,\n        }\n    }\n}\n\n#[allow(clippy::too_many_arguments)]\nfn worker(\n    broker_name: &str,\n    stream_id: u64,\n    origin: &str,\n    floor_seq: u64,\n    finished: bool,\n    paths: &DispatchPaths,\n    registry: &RegistryHost,\n) -> WorkerReport {\n    if take_injected_transient() {\n        return WorkerReport::bare(DispatchOutcome::Failed(\n            \"injected transient worker-start failure (test valve)\".into(),\n        ));\n    }\n    if take_injected_seatblocked() {\n        return WorkerReport::bare(DispatchOutcome::Failed(\n            \"injected subscriber busy failure (test valve)\".into(),\n        ));\n    }\n    let line = match first_line(broker_name, stream_id, floor_seq) {\n        Ok(Some(v)) => v,\n        Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),\n        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n        // vanished between enumeration and this query (retired by a sibling\n        // worker's Served report, or conn-swept) is TERMINAL — report Served\n        // so the claim closes now, instead of burning three transient\n        // retries against a stream that no longer exists.\n        // [impl->REQ-SERVE-OWNERSHIP-GENERATION]\n        Err(e) if e.to_string().contains(\"no such stream\") => {\n            return WorkerReport::bare(DispatchOutcome::Served(\n                \"terminal pre-serve: row already gone\".into(),\n            ))\n        }\n        Err(e) => return WorkerReport::bare(DispatchOutcome::Failed(e.to_string())),\n    };\n    let family = classify_first_line(&line);\n    let endpoint = line_endpoint(family, &line);\n\n    if family == StreamFamily::Registry && take_injected_registry_seatblocked() {\n        return WorkerReport {\n            outcome: DispatchOutcome::Failed(\n                \"injected subscriber busy failure (registry test valve)\".into(),\n            ),\n            family: Some(family),\n            endpoint,\n        };\n    }\n\n    // Gate round 1 (retire-on-sight, KNOWN-HAZARDS 7.41): a finished ATTACH\n    // row's exchange is over — the operator detached — and replaying it would\n    // take the live controller (pre-existing backlog + brain-down-detach\n    // orderings, which the Served-report path can never see). Report Served\n    // WITHOUT serving: the loop's completion path retires the row, so the\n    // backlog also drains from the table. Finished request/reply rows fall\n    // through — their FIN is protocol, not completion (see\n    // `finished_row_is_terminal`).\n    if finished_row_is_terminal(family, finished) {\n        return WorkerReport {\n            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n            family: Some(family),\n            endpoint,\n        };\n    }\n\n    let mut brain = match connect(broker_name) {\n        Ok(b) => b,\n        Err(e) => {\n            return WorkerReport {\n                outcome: DispatchOutcome::Failed(e.to_string()),\n                family: Some(family),\n                endpoint,\n            }\n        }\n    };\n\n    let outcome = match family {\n        StreamFamily::Sync => {\n            let cs = match ContextStore::open_or_init() {\n                Ok(cs) => cs,\n                Err(e) => {\n                    return WorkerReport {\n                        outcome: DispatchOutcome::Failed(e.to_string()),\n                        family: Some(family),\n                        endpoint,\n                    }\n                }\n            };\n            let policy = SyncPolicy::load();\n            match serve_sync(\n                &mut brain,\n                stream_id,\n                origin,\n                0,\n                &cs,\n                &policy,\n                &paths.scratch,\n            ) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Update => {\n            let cache = ReleaseCache::open(&paths.releases);\n            let roster = RosterStore::load();\n            match serve_update(&mut brain, stream_id, origin, 0, &cache, &roster) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Notif => serve_notif_feed(&mut brain, stream_id, origin),\n        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n        StreamFamily::Attach => {\n            // The gate subject is the session's OWNING endpoint, resolved\n            // from the broker's table (the spawn's label) — never from wire\n            // bytes. An unlabeled or unknown session refuses, fail-closed.\n            //\n            // Cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH): a REMOTE operator\n            // cannot know our local session id, so it names the ENDPOINT. When the\n…\n        }\n…\n        StreamFamily::Rest => {\n…\n            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\n…\n            }\n        }\n        StreamFamily::ShellLink => {\n            // The wire names the owner whose whitelist gates AND whose shell\n            // tree resolves (owner exclusivity = resolution scope); the\n            // action runs against the LOCAL owlery — perch, manifest, spool,\n            // and binary all live here, the shell's node.\n            // [impl->REQ-SHELL-2]\n            match crate::linkhost::serve_shell_link(&mut brain, stream_id, origin, &paths.owlery) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::ServeProbe => {\n            // No gate (serveprobe module docs): the answer is public\n            // serve-state for a named subnet, read fresh from this node's\n            // own stores — the QUIC handshake is the only subject.\n            // [impl->REQ-SUBNET-5]\n            match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\n    };\n    // Physical row release for a COMPLETED serve (ADR-0040 decisions 1+5):\n    // this runs on the worker's OWN conn, so it is ordered BEHIND every reply\n    // frame the serve loop sent (same serial IPC handler) — the late-reply\n    // overtake race that forced ADR-0038's eligibility-only retire cannot\n    // happen here. Without it, every completed serve on the long-lived pump\n    // carrier retains its row + reply ring until a conn-close sweep that\n    // never comes (the hertz census's 524→6411 stream growth). ATTACH is\n    // excluded: attach rows are Durable-class (brain-swap re-attach\n    // continuity) — they keep the completion-closure's eligibility-only\n    // retire exactly as before.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\n        let _ = brain.net_stream_retire_terminal(stream_id);\n    }\n    // Seat release at serve completion — ALL families, success or failure\n    // (ADR-0040 decision 5): the serve loops above subscribe on THIS brain\n    // conn; releasing here stops-and-joins the seat's writer promptly instead\n    // of leaving it parked until the conn-close sweep. Best-effort +\n    // idempotent (a terminal-retired row already dismissed its seat): an N-1\n    // broker answers `error` and the conn-close sweep remains the backstop.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    let _ = brain.net_stream_unsubscribe(stream_id);\n    WorkerReport {\n        outcome,\n        family: Some(family),\n        endpoint,\n    }\n}\n\n/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\n/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\n/// origin trusted in that subnet), until the peer finishes.\n///\n/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer\n/// instance of an id observed transitioning to `Active` — its node's daemon\n/// just gave it a driver, so a *locally hosted* instance of the same id\n/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`\n/// dormant). The rest edge's transition echo is gate-armed\n/// ([`crate::resting::arm_transition_echo`]) — the endpoint's own pulse\n/// loop runs the bounded summarizer call, never this worker (the KH 7.4\n/// non-blocking posture: N flips in one feed are N gate files, not N LLM\n/// calls serialized here).\n// [impl->REQ-INST-7]\nfn serve_registry_feed(\n    brain: &mut Brain,\n    stream_id: u64,\n    origin: &str,\n    registry: &RegistryHost,\n) -> DispatchOutcome {\n    let policy = RegistryGatePolicy::load();\n    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n        return DispatchOutcome::Failed(e.to_string());\n    }\n    let mut decoder = RegistryDecoder::new();\n    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n    let mut merged = 0usize;\n    let mut shifted: Vec<String> = Vec::new();\n    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n    // decision 3): records accumulate in memory across transport chunks and\n    // apply transactionally at EOF (or at the bounded batch size for an\n    // oversized feed). The pre-fix shape ran up to TWO full-registry\n    // snapshot rewrites per 64KiB chunk, synchronously in the brain's event\n    // loop — the drain stall that manufactured the 15s seat-writer poisons\n    // (KH 7.44). Attention shifts fire once per id, post-merge.\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                if let Some(batch) = acc.push(decoder.push(&bytes)) {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n                if let Some(batch) = acc.finish() {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n            }\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n            Ok(_) => {}\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\n        }\n    }\n}"}],"details":{"displayContent":{"text":"fn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {\n…\n    line.get(key)\n…\n        .map(str::to_string)\n}\n\n/// A worker's report: the outcome plus the telemetry keys it resolved\n/// (family + endpoint, once the opener classified) — Amendment fix 9.\nstruct WorkerReport {\n    outcome: DispatchOutcome,\n    family: Option<StreamFamily>,\n    endpoint: Option<String>,\n}\n\nimpl WorkerReport {\n    fn bare(outcome: DispatchOutcome) -> WorkerReport {\n        WorkerReport {\n            outcome,\n            family: None,\n            endpoint: None,\n        }\n    }\n}\n\n#[allow(clippy::too_many_arguments)]\nfn worker(\n    broker_name: &str,\n    stream_id: u64,\n    origin: &str,\n    floor_seq: u64,\n    finished: bool,\n    paths: &DispatchPaths,\n    registry: &RegistryHost,\n) -> WorkerReport {\n    if take_injected_transient() {\n        return WorkerReport::bare(DispatchOutcome::Failed(\n            \"injected transient worker-start failure (test valve)\".into(),\n        ));\n    }\n    if take_injected_seatblocked() {\n        return WorkerReport::bare(DispatchOutcome::Failed(\n            \"injected subscriber busy failure (test valve)\".into(),\n        ));\n    }\n    let line = match first_line(broker_name, stream_id, floor_seq) {\n        Ok(Some(v)) => v,\n        Ok(None) => return WorkerReport::bare(DispatchOutcome::Unknown),\n        // Pre-serve terminal exclusion (Amendment fix 6 rider): a row that\n        // vanished between enumeration and this query (retired by a sibling\n        // worker's Served report, or conn-swept) is TERMINAL — report Served\n        // so the claim closes now, instead of burning three transient\n        // retries against a stream that no longer exists.\n        // [impl->REQ-SERVE-OWNERSHIP-GENERATION]\n        Err(e) if e.to_string().contains(\"no such stream\") => {\n            return WorkerReport::bare(DispatchOutcome::Served(\n                \"terminal pre-serve: row already gone\".into(),\n            ))\n        }\n        Err(e) => return WorkerReport::bare(DispatchOutcome::Failed(e.to_string())),\n    };\n    let family = classify_first_line(&line);\n    let endpoint = line_endpoint(family, &line);\n\n    if family == StreamFamily::Registry && take_injected_registry_seatblocked() {\n        return WorkerReport {\n            outcome: DispatchOutcome::Failed(\n                \"injected subscriber busy failure (registry test valve)\".into(),\n            ),\n            family: Some(family),\n            endpoint,\n        };\n    }\n\n    // Gate round 1 (retire-on-sight, KNOWN-HAZARDS 7.41): a finished ATTACH\n    // row's exchange is over — the operator detached — and replaying it would\n    // take the live controller (pre-existing backlog + brain-down-detach\n    // orderings, which the Served-report path can never see). Report Served\n    // WITHOUT serving: the loop's completion path retires the row, so the\n    // backlog also drains from the table. Finished request/reply rows fall\n    // through — their FIN is protocol, not completion (see\n    // `finished_row_is_terminal`).\n    if finished_row_is_terminal(family, finished) {\n        return WorkerReport {\n            outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),\n            family: Some(family),\n            endpoint,\n        };\n    }\n\n    let mut brain = match connect(broker_name) {\n        Ok(b) => b,\n        Err(e) => {\n            return WorkerReport {\n                outcome: DispatchOutcome::Failed(e.to_string()),\n                family: Some(family),\n                endpoint,\n            }\n        }\n    };\n\n    let outcome = match family {\n        StreamFamily::Sync => {\n            let cs = match ContextStore::open_or_init() {\n                Ok(cs) => cs,\n                Err(e) => {\n                    return WorkerReport {\n                        outcome: DispatchOutcome::Failed(e.to_string()),\n                        family: Some(family),\n                        endpoint,\n                    }\n                }\n            };\n            let policy = SyncPolicy::load();\n            match serve_sync(\n                &mut brain,\n                stream_id,\n                origin,\n                0,\n                &cs,\n                &policy,\n                &paths.scratch,\n            ) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Update => {\n            let cache = ReleaseCache::open(&paths.releases);\n            let roster = RosterStore::load();\n            match serve_update(&mut brain, stream_id, origin, 0, &cache, &roster) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Notif => serve_notif_feed(&mut brain, stream_id, origin),\n        StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),\n        StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),\n        StreamFamily::Attach => {\n            // The gate subject is the session's OWNING endpoint, resolved\n            // from the broker's table (the spawn's label) — never from wire\n            // bytes. An unlabeled or unknown session refuses, fail-closed.\n            //\n            // Cross-node leg (#4, REQ-RC-CROSS-NODE-ATTACH): a REMOTE operator\n            // cannot know our local session id, so it names the ENDPOINT. When the\n…\n        }\n…\n        StreamFamily::Rest => {\n…\n            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\n…\n            }\n        }\n        StreamFamily::ShellLink => {\n            // The wire names the owner whose whitelist gates AND whose shell\n            // tree resolves (owner exclusivity = resolution scope); the\n            // action runs against the LOCAL owlery — perch, manifest, spool,\n            // and binary all live here, the shell's node.\n            // [impl->REQ-SHELL-2]\n            match crate::linkhost::serve_shell_link(&mut brain, stream_id, origin, &paths.owlery) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::ServeProbe => {\n            // No gate (serveprobe module docs): the answer is public\n            // serve-state for a named subnet, read fresh from this node's\n            // own stores — the QUIC handshake is the only subject.\n            // [impl->REQ-SUBNET-5]\n            match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\n    };\n    // Physical row release for a COMPLETED serve (ADR-0040 decisions 1+5):\n    // this runs on the worker's OWN conn, so it is ordered BEHIND every reply\n    // frame the serve loop sent (same serial IPC handler) — the late-reply\n    // overtake race that forced ADR-0038's eligibility-only retire cannot\n    // happen here. Without it, every completed serve on the long-lived pump\n    // carrier retains its row + reply ring until a conn-close sweep that\n    // never comes (the hertz census's 524→6411 stream growth). ATTACH is\n    // excluded: attach rows are Durable-class (brain-swap re-attach\n    // continuity) — they keep the completion-closure's eligibility-only\n    // retire exactly as before.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\n        let _ = brain.net_stream_retire_terminal(stream_id);\n    }\n    // Seat release at serve completion — ALL families, success or failure\n    // (ADR-0040 decision 5): the serve loops above subscribe on THIS brain\n    // conn; releasing here stops-and-joins the seat's writer promptly instead\n    // of leaving it parked until the conn-close sweep. Best-effort +\n    // idempotent (a terminal-retired row already dismissed its seat): an N-1\n    // broker answers `error` and the conn-close sweep remains the backstop.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    let _ = brain.net_stream_unsubscribe(stream_id);\n    WorkerReport {\n        outcome,\n        family: Some(family),\n        endpoint,\n    }\n}\n\n/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\n/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\n/// origin trusted in that subnet), until the peer finishes.\n///\n/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer\n/// instance of an id observed transitioning to `Active` — its node's daemon\n/// just gave it a driver, so a *locally hosted* instance of the same id\n/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`\n/// dormant). The rest edge's transition echo is gate-armed\n/// ([`crate::resting::arm_transition_echo`]) — the endpoint's own pulse\n/// loop runs the bounded summarizer call, never this worker (the KH 7.4\n/// non-blocking posture: N flips in one feed are N gate files, not N LLM\n/// calls serialized here).\n// [impl->REQ-INST-7]\nfn serve_registry_feed(\n    brain: &mut Brain,\n    stream_id: u64,\n    origin: &str,\n    registry: &RegistryHost,\n) -> DispatchOutcome {\n    let policy = RegistryGatePolicy::load();\n    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n        return DispatchOutcome::Failed(e.to_string());\n    }\n    let mut decoder = RegistryDecoder::new();\n    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n    let mut merged = 0usize;\n    let mut shifted: Vec<String> = Vec::new();\n    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n    // decision 3): records accumulate in memory across transport chunks and\n    // apply transactionally at EOF (or at the bounded batch size for an\n    // oversized feed). The pre-fix shape ran up to TWO full-registry\n    // snapshot rewrites per 64KiB chunk, synchronously in the brain's event\n    // loop — the drain stall that manufactured the 15s seat-writer poisons\n    // (KH 7.44). Attention shifts fire once per id, post-merge.\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                if let Some(batch) = acc.push(decoder.push(&bytes)) {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n                if let Some(batch) = acc.finish() {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n            }\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n            Ok(_) => {}\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\n        }\n    }\n}","startLine":799,"lineNumbers":[799,null,807,null,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,null,1014,null,1040,null,1047,null,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784293024893}}
{"type":"message","id":"1be0a2f6","parentId":"4dabbd59","timestamp":"2026-07-17T12:57:04.907Z","message":{"role":"toolResult","toolCallId":"call_4L49vNKCS0d3KvcDjHYaGrwq|fc_0148993141920bab016a5a26a0cf0081959a9e0e1da28e106c","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## brain.rs\n 41|    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n*42|    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n 43|    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n 44|    SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,\n 45|    SubscribeReq, SubscribedReply, ViewerEvictedEvent,\n...\n 155|    /// The broker-owned net endpoint's status (a `net-status` reply, D4a).\n*156|    NetStatus(NetStatusReply),\n 157|    /// A net dial durably landed — fresh or deduped (D4a).\n 158|    NetDialed(NetDialed),\n 159|    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n...\n 822|                KIND_NET_STATUS_REPLY => {\n*823|                    let ev: NetStatusReply = serde_json::from_value(env.payload)\n 824|                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n 825|                    return Ok(BrokerEvent::NetStatus(ev));\n 826|                }\n...\n 1174|    // [impl->REQ-DAEMON-2]\n*1175|    pub fn net_status(&mut self) -> io::Result<NetStatusReply> {\n 1176|        self.send(KIND_NET_STATUS, serde_json::Value::Null)?;\n 1177|        loop {\n 1178|            match self.read_event()? {\n## broker.rs\n 57|    ErrorEvent, ExitEvent, InputReq, KillReq, NetDialReq, NetPresenceSubscribeReq, NetSent,\n*58|    BrokerImageReply, StallEvictsReply, NetStatusReply, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq, NetStreamSubscribeReq,\n 59|    NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n 60|    SpawnConflict, Spawned, SubscribeOutcome, SubscribeReq, UnsubscribeReq, KIND_BRAIN_RESTART, KIND_BRAIN_RESTARTED, KIND_ENDPOINT_INPUT, KIND_ERROR, KIND_EXIT,\n 61|    KIND_INPUT, KIND_KILL, KIND_NET_DIAL, KIND_NET_DIAL_LOOPBACK, KIND_NET_DIAL_SUBMIT,\n...\n 4233|                // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*4234|                let (streams_held, stream_seats) = host.stream_counts();\n*4235|                NetStatusReply {\n 4236|                    enabled: true,\n 4237|                    node_id_hex: Some(host.node_id_hex()),\n 4238|                    addr: host.addr_json(),\n...\n 4240|                    streams_held,\n*4241|                    stream_seats,\n 4242|                }\n 4243|            }\n*4244|            None => NetStatusReply {\n 4245|                enabled: false,\n 4246|                node_id_hex: None,\n 4247|                addr: serde_json::Value::Null,\n...\n 4249|                streams_held: 0,\n*4250|                stream_seats: 0,\n 4251|            },\n 4252|        };\n 4253|        let frame = Envelope::new(\n 4254|            KIND_NET_STATUS_REPLY,\n*4255|            serde_json::to_value(reply).expect(\"NetStatusReply serializes\"),\n 4256|        );\n 4257|        send_frame(send, &frame);\n 4258|    }\n## msg.rs\n 595|#[derive(Debug, Clone, Serialize, Deserialize)]\n*596|pub struct NetStatusReply {\n 597|    /// Whether this broker hosts a net endpoint at all.\n 598|    pub enabled: bool,\n 599|    /// The node's stable name (lowercase-hex Ed25519 pubkey == iroh EndpointId).\n...\n 618|    #[serde(default)]\n*619|    pub stream_seats: u64,\n 620|}\n 621|\n 622|/// `broker-image-reply` — the semver the RUNNING broker process was compiled with\n## nethost.rs\n 1911|    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1912|    pub fn stream_counts(&self) -> (u64, u64) {\n 1913|        let streams = self.shared.streams.lock().unwrap();\n 1914|        let rows = streams.len() as u64;\n 1915|        let seats = streams\n...\n 2690|    #[test]\n*2691|    fn conn_close_sweeps_its_stream_rows() {\n 2692|        let a = NetHost::start(hermetic(&Identity::generate())).expect(\"host a\");\n 2693|        let b = NetHost::start(hermetic(&Identity::generate())).expect(\"host b\");\n 2694|        let (conn_id, _) = a.dial(b.addr()).expect(\"dial\");\n...\n 3132|        host.subscribe_stream(owner, Arc::clone(&a), 0).expect(\"A subscribes\");\n*3133|        let (_, seats) = host.stream_counts();\n 3134|        assert_eq!(seats, 1, \"A's seat installed\");\n 3135|\n 3136|        // A releases its own seat: removed, writer joined, seat count drops.\n 3137|        assert!(host.unsubscribe_stream(owner, &a), \"own seat releases\");\n*3138|        let (_, seats) = host.stream_counts();\n 3139|        assert_eq!(seats, 0, \"the seat is physically gone\");\n 3140|        assert!(\n 3141|            !host.unsubscribe_stream(owner, &a),\n...\n 3157|        );\n*3158|        let (_, seats) = host.stream_counts();\n 3159|        assert_eq!(seats, 1, \"B's seat survives A2's late release\");\n 3160|        assert!(host.unsubscribe_stream(owner, &b), \"B releases its own\");\n 3161|    }\n...\n 3176|        host.subscribe_stream(shell, Arc::clone(&sub), 0).expect(\"subscribe\");\n*3177|        let (rows_before, seats_before) = host.stream_counts();\n 3178|        assert_eq!(seats_before, 1);\n 3179|        assert!(host.retire_stream(shell));\n*3180|        let (rows_after, seats_after) = host.stream_counts();\n 3181|        assert_eq!(\n 3182|            rows_after, rows_before,\n 3183|            \"plain retire is eligibility-only: the physical entry stays\"\n...\n 3188|        assert!(host.retire_stream_terminal(owner));\n*3189|        let (rows_terminal, _) = host.stream_counts();\n 3190|        assert_eq!(\n 3191|            rows_terminal,\n 3192|            rows_after - 1,"}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":21,"fileCount":4,"files":["crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/msg.rs","crates/spt-daemon/src/nethost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brain.rs","count":4},{"path":"crates/spt-daemon/src/broker.rs","count":7},{"path":"crates/spt-daemon/src/msg.rs","count":2},{"path":"crates/spt-daemon/src/nethost.rs","count":8}],"truncated":false,"displayContent":"# crates/spt-daemon/src/\n## brain.rs\n   41│    KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,\n  *42│    NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,\n   43│    NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,\n   44│    SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,\n   45│    SubscribeReq, SubscribedReply, ViewerEvictedEvent,\n     │...\n  155│    /// The broker-owned net endpoint's status (a `net-status` reply, D4a).\n *156│    NetStatus(NetStatusReply),\n  157│    /// A net dial durably landed — fresh or deduped (D4a).\n  158│    NetDialed(NetDialed),\n  159│    /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned\n     │...\n  822│                KIND_NET_STATUS_REPLY => {\n *823│                    let ev: NetStatusReply = serde_json::from_value(env.payload)\n  824│                        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;\n  825│                    return Ok(BrokerEvent::NetStatus(ev));\n  826│                }\n     │...\n 1174│    // [impl->REQ-DAEMON-2]\n*1175│    pub fn net_status(&mut self) -> io::Result<NetStatusReply> {\n 1176│        self.send(KIND_NET_STATUS, serde_json::Value::Null)?;\n 1177│        loop {\n 1178│            match self.read_event()? {\n## broker.rs\n   57│    ErrorEvent, ExitEvent, InputReq, KillReq, NetDialReq, NetPresenceSubscribeReq, NetSent,\n  *58│    BrokerImageReply, StallEvictsReply, NetStatusReply, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq, NetStreamSubscribeReq,\n   59│    NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq, SessionInfo, SessionsReply, SpawnReq,\n   60│    SpawnConflict, Spawned, SubscribeOutcome, SubscribeReq, UnsubscribeReq, KIND_BRAIN_RESTART, KIND_BRAIN_RESTARTED, KIND_ENDPOINT_INPUT, KIND_ERROR, KIND_EXIT,\n   61│    KIND_INPUT, KIND_KILL, KIND_NET_DIAL, KIND_NET_DIAL_LOOPBACK, KIND_NET_DIAL_SUBMIT,\n     │...\n 4233│                // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*4234│                let (streams_held, stream_seats) = host.stream_counts();\n*4235│                NetStatusReply {\n 4236│                    enabled: true,\n 4237│                    node_id_hex: Some(host.node_id_hex()),\n 4238│                    addr: host.addr_json(),\n     │...\n 4240│                    streams_held,\n*4241│                    stream_seats,\n 4242│                }\n 4243│            }\n*4244│            None => NetStatusReply {\n 4245│                enabled: false,\n 4246│                node_id_hex: None,\n 4247│                addr: serde_json::Value::Null,\n     │...\n 4249│                streams_held: 0,\n*4250│                stream_seats: 0,\n 4251│            },\n 4252│        };\n 4253│        let frame = Envelope::new(\n 4254│            KIND_NET_STATUS_REPLY,\n*4255│            serde_json::to_value(reply).expect(\"NetStatusReply serializes\"),\n 4256│        );\n 4257│        send_frame(send, &frame);\n 4258│    }\n## msg.rs\n 595│#[derive(Debug, Clone, Serialize, Deserialize)]\n*596│pub struct NetStatusReply {\n 597│    /// Whether this broker hosts a net endpoint at all.\n 598│    pub enabled: bool,\n 599│    /// The node's stable name (lowercase-hex Ed25519 pubkey == iroh EndpointId).\n    │...\n 618│    #[serde(default)]\n*619│    pub stream_seats: u64,\n 620│}\n 621│\n 622│/// `broker-image-reply` — the semver the RUNNING broker process was compiled with\n## nethost.rs\n 1911│    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n*1912│    pub fn stream_counts(&self) -> (u64, u64) {\n 1913│        let streams = self.shared.streams.lock().unwrap();\n 1914│        let rows = streams.len() as u64;\n 1915│        let seats = streams\n     │...\n 2690│    #[test]\n*2691│    fn conn_close_sweeps_its_stream_rows() {\n 2692│        let a = NetHost::start(hermetic(&Identity::generate())).expect(\"host a\");\n 2693│        let b = NetHost::start(hermetic(&Identity::generate())).expect(\"host b\");\n 2694│        let (conn_id, _) = a.dial(b.addr()).expect(\"dial\");\n     │...\n 3132│        host.subscribe_stream(owner, Arc::clone(&a), 0).expect(\"A subscribes\");\n*3133│        let (_, seats) = host.stream_counts();\n 3134│        assert_eq!(seats, 1, \"A's seat installed\");\n 3135│\n 3136│        // A releases its own seat: removed, writer joined, seat count drops.\n 3137│        assert!(host.unsubscribe_stream(owner, &a), \"own seat releases\");\n*3138│        let (_, seats) = host.stream_counts();\n 3139│        assert_eq!(seats, 0, \"the seat is physically gone\");\n 3140│        assert!(\n 3141│            !host.unsubscribe_stream(owner, &a),\n     │...\n 3157│        );\n*3158│        let (_, seats) = host.stream_counts();\n 3159│        assert_eq!(seats, 1, \"B's seat survives A2's late release\");\n 3160│        assert!(host.unsubscribe_stream(owner, &b), \"B releases its own\");\n 3161│    }\n     │...\n 3176│        host.subscribe_stream(shell, Arc::clone(&sub), 0).expect(\"subscribe\");\n*3177│        let (rows_before, seats_before) = host.stream_counts();\n 3178│        assert_eq!(seats_before, 1);\n 3179│        assert!(host.retire_stream(shell));\n*3180│        let (rows_after, seats_after) = host.stream_counts();\n 3181│        assert_eq!(\n 3182│            rows_after, rows_before,\n 3183│            \"plain retire is eligibility-only: the physical entry stays\"\n     │...\n 3188│        assert!(host.retire_stream_terminal(owner));\n*3189│        let (rows_terminal, _) = host.stream_counts();\n 3190│        assert_eq!(\n 3191│            rows_terminal,\n 3192│            rows_after - 1,"},"isError":false,"timestamp":1784293024906}}
{"type":"message","id":"fc21f070","parentId":"1be0a2f6","timestamp":"2026-07-17T12:57:04.921Z","message":{"role":"toolResult","toolCallId":"call_mnmJdlBl2QRZfEFtqSAPwqAt|fc_0148993141920bab016a5a26a0cf108195b8a4dc1303148fd0","toolName":"read","content":[{"type":"text","text":"\n/// Observation hooks. `on_pull` fires after every completed sync pull —\n/// the conflict surface (ADR-0013) and the E2E's probe.\npub struct PumpHooks {\n    pub on_pull: OnPull,\n}\n\nimpl Default for PumpHooks {\n    /// The production hook: conflicts are loud, never silent — the artifacts\n    /// already persist (hazard 6.6); the reconcile turn runs at activation.\n    fn default() -> PumpHooks {\n        PumpHooks {\n            on_pull: Box::new(|peer, report| {\n                for (branch, file) in report.conflicts() {\n                    eprintln!(\"SYNC_CONFLICT:{peer}:{branch}:{file}\");\n                }\n            }),\n        }\n    }\n}\n\n/// The pump-worker seam (arch-review rev 2 card 1): each cadenced leg —\n/// registry / notif / sync / update — is a [`PumpWorker`] the pump schedules\n/// (cadence + wake markers → the pure [`due`] kernel) and fans out per peer\n/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;\n/// the worker owns *what* — its node-local `pre_round` and its `peer_step`.\n///\n/// **KH 7.4 — never an LLM-bearing worker.** A pump worker is cadenced,\n/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile\n/// turn) runs at activation paths with a manifest runtime to ride (ADR-0013),\n/// NEVER on the pump thread — the seam must not become the invitation to put\n/// it here.\ntrait PumpWorker {\n    /// This worker's scheduling period (config-driven in production).\n    fn cadence(&self) -> Duration;\n\n    /// Take this worker's exactly-once wake marker — a wake forces one round\n    /// NOW regardless of cadence. Called every tick so a marker is consumed\n    /// whether or not the leg is otherwise due; the take IS the remove, so one\n    /// wake claims exactly one forced round. Default: no wake edge.\n    fn poll_wake(&mut self) -> bool {\n        false\n    }\n\n    /// Node-local work run ONCE per due round, before any `peer_step`.\n    /// Default: nothing.\n    fn pre_round(&mut self, _ctx: &RoundCtx) {}\n\n    /// The per-peer step for one `(subnet, peer)` under this round's context. A\n    /// failure aborts the remaining due workers for THIS peer and drops its\n    /// conn (redial next tick) — abort-on-first-fail, current behaviour.\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        peer_hex: &str,\n        ctx: &RoundCtx,\n    ) -> io::Result<()>;\n}\n\n/// Per-round shared loads (§Frozen-3): the config-ish stores the shell reads\n/// ONCE per due round and hands every worker by `&RoundCtx`. The single-read\n/// invariant — push targets and the sync gate see the SAME roster — is made a\n/// structural fact by loading the roster-backed [`SyncPolicy`] here, once.\n/// Carries ONLY per-round shared loads; never long-lived deps (those are\n/// construction-captured by each worker).\nstruct RoundCtx {\n    /// `subnet.json` — the member subnets iterated for fan-out.\n    subnets: SubnetStore,\n    /// `attachment.json` — a detached subnet is skipped wholesale (REQ-SUBNET-5).\n    attachment: spt_store::attachment::AttachmentStore,\n    /// The roster-backed sync gate — one store feeding both the push targets\n    /// and the sync authorization (symmetric scoping).\n    policy: SyncPolicy,\n}\n\nimpl RoundCtx {\n    /// Load the per-round shared stores from the pump's paths (the access-gate\n    /// freshness stance — every config-ish store re-read per round so an edit\n    /// takes effect within one tick, no restart).\n    fn load(paths: &PumpPaths) -> RoundCtx {\n        let subnets = SubnetStore::load_from(&paths.subnets);\n        // Serve-state (M8 decision 6, REQ-SUBNET-5): a detached subnet is\n        // neither advertised into nor connected to — skipped wholesale in the\n        // per-subnet loop below.\n        // [impl->REQ-SUBNET-5]\n        let attachment = spt_store::attachment::AttachmentStore::load_from(\n            &paths\n                .subnets\n                .parent()\n                .map(|p| p.join(\"attachment.json\"))\n                .unwrap_or_else(|| PathBuf::from(\"attachment.json\")),\n        );\n        // THE WIDEN (Mesh-D6, REQ-MESH-3): the push target is the full roster\n        // (all members), not the directly-paired set. The one roster loaded\n        // here feeds both the push (who we dial) and the sync gate (who we\n        // authorize), so they read one store.\n        let roster_path = paths\n            .subnets\n            .parent()\n            .map(|p| p.join(\"roster.json\"))\n            .unwrap_or_else(|| PathBuf::from(\"roster.json\"));\n        let policy = SyncPolicy {\n            subnets: subnets\n                .subnets\n                .iter()\n                .map(|s| (s.name.clone(), s.hide_new_endpoints))\n                .collect(),\n            roster: spt_store::roster::RosterStore::load_from(&roster_path),\n            vis: VisibilityStore::load_from(&paths.vis),\n        };\n        RoundCtx {\n            subnets,\n            attachment,\n            policy,\n        }\n    }\n}\n\n#[cfg(test)]\nimpl RoundCtx {\n    /// A minimal empty round context for worker unit tests whose `pre_round` /\n    /// `peer_step` ignore it (the registry leg keys off its own state, not the\n    /// shared loads).\n    fn for_test() -> RoundCtx {\n        RoundCtx {\n            subnets: SubnetStore::default(),\n            attachment: spt_store::attachment::AttachmentStore::default(),\n            policy: SyncPolicy {\n                subnets: Vec::new(),\n                roster: spt_store::roster::RosterStore::default(),\n                vis: VisibilityStore::default(),\n            },\n        }\n    }\n}\n\n/// The shell-owned per-peer IO surface (§Frozen-5): the ONE brain IPC handle,\n/// the established conn id, and the SOLE open-op [`EpochSource`]\n/// (`pump-ops.json`). A worker mints durable open-ops only through this handle\n/// — a worker-owned `EpochSource` over the shared counter is the KH\n/// epoch-lease double-mint and is forbidden.\nstruct PeerIo<'a> {\n    /// The one brain IPC handle.\n    brain: &'a mut Brain,\n    /// The established peer conn id for this step.\n    conn_id: u64,\n    /// The pump's sole durable open-op counter. Workers mint open-ops only\n    /// through [`PeerIo::open_op`] (the sync + update legs); a worker-owned\n    /// `EpochSource` over this counter would be the KH epoch-lease double-mint.\n    ops: &'a mut EpochSource,\n}\n\nimpl PeerIo<'_> {\n    /// Open a fresh stream and write one whole feed fire-and-forget (the\n    /// push-feed discipline — `op_id: None`, finished on send).\n    fn push_feed(&mut self, feed: &[u8]) -> io::Result<()> {\n        push_feed(self.brain, self.conn_id, feed)\n    }\n\n    /// Mint the next durable open-op from the pump's sole counter (exactly-once\n    /// open identity — a restart can never reuse one), tagged with the `pump`\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\n    fn open_op(&mut self) -> io::Result<MintedOp> {\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\n    }\n}\n\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\n/// per-peer connection cache (an IO failure against a peer drops its cache\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\n/// because the broker's closed-watcher reaps dead conns).\n///\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n/// logic lives here — the shell owns only *when* and *toward whom*.\npub fn run_peer_pump(\n    broker_name: &str,\n    registry: Arc<RegistryHost>,\n    paths: &PumpPaths,\n    resolver: PeerResolver,\n…\n) -> io::Result<()> {\n…\n}\n\n[Showing lines 339-523 of 2054. Use :524 to continue]"}],"details":{"truncation":{"content":"\r\n/// Observation hooks. `on_pull` fires after every completed sync pull —\r\n/// the conflict surface (ADR-0013) and the E2E's probe.\r\npub struct PumpHooks {\r\n    pub on_pull: OnPull,\r\n}\r\n\r\nimpl Default for PumpHooks {\r\n    /// The production hook: conflicts are loud, never silent — the artifacts\r\n    /// already persist (hazard 6.6); the reconcile turn runs at activation.\r\n    fn default() -> PumpHooks {\r\n        PumpHooks {\r\n            on_pull: Box::new(|peer, report| {\r\n                for (branch, file) in report.conflicts() {\r\n                    eprintln!(\"SYNC_CONFLICT:{peer}:{branch}:{file}\");\r\n                }\r\n            }),\r\n        }\r\n    }\r\n}\r\n\r\n/// The pump-worker seam (arch-review rev 2 card 1): each cadenced leg —\r\n/// registry / notif / sync / update — is a [`PumpWorker`] the pump schedules\r\n/// (cadence + wake markers → the pure [`due`] kernel) and fans out per peer\r\n/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;\r\n/// the worker owns *what* — its node-local `pre_round` and its `peer_step`.\r\n///\r\n/// **KH 7.4 — never an LLM-bearing worker.** A pump worker is cadenced,\r\n/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile\r\n/// turn) runs at activation paths with a manifest runtime to ride (ADR-0013),\r\n/// NEVER on the pump thread — the seam must not become the invitation to put\r\n/// it here.\r\ntrait PumpWorker {\r\n    /// This worker's scheduling period (config-driven in production).\r\n    fn cadence(&self) -> Duration;\r\n\r\n    /// Take this worker's exactly-once wake marker — a wake forces one round\r\n    /// NOW regardless of cadence. Called every tick so a marker is consumed\r\n    /// whether or not the leg is otherwise due; the take IS the remove, so one\r\n    /// wake claims exactly one forced round. Default: no wake edge.\r\n    fn poll_wake(&mut self) -> bool {\r\n        false\r\n    }\r\n\r\n    /// Node-local work run ONCE per due round, before any `peer_step`.\r\n    /// Default: nothing.\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {}\r\n\r\n    /// The per-peer step for one `(subnet, peer)` under this round's context. A\r\n    /// failure aborts the remaining due workers for THIS peer and drops its\r\n    /// conn (redial next tick) — abort-on-first-fail, current behaviour.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        peer_hex: &str,\r\n        ctx: &RoundCtx,\r\n    ) -> io::Result<()>;\r\n}\r\n\r\n/// Per-round shared loads (§Frozen-3): the config-ish stores the shell reads\r\n/// ONCE per due round and hands every worker by `&RoundCtx`. The single-read\r\n/// invariant — push targets and the sync gate see the SAME roster — is made a\r\n/// structural fact by loading the roster-backed [`SyncPolicy`] here, once.\r\n/// Carries ONLY per-round shared loads; never long-lived deps (those are\r\n/// construction-captured by each worker).\r\nstruct RoundCtx {\r\n    /// `subnet.json` — the member subnets iterated for fan-out.\r\n    subnets: SubnetStore,\r\n    /// `attachment.json` — a detached subnet is skipped wholesale (REQ-SUBNET-5).\r\n    attachment: spt_store::attachment::AttachmentStore,\r\n    /// The roster-backed sync gate — one store feeding both the push targets\r\n    /// and the sync authorization (symmetric scoping).\r\n    policy: SyncPolicy,\r\n}\r\n\r\nimpl RoundCtx {\r\n    /// Load the per-round shared stores from the pump's paths (the access-gate\r\n    /// freshness stance — every config-ish store re-read per round so an edit\r\n    /// takes effect within one tick, no restart).\r\n    fn load(paths: &PumpPaths) -> RoundCtx {\r\n        let subnets = SubnetStore::load_from(&paths.subnets);\r\n        // Serve-state (M8 decision 6, REQ-SUBNET-5): a detached subnet is\r\n        // neither advertised into nor connected to — skipped wholesale in the\r\n        // per-subnet loop below.\r\n        // [impl->REQ-SUBNET-5]\r\n        let attachment = spt_store::attachment::AttachmentStore::load_from(\r\n            &paths\r\n                .subnets\r\n                .parent()\r\n                .map(|p| p.join(\"attachment.json\"))\r\n                .unwrap_or_else(|| PathBuf::from(\"attachment.json\")),\r\n        );\r\n        // THE WIDEN (Mesh-D6, REQ-MESH-3): the push target is the full roster\r\n        // (all members), not the directly-paired set. The one roster loaded\r\n        // here feeds both the push (who we dial) and the sync gate (who we\r\n        // authorize), so they read one store.\r\n        let roster_path = paths\r\n            .subnets\r\n            .parent()\r\n            .map(|p| p.join(\"roster.json\"))\r\n            .unwrap_or_else(|| PathBuf::from(\"roster.json\"));\r\n        let policy = SyncPolicy {\r\n            subnets: subnets\r\n                .subnets\r\n                .iter()\r\n                .map(|s| (s.name.clone(), s.hide_new_endpoints))\r\n                .collect(),\r\n            roster: spt_store::roster::RosterStore::load_from(&roster_path),\r\n            vis: VisibilityStore::load_from(&paths.vis),\r\n        };\r\n        RoundCtx {\r\n            subnets,\r\n            attachment,\r\n            policy,\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nimpl RoundCtx {\r\n    /// A minimal empty round context for worker unit tests whose `pre_round` /\r\n    /// `peer_step` ignore it (the registry leg keys off its own state, not the\r\n    /// shared loads).\r\n    fn for_test() -> RoundCtx {\r\n        RoundCtx {\r\n            subnets: SubnetStore::default(),\r\n            attachment: spt_store::attachment::AttachmentStore::default(),\r\n            policy: SyncPolicy {\r\n                subnets: Vec::new(),\r\n                roster: spt_store::roster::RosterStore::default(),\r\n                vis: VisibilityStore::default(),\r\n            },\r\n        }\r\n    }\r\n}\r\n\r\n/// The shell-owned per-peer IO surface (§Frozen-5): the ONE brain IPC handle,\r\n/// the established conn id, and the SOLE open-op [`EpochSource`]\r\n/// (`pump-ops.json`). A worker mints durable open-ops only through this handle\r\n/// — a worker-owned `EpochSource` over the shared counter is the KH\r\n/// epoch-lease double-mint and is forbidden.\r\nstruct PeerIo<'a> {\r\n    /// The one brain IPC handle.\r\n    brain: &'a mut Brain,\r\n    /// The established peer conn id for this step.\r\n    conn_id: u64,\r\n    /// The pump's sole durable open-op counter. Workers mint open-ops only\r\n    /// through [`PeerIo::open_op`] (the sync + update legs); a worker-owned\r\n    /// `EpochSource` over this counter would be the KH epoch-lease double-mint.\r\n    ops: &'a mut EpochSource,\r\n}\r\n\r\nimpl PeerIo<'_> {\r\n    /// Open a fresh stream and write one whole feed fire-and-forget (the\r\n    /// push-feed discipline — `op_id: None`, finished on send).\r\n    fn push_feed(&mut self, feed: &[u8]) -> io::Result<()> {\r\n        push_feed(self.brain, self.conn_id, feed)\r\n    }\r\n\r\n    /// Mint the next durable open-op from the pump's sole counter (exactly-once\r\n    /// open identity — a restart can never reuse one), tagged with the `pump`\r\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\r\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\r\n    fn open_op(&mut self) -> io::Result<MintedOp> {\r\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\r\n    }\r\n}\r\n\r\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\r\n/// per-peer connection cache (an IO failure against a peer drops its cache\r\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\r\n/// because the broker's closed-watcher reaps dead conns).\r\n///\r\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\r\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\r\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\r\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\r\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\r\n/// logic lives here — the shell owns only *when* and *toward whom*.\r\npub fn run_peer_pump(\r\n    broker_name: &str,\r\n    registry: Arc<RegistryHost>,\r\n    paths: &PumpPaths,\r\n    resolver: PeerResolver,\r","truncated":true,"truncatedBy":"lines","totalLines":1716,"totalBytes":8156,"outputLines":185,"outputBytes":8156,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\r\n/// Observation hooks. `on_pull` fires after every completed sync pull —\r\n/// the conflict surface (ADR-0013) and the E2E's probe.\r\npub struct PumpHooks {\r\n    pub on_pull: OnPull,\r\n}\r\n\r\nimpl Default for PumpHooks {\r\n    /// The production hook: conflicts are loud, never silent — the artifacts\r\n    /// already persist (hazard 6.6); the reconcile turn runs at activation.\r\n    fn default() -> PumpHooks {\r\n        PumpHooks {\r\n            on_pull: Box::new(|peer, report| {\r\n                for (branch, file) in report.conflicts() {\r\n                    eprintln!(\"SYNC_CONFLICT:{peer}:{branch}:{file}\");\r\n                }\r\n            }),\r\n        }\r\n    }\r\n}\r\n\r\n/// The pump-worker seam (arch-review rev 2 card 1): each cadenced leg —\r\n/// registry / notif / sync / update — is a [`PumpWorker`] the pump schedules\r\n/// (cadence + wake markers → the pure [`due`] kernel) and fans out per peer\r\n/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;\r\n/// the worker owns *what* — its node-local `pre_round` and its `peer_step`.\r\n///\r\n/// **KH 7.4 — never an LLM-bearing worker.** A pump worker is cadenced,\r\n/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile\r\n/// turn) runs at activation paths with a manifest runtime to ride (ADR-0013),\r\n/// NEVER on the pump thread — the seam must not become the invitation to put\r\n/// it here.\r\ntrait PumpWorker {\r\n    /// This worker's scheduling period (config-driven in production).\r\n    fn cadence(&self) -> Duration;\r\n\r\n    /// Take this worker's exactly-once wake marker — a wake forces one round\r\n    /// NOW regardless of cadence. Called every tick so a marker is consumed\r\n    /// whether or not the leg is otherwise due; the take IS the remove, so one\r\n    /// wake claims exactly one forced round. Default: no wake edge.\r\n    fn poll_wake(&mut self) -> bool {\r\n        false\r\n    }\r\n\r\n    /// Node-local work run ONCE per due round, before any `peer_step`.\r\n    /// Default: nothing.\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {}\r\n\r\n    /// The per-peer step for one `(subnet, peer)` under this round's context. A\r\n    /// failure aborts the remaining due workers for THIS peer and drops its\r\n    /// conn (redial next tick) — abort-on-first-fail, current behaviour.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        peer_hex: &str,\r\n        ctx: &RoundCtx,\r\n    ) -> io::Result<()>;\r\n}\r\n\r\n/// Per-round shared loads (§Frozen-3): the config-ish stores the shell reads\r\n/// ONCE per due round and hands every worker by `&RoundCtx`. The single-read\r\n/// invariant — push targets and the sync gate see the SAME roster — is made a\r\n/// structural fact by loading the roster-backed [`SyncPolicy`] here, once.\r\n/// Carries ONLY per-round shared loads; never long-lived deps (those are\r\n/// construction-captured by each worker).\r\nstruct RoundCtx {\r\n    /// `subnet.json` — the member subnets iterated for fan-out.\r\n    subnets: SubnetStore,\r\n    /// `attachment.json` — a detached subnet is skipped wholesale (REQ-SUBNET-5).\r\n    attachment: spt_store::attachment::AttachmentStore,\r\n    /// The roster-backed sync gate — one store feeding both the push targets\r\n    /// and the sync authorization (symmetric scoping).\r\n    policy: SyncPolicy,\r\n}\r\n\r\nimpl RoundCtx {\r\n    /// Load the per-round shared stores from the pump's paths (the access-gate\r\n    /// freshness stance — every config-ish store re-read per round so an edit\r\n    /// takes effect within one tick, no restart).\r\n    fn load(paths: &PumpPaths) -> RoundCtx {\r\n        let subnets = SubnetStore::load_from(&paths.subnets);\r\n        // Serve-state (M8 decision 6, REQ-SUBNET-5): a detached subnet is\r\n        // neither advertised into nor connected to — skipped wholesale in the\r\n        // per-subnet loop below.\r\n        // [impl->REQ-SUBNET-5]\r\n        let attachment = spt_store::attachment::AttachmentStore::load_from(\r\n            &paths\r\n                .subnets\r\n                .parent()\r\n                .map(|p| p.join(\"attachment.json\"))\r\n                .unwrap_or_else(|| PathBuf::from(\"attachment.json\")),\r\n        );\r\n        // THE WIDEN (Mesh-D6, REQ-MESH-3): the push target is the full roster\r\n        // (all members), not the directly-paired set. The one roster loaded\r\n        // here feeds both the push (who we dial) and the sync gate (who we\r\n        // authorize), so they read one store.\r\n        let roster_path = paths\r\n            .subnets\r\n            .parent()\r\n            .map(|p| p.join(\"roster.json\"))\r\n            .unwrap_or_else(|| PathBuf::from(\"roster.json\"));\r\n        let policy = SyncPolicy {\r\n            subnets: subnets\r\n                .subnets\r\n                .iter()\r\n                .map(|s| (s.name.clone(), s.hide_new_endpoints))\r\n                .collect(),\r\n            roster: spt_store::roster::RosterStore::load_from(&roster_path),\r\n            vis: VisibilityStore::load_from(&paths.vis),\r\n        };\r\n        RoundCtx {\r\n            subnets,\r\n            attachment,\r\n            policy,\r\n        }\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nimpl RoundCtx {\r\n    /// A minimal empty round context for worker unit tests whose `pre_round` /\r\n    /// `peer_step` ignore it (the registry leg keys off its own state, not the\r\n    /// shared loads).\r\n    fn for_test() -> RoundCtx {\r\n        RoundCtx {\r\n            subnets: SubnetStore::default(),\r\n            attachment: spt_store::attachment::AttachmentStore::default(),\r\n            policy: SyncPolicy {\r\n                subnets: Vec::new(),\r\n                roster: spt_store::roster::RosterStore::default(),\r\n                vis: VisibilityStore::default(),\r\n            },\r\n        }\r\n    }\r\n}\r\n\r\n/// The shell-owned per-peer IO surface (§Frozen-5): the ONE brain IPC handle,\r\n/// the established conn id, and the SOLE open-op [`EpochSource`]\r\n/// (`pump-ops.json`). A worker mints durable open-ops only through this handle\r\n/// — a worker-owned `EpochSource` over the shared counter is the KH\r\n/// epoch-lease double-mint and is forbidden.\r\nstruct PeerIo<'a> {\r\n    /// The one brain IPC handle.\r\n    brain: &'a mut Brain,\r\n    /// The established peer conn id for this step.\r\n    conn_id: u64,\r\n    /// The pump's sole durable open-op counter. Workers mint open-ops only\r\n    /// through [`PeerIo::open_op`] (the sync + update legs); a worker-owned\r\n    /// `EpochSource` over this counter would be the KH epoch-lease double-mint.\r\n    ops: &'a mut EpochSource,\r\n}\r\n\r\nimpl PeerIo<'_> {\r\n    /// Open a fresh stream and write one whole feed fire-and-forget (the\r\n    /// push-feed discipline — `op_id: None`, finished on send).\r\n    fn push_feed(&mut self, feed: &[u8]) -> io::Result<()> {\r\n        push_feed(self.brain, self.conn_id, feed)\r\n    }\r\n\r\n    /// Mint the next durable open-op from the pump's sole counter (exactly-once\r\n    /// open identity — a restart can never reuse one), tagged with the `pump`\r\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\r\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\r\n    fn open_op(&mut self) -> io::Result<MintedOp> {\r\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\r\n    }\r\n}\r\n\r\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\r\n/// per-peer connection cache (an IO failure against a peer drops its cache\r\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\r\n/// because the broker's closed-watcher reaps dead conns).\r\n///\r\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\r\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\r\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\r\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\r\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\r\n/// logic lives here — the shell owns only *when* and *toward whom*.\r\npub fn run_peer_pump(\r\n    broker_name: &str,\r\n    registry: Arc<RegistryHost>,\r\n    paths: &PumpPaths,\r\n    resolver: PeerResolver,\r\n…\n) -> io::Result<()> {\n…\n}","startLine":339,"lineNumbers":[339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,null,527,null,732]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2054,"totalBytes":8156,"outputLines":185,"outputBytes":8156,"shownRange":{"start":339,"end":523},"nextOffset":524}}},"isError":false,"timestamp":1784293024921}}
{"type":"message","id":"571cb63f","parentId":"fc21f070","timestamp":"2026-07-17T12:57:16.074Z","message":{"role":"toolResult","toolCallId":"call_9EEJBWozGJ6lHtZvvandz4lL|fc_0148993141920bab016a5a26a0cf088195a9ab9b746dad17e7","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/\n\n## docs/\n### llms-full.txt\n 3160|\n*3161|One endpoint, several seats. `sergey` is a single identity; an **instance** of\n 3162|sergey is his presence on one node. The registry tracks every instance's node\n 3163|and state (active / dormant / suspended / offline), and the same mind syncs\n 3164|to wherever he sits.\n### print.html\n 2932|<h1 id=\"instances\"><a class=\"header\" href=\"#instances\">Instances</a></h1>\n*2933|<p>One endpoint, several seats. <code>sergey</code> is a single identity; an <strong>instance</strong> of\n 2934|sergey is his presence on one node. The registry tracks every instance’s node\n 2935|and state (active / dormant / suspended / offline), and the same mind syncs\n 2936|to wherever he sits.</p>\n### searchindex-ef47b3c9.js\n*1|window.search = Object.assign(window.search, JSON.parse('{\"doc_urls\":[\"index.html#spt-developer-docs\",\"index.html#install\",\"index.html#how-these-docs-are-organized\",\"index.html#for-ai-agents-reading-this\",\"quickstart/messaging.html#quickstart-two-agents-exchange-a-message\",\"quickstart/messaging.html#1-install\",\"quickstart/messaging.html#2-optional-link-two-machines\",\"quickstart/messaging.html#3-hand-your-receiver-agent-its-prompt\",\"quickstart/messaging.html#4-hand-your-sender-agent-its-prompt\",\"quickstar...\n\n### instances/\n#### overview.html\n 181|                        <h1 id=\"instances\"><a class=\"header\" href=\"#instances\">Instances</a></h1>\n*182|<p>One endpoint, several seats. <code>sergey</code> is a single identity; an <strong>instance</strong> of\n 183|sergey is his presence on one node. The registry tracks every instance’s node\n 184|and state (active / dormant / suspended / offline), and the same mind syncs\n 185|to wherever he sits.</p>\n#### overview.md\n 2|\n*3|One endpoint, several seats. `sergey` is a single identity; an **instance** of\n 4|sergey is his presence on one node. The registry tracks every instance's node\n 5|and state (active / dormant / suspended / offline), and the same mind syncs\n 6|to wherever he sits.\n\n## tracked/projects/github-com-bigscreenvr-website/webbie/\n### project-context.md\n 5|\n*6|Assistant clarified: no separate account type needed — screen shown is the Zero Trust plan picker; a Free plan ($0, up to 50 users) covers Access for step 4. Caveat: Cloudflare requires a payment method on file to activate Zero Trust even at $0, though nothing charges at ≤50 seats (expected usage ~5-10).\n 7|\n 8|Two paths offered, awaiting user decision:\n 9|- **Path A (recommended):** click \"Choose a plan\" → select Free plan, proceed with step 4 as written. Only blocker is card-on-file requirement.\n\n[Some lines truncated to 512 chars]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log, C:/Users/decid/AppData/Local/spt-core","searchPath":"C:\\Users\\decid\\AppData\\Local\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":6,"fileCount":6,"files":["C:/Users/decid/AppData/Local/spt-core/docs/instances/overview.html","C:/Users/decid/AppData/Local/spt-core/docs/instances/overview.md","C:/Users/decid/AppData/Local/spt-core/docs/llms-full.txt","C:/Users/decid/AppData/Local/spt-core/docs/print.html","C:/Users/decid/AppData/Local/spt-core/docs/searchindex-ef47b3c9.js","C:/Users/decid/AppData/Local/spt-core/tracked/projects/github-com-bigscreenvr-website/webbie/project-context.md"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/docs/instances/overview.html","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/docs/instances/overview.md","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/docs/llms-full.txt","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/docs/print.html","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/docs/searchindex-ef47b3c9.js","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/tracked/projects/github-com-bigscreenvr-website/webbie/project-context.md","count":1}],"truncated":true,"displayContent":"# C:/Users/decid/AppData/Local/spt-core/\n\n## docs/\n### llms-full.txt\n 3160│\n*3161│One endpoint, several seats. `sergey` is a single identity; an **instance** of\n 3162│sergey is his presence on one node. The registry tracks every instance's node\n 3163│and state (active / dormant / suspended / offline), and the same mind syncs\n 3164│to wherever he sits.\n### print.html\n 2932│<h1 id=\"instances\"><a class=\"header\" href=\"#instances\">Instances</a></h1>\n*2933│<p>One endpoint, several seats. <code>sergey</code> is a single identity; an <strong>instance</strong> of\n 2934│sergey is his presence on one node. The registry tracks every instance’s node\n 2935│and state (active / dormant / suspended / offline), and the same mind syncs\n 2936│to wherever he sits.</p>\n### searchindex-ef47b3c9.js\n*1│window.search = Object.assign(window.search, JSON.parse('{\"doc_urls\":[\"index.html#spt-developer-docs\",\"index.html#install\",\"index.html#how-these-docs-are-organized\",\"index.html#for-ai-agents-reading-this\",\"quickstart/messaging.html#quickstart-two-agents-exchange-a-message\",\"quickstart/messaging.html#1-install\",\"quickstart/messaging.html#2-optional-link-two-machines\",\"quickstart/messaging.html#3-hand-your-receiver-agent-its-prompt\",\"quickstart/messaging.html#4-hand-your-sender-agent-its-prompt\",\"quickstar...\n\n### instances/\n#### overview.html\n 181│                        <h1 id=\"instances\"><a class=\"header\" href=\"#instances\">Instances</a></h1>\n*182│<p>One endpoint, several seats. <code>sergey</code> is a single identity; an <strong>instance</strong> of\n 183│sergey is his presence on one node. The registry tracks every instance’s node\n 184│and state (active / dormant / suspended / offline), and the same mind syncs\n 185│to wherever he sits.</p>\n#### overview.md\n 2│\n*3│One endpoint, several seats. `sergey` is a single identity; an **instance** of\n 4│sergey is his presence on one node. The registry tracks every instance's node\n 5│and state (active / dormant / suspended / offline), and the same mind syncs\n 6│to wherever he sits.\n\n## tracked/projects/github-com-bigscreenvr-website/webbie/\n### project-context.md\n 5│\n*6│Assistant clarified: no separate account type needed — screen shown is the Zero Trust plan picker; a Free plan ($0, up to 50 users) covers Access for step 4. Caveat: Cloudflare requires a payment method on file to activate Zero Trust even at $0, though nothing charges at ≤50 seats (expected usage ~5-10).\n 7│\n 8│Two paths offered, awaiting user decision:\n 9│- **Path A (recommended):** click \"Choose a plan\" → select Free plan, proceed with step 4 as written. Only blocker is card-on-file requirement.","linesTruncated":true,"meta":{"limits":{"columnTruncated":{"maxColumn":512}}}},"isError":false,"timestamp":1784293036074}}
{"type":"message","id":"d78e1194","parentId":"571cb63f","timestamp":"2026-07-17T12:57:16.082Z","message":{"role":"toolResult","toolCallId":"call_uqJascqOJHRknhcWja67awuD|fc_0148993141920bab016a5a26a0cef08195bd9b1124b219dc9a","toolName":"grep","content":[{"type":"text","text":"# .claude/\n## doyle-to-todlando.md\n 40|\n*41|Your b2 leg (SPT_ENDPOINT_ID perch-gated, label-only) matches the field evidence — both our live sends stamp cli@HFENDULEAM under installed v0.30.6, which predates it. perri rider (OWL_SESSION_ID unexported → export restores detect leg a) noted; I'll carry that to perri when W4 merges.\n 42|\n 43|## Order of work (binding)\n 44|\n## flynn-commune.md\n 6|<live-context>\n*7|Agent identity: flynn, spt-mobile perch on node HFENDULEAM. Session ended via /exit with no task content — nothing to report.\n 8|</live-context>\n## todlando-commune.md\n 1|<live-context>\n*2|I am todlando, build-lane live agent on spt-core (HFENDULEAM; co-located: doyle=triage/gate, deployah=publish, perri=adapter, flynn=mobile, lia, hertz=roadblock-RCA). Operator: Reavo End.\n 3|\n 4|Standing working rules (burned-in / ruled):\n 5|- Messaging: `spt send <target>` for ALL agent traffic (SENT/QUEUED both = success, never retry). Long bodies from FILE, short printf-piped.\n...\n 10|- Per-wave REQ stage flips ride IN build commits with evidence tags; re-home [impl->] tags when moving code.\n*11|- hfenduleam = dev box + CI runner + gate box + live-daemon host: NO local suites while a CI test job runs here; NEVER kill installed-bin spt.exe; sweep target\\debug spt.exe orphans SCOPED by ExecutablePath before xtask/battery (bit me twice this milestone — os-error-5 on spt.exe = leaked orphans, not code).\n 12|- nextest: pure -E only. Repo NOT fmt-clean — never wholesale cargo fmt.\n 13|- Roles binding: doyle GATES, todlando BUILDS, deployah PUBLISHES, hertz RCAs roadblocks (nobody fixes an ungrounded red; 30-min-ungrounded → hertz) — hand off even when lanes look parked.\n 14|- CAVEMAN MODE hook active — terse user-facing replies, full technical substance.\n## todlando-to-doyle.md\n 30|  compile-verified — CI is runtime authority) + send-stamp detect leg (b2):\n*31|  SPT_ENDPOINT_ID perch-gated (label-only). Your hook-shell `from=cli@HFENDULEAM`\n 32|  datapoint = exactly what leg (b2) fixes, IF your hook shell exports\n 33|  SPT_ENDPOINT_ID (mine does); OWL_SESSION_ID reaches shells UNEXPORTED —\n 34|  adapter-side export is the perri fix that restores leg (a) too.\n\n## reports/\n\n### 2026-07-10-hertz-session/\n#### 02-mesh-isolation-rca.md\n 8|\n*9|HFENDULEAM and ENLYZEAM became entirely sequestered from every remote node on their member subnets, including each other, while `spt daemon status` reported `running: true`, `net_up: true`, fresh pump heartbeat, and normal durable subnet counts.\n 10|\n 11|## Reproduction\n 12|\n...\n 14|\n*15|- HFENDULEAM reported only itself online and every remote node offline.\n 16|- ENLYZEAM reported only itself online and every remote node offline.\n 17|- Daemon logs repeatedly reported `PUMP_PEER_FAIL:<peer>:submit-dial exceeded the 10s bound` for all targets.\n 18|\n...\n 20|\n*21|- Tailscale HFENDULEAM↔ENLYZEAM direct ping: approximately 12 ms both directions.\n 22|- Both reached a healthy reference machine.\n 23|- Both daemon PIDs owned UDP listeners.\n*24|- HFENDULEAM's inbound SPT UDP firewall rule was enabled for all profiles.\n 25|- SPT_DEV and BIGNET seeds/epochs matched.\n 26|- `detached` was empty on both machines.\n 27|- Clock offsets were approximately +0.003 s and −0.135 s, far below the 30-second rendezvous step.\n...\n 42|\n*43|- HFENDULEAM's peer-address cache lacked ENLYZEAM's exact key.\n*44|- ENLYZEAM's cache lacked HFENDULEAM's exact key.\n 45|- Both `roster.json` files contained correct, current direct addresses and matching key/address identities.\n 46|- The pump ignored those roster addresses and continued all-peer ten-second timeouts.\n 47|\n...\n 53|\n*54|- HFENDULEAM: outer `5ff…` → nested ENLYZEAM ID `ecb39…`.\n*55|- ENLYZEAM: outer `5ff…` → nested HFENDULEAM ID `14ef…`.\n 56|\n 57|Current rosters are correct. `gapfill_peeraddrs` can persist `RosterEntry.pubkey_hex -> RosterEntry.address`, and `PeerAddrStore::put` validates neither the outer key nor `outer key == address.id` (`seedproofx.rs:862-879`; `peeraddrs.rs:80-93`). Fill-only behavior preserves historical corruption after the roster is corrected.\n 58|\n*59|This defect poisons reachability to the real `5ff…` member and proves the cache accepts invalid mappings. It amplifies isolation but did not cause deletion of the current HFENDULEAM/ENLYZEAM keys; its historical producer remains unproved.\n 60|\n 61|## Why status remains green\n 62|\n...\n 109|\n*110|Build-time cross-check: Todlando preserved the 2026-07-14 HFENDULEAM pump-stall evidence at `C:/spt-diag/pump-stall-2026-07-14/`. Its restart-cured behavior may fit this class and should be compared against the planned lifecycle assertions.\n#### 03-cli-project-index-latency-rca.md\n 8|\n*9|Commands including `spt endpoint list --json` and bare/partial `spt endpoint run` take 15–35 seconds. Removing HFENDULEAM from every subnet did not improve latency.\n 10|\n 11|## Reproduction\n 12|\n*13|Measured on HFENDULEAM:\n 14|\n 15|| Command | Wall time |\n 16||---|---:|\n...\n 43|\n*44|HFENDULEAM had 13 local perches and 7 project branches. Minimum branch work was therefore:\n 45|\n 46|`13 × (1 branches_by_recency + 7 read_at_tip) = 104` sequential Git operations,\n 47|\n#### README.md\n 3|**Date:** 2026-07-10\n*4|**Purpose:** Triage-ready reports for issues diagnosed on HFENDULEAM/ENLYZEAM during this session.\n 5|**Constraint observed:** No live daemon or online endpoint was stopped, restarted, or killed during diagnosis.\n 6|\n 7|## Reports\n...\n 12|2. [`02-mesh-isolation-rca.md`](02-mesh-isolation-rca.md)\n*13|   HFENDULEAM/ENLYZEAM self-sequester through a peer-address deletion trap: a failed dial deletes the exact route, retry falls to failing ID-only discovery, and correct roster addresses are ignored until a successful connection that cannot occur. Includes a separate persisted cache key/ID invariant defect and honest-health requirements.\n 14|\n 15|3. [`03-cli-project-index-latency-rca.md`](03-cli-project-index-latency-rca.md)\n 16|   `endpoint list` and picker startup synchronously spawn 100+ Git processes to derive informational project metadata. Proposed work: persistent daemon-maintained materialized project index, asynchronous generation-aware refresh, event-driven invalidation, atomic last-known-good storage, and zero synchronous Git on CLI read paths.\n\n### 2026-07-16-redispatch-truth/\n#### hertz-refresh-rca.txt\n 15|\n*16|Field evidence on HFENDULEAM:\n 17|- Brain generations 2 and 3 both log `BRAIN_RESUMED: re-established 7 session cursor(s)` and `BRAIN_NET_CONSUMERS_UP`.\n 18|- During those generations the new dispatcher logs failures for persistent and historical streams: `DISPATCH:741:Failed(\"No process is on the other end of the pipe. (os error 233)\")`, `DISPATCH:3:Failed(\"failed to fill whole buffer\")`, `DISPATCH:4496:Failed(...)`, and `DISPATCH:4176:Failed(...)`. The very low and current-looking stream IDs in the same fresh generation are consistent with indiscriminate historical replay; the failures prove one-shot redispatch workers were abandoned. They are supporting e...\n 19|- Detach + `spt rc` reattach restores each session without restarting its hosted PTY, proving the PTY itself did not freeze.\n\n### 2026-07-17-registry-stall-rca/\n#### README.md\n 62|Date: 2026-07-16/17 UTC\n*63|Node: HFENDULEAM\n 64|Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n 65|\n 66|EXECUTIVE VERDICT\n...\n 72|claiming one hash per brain start. This alone predicts 61.29 MiB/s reads; measured brain reads\n*73|were 63.91 MiB/s.\n 74|\n 75|B. Periodic Registry feeds create historical stream state that is not retired on the sender, is\n 76|repeatedly enumerated by the dispatcher, and on receiver replay performs repeated full registry\n...\n 87|  p95 CPU: 29.2% of one logical core\n*88|  read throughput mean: 63.91 MiB/s\n 89|  threads: 18-24\n 90|  active CPU threads over 5s: 5\n 91|\n...\n 124|Observed:\n*125|  63.91 MiB/s\n 126|Prediction error:\n 127|  4.1%\n 128|\n\n# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 36|2. By explicit design, `applyhost.rs:36-38` states: *\"The daemon's own resident loops keep running the old logic until its next restart (`ensure_running` spawns the executable path — now the new binary); that restart is routine lifecycle, never an endpoint cycle.\"*\n*37|3. So new code only goes live on a *subsequent, unrelated* daemon restart (next logon, or a manual restart — which is what made the *other* node, `hfenduleam`, show a new pid). The practical consequence on `enlyzeam`: `gerald`'s live daemon kept running 0.3.0 — including the message-envelope codec — so the box from the original bug report **was still reproducing the original `\\r` corruption even though the fix sat on disk.**\n 38|\n 39|The operator then asked the real question this document answers: **what would it take to make an update actually hand off to the new executable seamlessly — no dropped processes, internal loop timings consistent across the swap, plus any other angles that matter?**\n 40|\n## DEFERRED.md\n 31|| CLI nounification (M8 candidate; ratified shape from the 2026-06-06 grill): `spt endpoint` namespace absorbs fork/suspend/wake/shutdown/rename/stop/digest + `access` (per-endpoint store — NOT subnet-scoped) + `description` (ex-`resources` blurb; bare = show, `set` = author); `spt endpoint list [--local\\|--subnet <name>]` = merged listing, default all-subnets grouped by subnet, SELF endpoint pinned distinctly at top (bare `spt endpoint` = this list); agent HOT PATH stays flat (`send`/`ring`/`ready`/`w...\n*32|| ~~Node label for an endpoint-less node (REQ-SUBNET-3 gap)~~ **SHIPPED 2026-06-08** (option 2 — node-level presence datum): a peer with **zero endpoints** rendered as a bare key-prefix in `status --nodes` because `node_label` only rode endpoint `Instance` rows. FIX: a node-LEVEL carrier — `SubnetRegistry.node_labels` (node→label) + a `NodeLabelUpdate` feed record riding the existing registry replication stream as an untagged `RegistryFeedRecord` variant (instance bytes unchanged → mixed-version ...\n 33|| **Instant + never-seen peer hostname via pairing-time capture (REQ-SUBNET-3 follow-up; the deferred \"option 1\")**: the shipped node-level label (option 2) is GOSSIP-ONLY, so a peer's name is learned only from a pump round while it is alive. Two residual gaps remain after the eviction fix below: (a) ~1 gossip cadence to appear after a join (the joiner trust-pins by pubkey with `label=None`; the hostname arrives next pump round — enlyzeam↔kitsubito converged to `ENLYZEAM` after a cadence, fine but no...\n*34|| ~~Subnet-scoped liveness probe (REQ-SUBNET-5 detach gap)~~ **SHIPPED 2026-06-08** (REQ-SUBNET-5 int stage): `subnet status --nodes` showed a DETACHED peer as **online** because liveness fell to `Probe` → a raw transport dial by node-pubkey, which succeeded on the peer's still-bound daemon endpoint (one ALPN `spt-core/net/0` serves all subnets, so the dial was subnet-blind). FIX: a new `ServeProbeRecord` (spt-net `serveprobe`) + daemon `serveprobe` handler/requester ask the peer \"serving subnet X?\", a...\n 35|| **Subnet full-mesh visibility (PLANNED MILESTONE — `SUBNET-MESH-PLAN.md`)**: non-directly-paired members never see each other — a subnet is currently the PAIRING GRAPH, not a mesh (A↔B, C↔B; B offline → A and C invisible; even with B online, B doesn't relay). Root: pairwise TOFU trust (`trust.rs`) + own-rows-only gossip / no transitive relay (`peerloop.rs`, KH 4.10/7.5) + no member roster in the pairing seed transfer. FIX = member-AUTHENTICATED subnet data (seed-MAC and/or per-node signatures...\n 36|| `xtask debug-converge` — automated convergence watcher for debug rollout (the REQ-UPD-6 first-slice item ADR-0016 names): watch every expected debug-pinned reachable lab node until all report the target version applied, else a per-node timeout table (Offline / StagedAwaitingConsent / BlockedByBrokerResources / Rejected{reason}). Activates REQ-UPD-6's `int` stage. Full build plan: `docs/DEBUG-CONVERGE-PLAN.md` | REQ-UPD-6 first slice (2026-06-06) | The first slice ships manual \"Apply and observe\" (`DE...\n 37|| **Origin-source update bootstrap (`spt update fetch` — pull the latest signed release from GitHub into the existing verify→stage→apply pipeline)**: today update DISCOVERY is **peer-only** (REQ-UPD-1: a daemon pulls offers from roster peers via `request_update`; `propagate.rs`/`peerloop.rs`). There is NO origin fetch, so the **first node in a fleet — or any isolated/solo node — cannot get a new release without a peer that already staged it** (the fleet converges by gossip, but only *after* a m...\n## DORMANCY-BUDGET.md\n 43|\n*44|### HFENDULEAM (Windows 11, 2026-06-04, local run)\n 45|\n 46|5 × `cmd` (shell seat — the floor):\n 47|\n...\n 70|floor is its measurement; the adapter-class number generalizes from\n*71|HFENDULEAM's, the harness binary being the same node runtime there):\n 72|\n 73|| metric | per-seat |\n 74||---|---|\n## F-030-PSYCHE-EPHEMERAL-DESIGN.md\n 40|(lifecycle.rs:338) plus role-local extras — no `{subnet}`, no `{home}`. On\n*41|hfenduleam (2 subnets since BIGNET joined 7/3) the runner died instantly,\n 42|the daemon re-hosted, ~5 s churn forever: hall-bf-psyche ordinal 6491+, at\n 43|one point 54 stamped host attempts. Adapter v0.13.4 made the death LOUD\n 44|(`PSYCHE_POLL_FAIL`), but residency remains structurally impossible there.\n## FLAKE-LEDGER.md\n 14|| 5 | `spt-daemon attach.rs:600` re-serve (`output gap: got seq 1 want 0`) | 1× kitsubito Linux (2026-06-15 run 27545857429, PR #14 stale-base CI) | re-serve replays the buffered output stream on re-attach; under load the new subscriber observed `seq 1` before `seq 0` — an ordering/timing gap in the re-serve sequence assert, not a content error. Subsystem disjoint from the triggering change (PR #14 = digest-proof CLI key-fill, cannot touch attach sequencing) | OBSERVED 1×: did NOT reproduce on the cl...\n*15|| 6 | `spt-term tests/stream.rs:49 bounded_backpressure_stalls_an_unconsumed_reader` | 1× hfenduleam Windows (2026-06-15 run 27545857429, PR #14 stale-base CI) | asserts an unconsumed bounded stream stalls the writer-side reader; got `16 -> 82` (reader advanced past the bound) — a timing-sensitive backpressure assert racing the bound check under hosted-runner load. Subsystem disjoint from PR #14 (digest-proof CLI) | OBSERVED 1×: did NOT reproduce on the clean-base rerun (green both runners). Not hard...\n 16|| 7 | `spt-daemon::attach attach_survives_target_brain_restart_exactly_once` | 1× kitsubito (2026-06-16 run 27595180782 attempt 1, M11-W3) | **TIMEOUT, not an assertion fail** — SLOW>60>120>180>TERMINATING, nextest TIMEOUT at the 240s cap (`attach.rs:600`). A heavy multi-process brain-restart-exactly-once test on the slow shared kitsubito box under concurrent load (n1-gate on the same runner + a parallel `ci.yml` docs-publish run firing simultaneously). W3-INDEPENDENT: Windows green end-to-end; ALL tu...\n 17|| 8 | CI build step `Build notify-shell` (kitsubito Linux) | 1× kitsubito (2026-06-16 run 27652755792 attempt 1, v0.8.1 PR #17) | crates.io dep-download blip during the notify-shell build — `download of config.json failed, curl failed` fetching `serde_json`: a transient registry/network fetch failure on the runner, not a code or test fault (a real dep break fails both runners deterministically; this hit one runner once) | observed; cleared by `gh run rerun --failed` (attempt 2 green, builds reused). H...\n 18|| 9 | `spt dummy_harness_e2e` (BOTH tests: `endpoint_run_brings_up_a_long_lived_dummy_harness_and_rc_attaches` + `endpoint_run_attach_awaits_online_before_attaching`) | 1× kitsubito (2026-07-05, REMOTE-TRUTH Batch-2 re-gate @f2a799e; roles swap run-to-run) | **process-global `set_var` race in a multi-test e2e binary.** Both tests `std::env::set_var(\"SPT_HOME\", own_tempdir)` then do IN-PROC reads (`perch::spt_home`/`adapters_dir`, `registry::register`, psychebin `fs::copy` staging). One file = one test b...\n*19|| 10 | `spt-store registry::tests::concurrent_registration_never_locks` | 1× hfenduleam local gate (2026-07-05, REMOTE-TRUTH Batch-2 bless matrix @3f6f327, fresh worktree, `nextest --workspace --no-fail-fast`) | 16-concurrent-writer SQLite registration gate FAILED at 5.63s — the SQLITE_BUSY load-contention class ALREADY documented at `db.rs:60`: box saturated by the 1588-test full-parallel suite meant a writer couldn't schedule its retry inside the default 5s `registry_busy_timeout`. Isolated ×5: gre...\n 20|| 11 | `spt-daemon::resume resume_mode_brain_spawning_new_sessions_delivers_each` | 1× kitsubito (2026-07-05 run 28768663321 attempt 1, REMOTE-TRUTH [twohost] PR #52) | Phase-B heavy-class timing EOF — \"session exited before the expected output arrived\" (UnexpectedEof) at 62s under the serialized heavy pool. SAME FAMILY as this file's prior Linux-CI flake (7940318, D4-2b: sequential spawn/read hardening) — a spawned session's exit raced the expected output read on the slow shared box. File untouched...\n*21|| 12 | `spt-daemon::input_ack_deadlock input_flood_through_serve_attach_does_not_deadlock_broker` | 1× hfenduleam local gate (2026-07-06, REMOTE-TRUTH F-2 matrix @a21bc6b, `nextest --workspace --no-fail-fast`) | deadline-margin under full-suite load: the flood exchange's `recv_timeout(30s)` (input_ack_deadlock.rs:512) blew under the 1608-test parallel pool + 7 leaky daemons — FAIL at 34.5s vs ~32s natural runtime isolated (the margin is ~3s by design). Subsystem disjoint from the triggering commit (F-...\n*22|| 13 | `spt::bin cli::tests::probe_all_cap_batches_into_windows` | 1× hfenduleam local gate (2026-07-06, stack matrix @0f08fa9 leg-3 rerun) | fast unit (0.52s natural) FAILED at 1.7s under the 1614-test full-parallel pool — probe-batching window assert with a timing component starved under load; subsystem disjoint from the triggering stack (F-2 reporting / E-2 grid title / picker rider). Isolated ×5: green, 0.52–0.55s. Same night as #12 — the full-parallel local matrix under a busy box is the com...\n*23|| 14 | `spt::bin rc::tests::attach_viewport_reconnects_across_a_broker_bounce` | 1× hfenduleam local gate (2026-07-06, WORKER-TRUTH W-3 build @worker-truth, `nextest -p spt --bin spt` full-parallel 360-test run) | **TIMEOUT, not an assertion fail** — SLOW>60…>TERMINATING at the 240s cap under the 360-way `--bin spt` pool. A REAL-broker + broker-bounce reconnect UNIT test (rc.rs:2071) that escaped the HEAVY-class serialization: the Phase-A/B split + `heavy-broker-pty` test-group target integration te...\n## INJECT-SETTLE-REARM-GATE-VERDICT.md\n 23|- Proven env-driven: same test PASSES with `SPT_INJECT_VERIFY_ECHO` unset (deterministic both ways). Linux passed because its ssh env is clean.\n*24|- **CI-safe:** the var is **Process-scope only** (User/Machine scope empty) — the GitHub Actions runner service (hfenduleam, separate process tree) does NOT inherit it → PR CI runs clean. The clean-env full re-run (1707/1707) = CI's actual condition.\n 25|- The fix touches only Layer-1 settle; Layer-2 echo-verify is untouched W5-A code. The failure is orthogonal to the change.\n 26|\n 27|## Follow-up SEED (non-blocking; filed to todlando)\n## KNOWN-HAZARDS.md\n 151|<!-- [doc->REQ-HAZARD-REGISTRY-DIR-CREATE] -->\n*152|- **Failure:** `Connection::open` creates the database FILE but never its parent DIRECTORY. On a fresh home (first boot, fresh CI `_work` dir) a registry op that runs before any perch-creating op (`create_dir_all` side effects) fails `SQLITE_CANTOPEN` — \"unable to open database file …owlery\\.registry\". Timing-dependent: whichever code path touches the home first decides the outcome, so it surfaces as a parallel-test flake (bind-first tests losing the dir-creation race to perch-first tests). Bit the h...\n 153|- **Invariant:** every SQLite store's open path `create_dir_all`s its parent dir itself, best-effort, before `Connection::open` — never relying on another subsystem having materialized the home first. (Mirrors the spool, which always did this; the registry didn't.)\n 154|- **spt-core mapping:** `spt_store::registry::open_registry` (`create_dir_all(owlery)` before open). `spt_store::spool::open_spool_at` already creates its perch dir. Any future SQLite store must do the same — pair this with the 4.7 pragma ordering on every new store.\n 155|\n...\n 157|<!-- [doc->REQ-HAZARD-REGISTRY-GHOST-ROWS] -->\n*158|- **Failure:** the registry's only superseding mechanism is the per-`(endpoint_id, node)` epoch lease (4.8) — a row is replaced only by a newer row *from the same node*. When a node identity dies permanently (machine retired, or `node.key` regenerated so the \"node\" never speaks again), its rows are never superseded and never expire: they sit in the in-memory registries and the `identity/registry/<subnet>.json` snapshots forever. A bare-id send then resolves the same endpoint id on both the live and the...\n 159|- **Invariant:** registry rows authored by a **silent** peer node decay: a node not *heard* (admitted inbound feed — the M7 D2 heard-map, REQ-SUBNET-1) within the eviction window (`registry_evict_after_ms`, default 300s ≈ 10 default pump cadences) has its rows **evicted** from every subnet registry, snapshots rewritten. Own rows never decay (the node always hears itself implicitly — it authors them each pump tick). Eviction is safe under the lease: v1 has **no transitive gossip**, so any future upd...\n 160|- **spt-core mapping:** `spt_net::net::registry::SubnetRegistry::evict_nodes` (model) + `spt_daemon::registryhost::RegistryHost::evict_silent_peers` (heard-map TTL) driven from the registry pump tick (`peerloop`). Trust rows are NOT auto-evicted (trust is a user decision; a stale trust row only costs dead dials) — pruning those is a separate verb.\n 161|- **Source:** M7 acceptance run 2026-06-06 (DEFERRED.md \"Ghost registry row eviction\"); the AMBIGUOUS render fix rode along.\n...\n 232|- **spt-core mapping:** `spt-daemon::peerloop::due` (the sole cadence gate behind `due_reg`/`due_notif`/`due_sync`/`due_upd`); cadence legs are `Option<Instant>` seeded `None`.\n*233|- **Source:** spt-core CI failure, 2026-06-07 — Windows runner `hfenduleam` (just booted) panicked the peer pump at the v0.1.1 release gate.\n 234|\n 235|### 5.10 `sudo spt` dead-ends on a user-local install (secure_path)  `[REQ-HAZARD-SUDO-SECURE-PATH]`\n 236|- **Failure:** the elevation-gated commands (`subnet create` / `subnet join` / `show-code`) refuse when unelevated and tell the user to \"run as administrator / root\". The user types the obvious `sudo spt subnet create FOO` → `sudo: spt: command not found`. `spt` is a user-local install (`~/.local/bin`, `~/.cargo/bin`), and sudo's `secure_path` (a `/etc/sudoers` default) does NOT include those dirs, so a bare command name doesn't resolve under sudo. The guidance is a trap: it names an action that cannot...\n...\n 331|- **D1 (restoration skeleton, ADR-0018 Q2/Q3):** the process boundary is restored — `spt daemon run` is the broker process and spawns a supervised `spt daemon brain` child (`brainproc.rs`); the broker survives the brain dying and respawns it (proven in production topology by `crates/spt/tests/brain_split.rs`). The logic loops still run broker-side (D2 migrates them); the `int` process-level survival E2E + the in-process re-point land at D7.\n*332|- **Closed out (2026-06-11, v0.4.0–v0.4.2):** the two-process model shipped (v0.4.0); the D7 `int` E2E (`brain_survive.rs`) + the N-1 gate prove process-level survival onto swapped bytes and re-pointed REQ-DAEMON-2 / REQ-UPD-3. The v0.4.1 fleet-verify proved this Windows-seamless (hfenduleam: brain pid rolls, broker held, `exe_hash` flips, no manual bounce) but exposed a **Linux** respawn-path gap — the resident broker respawned the brain via per-spawn `current_exe()`, which on Linux follows the `app...\n 333|\n 334|### 6.8 No irreversible durable-state migration before update ready-promotion `[REQ-HAZARD-ROLLBACK-STATE-COMPAT]`\n 335|- **Failure:** the readiness-gated auto-rollback (ADR-0018 Q7) spawns the *previous* binary against durable state the *new* brain already wrote. The first release that migrates a durable-state schema in place would make the old binary unable to read it — silently bricking rollback exactly when it is needed (a logic-bricking update that can no longer fall back).\n...\n 356|### 6.11 Brain respawn must exec the APPLIED bytes, not the renamed old binary (Linux `current_exe` follows the apply-rename; readiness ≠ new-bytes) `[REQ-HAZARD-BRAIN-RESPAWN-PATH]`\n*357|- **Failure:** the broker respawns the brain candidate from `std::env::current_exe()` resolved **per spawn** (`brainproc.rs:817`). `spt update apply` swaps the binary by renaming the running file `spt` → `spt.old-N` and writing the new bytes at `spt`. On **Linux**, `current_exe()` = `readlink(/proc/self/exe)` is **inode-tracking** and follows the rename to `.old-N`, so the resident broker respawns the brain onto the **OLD** bytes — the brain comes up ready (readiness passes), the trial **promotes**, ...\n 358|- **Invariant:** the candidate-binary default is the canonical exe path **captured once at broker start** (before any `apply` can rename under the process), never a per-spawn `current_exe()` — giving Linux the path-at-start semantics Windows already had. AND promotion is **bytes-gated**: a trial promotes only if the candidate's stamped `brain.ready` `exe_hash` equals the staged artifact's hash for this platform; a mismatch is a failed trial → auto-rollback + loud notif (readiness alone is not proof t...\n 359|- **spt-core mapping:** v0.4.2 fix (`V042-PLAN.md`). Half 1 = `spawn_brain_supervisor` canonical-exe capture threaded into `spawn_brain_child`'s `None` default; Half 2 = the promotion bytes-gate in `supervise_brain`'s `Promoted` arm (`TrialEnv::ready_exe_hash` + `staged_artifact_hash`). The rollback path (`Some(.old-N)` selection) is unchanged. Sibling of 6.7 — the broker *process* is correct; the bytes it respawned the brain ONTO were not.\n 360|- **Origin:** ADR-0018 Q3 silently assumed `current_exe()` path-string semantics; surfaced by the v0.4.1 fleet-roll `exe_hash` bytes assert (agents `todlando` + `doyle` + `deployah`, 2026-06-11). ADR-0018 Q3 amended.\n...\n 402|<!-- [doc->REQ-HAZARD-PUMP-IPC-DEADLINE] -->\n*403|- **Failure:** the peer pump is a SINGLE thread driving every leg (registry/notif/sync/update) against every peer over ONE brain-IPC client. Its reply reads (`net_open_stream`, `net_stream_send`, `net_dial`, and the sync/update pull `read_event` loops) were `loop { read_event() }` with no deadline. When a peer's QUIC path black-holes, the broker's stream-open/send awaits the dead peer and never sends the reply, so the brain's `read_frame` blocks FOREVER and the pump freezes mid-round. The heartbeat (loop...\n 404|- **Invariant:** in PUMP mode the brain carrier is **SPLIT at construction** — a dedicated `pump-ipc-reader` thread does blocking `read_frame` on the `RecvHalf` and forwards each framed result down a channel; the main thread writes on the `SendHalf` and reads with `Receiver::recv_timeout`. Every IPC reply read is bounded by a per-call **total-wait** deadline (`PUMP_PEER_IO_TIMEOUT` = 30s, > any legitimate round-trip, < the 60s QUIC idle; re-armed on stream progress for the streaming pull legs so a heal...\n 405|- **spt-core mapping:** `Brain::cold_start_pump` (splits the carrier + arms the deadline) / `BrainConn::Split` (the `SendHalf` + reader-thread channel) / `call_deadline` / `read_event_until` / `read_frame_until` (the `recv_timeout` dispatch), `pump::run_peer_pump` (connects in pump mode) + `pump::peer_outcome` (the tier-split), the `request_sync`/`request_update` pull loops (deadline re-armed on progress). The broker-side half — the broker must never make a brain wait unbounded on a QUIC op (bound the ...\n*406|- **Source:** field diagnosis 2026-06-11 (the 2.2h hfenduleam wedge); doyle ruling A-now / B-deferred. The stall warning (M8 decision 23) was the band-aid; this is the fix. The B-half landed v0.8.3 (§7.8) after the 2026-06-16 recurrence.\n 407|\n 408|### 7.7 A slow/dead/hostile remote VIEWER must never stall the controller, child, or drain  `[REQ-HAZARD-VIEWER-ISOLATION]`\n 409|<!-- [doc->REQ-HAZARD-VIEWER-ISOLATION] -->\n...\n 416|<!-- [doc->REQ-HAZARD-BROKER-QUIC-DEADLINE] -->\n*417|- **Failure:** the broker's brain-facing QUIC handlers (`dispatch_net_dial` / `dispatch_net_stream_open` / `dispatch_net_stream_send`) call into `NetHost::dial` / `open_stream` / `send_stream`, whose iroh awaits (`endpoint.connect` + `prove_membership`; `open_bi`; `write_all`/`finish`) had NO bound of their own. A dead/black-holed roster peer (its process gone, or a mixed-pair that accepts the conn but never answers the seed-proof) makes the broker await its QUIC path FOREVER, so the brain escapes only v...\n 418|- **Invariant:** every brain-waiting QUIC op is wrapped in a broker-side deadline (`NetHost::bounded_block_on` → `tokio::time::timeout`, `BROKER_QUIC_OP_TIMEOUT_MS` = 10s). On elapse the future is DROPPED (cancelling the in-flight connect/stream op, so nothing is half-registered) and a non-`TimedOut` `io::Error` is returned, which the broker REPLIES as an ordinary error frame. The bound (10s) sits comfortably above any legitimate LAN/relay round-trip and 20s below the brain's 30s `PUMP_PEER_IO_TIMEOUT`...\n 419|- **spt-core mapping:** `NetHost::bounded_block_on` (the timeout wrapper) wrapping `NetHost::dial` / `open_stream` (QUIC branch) / `send_stream`; `BROKER_QUIC_OP_TIMEOUT_MS` + `set_quic_op_timeout` (test override, off `NetConfig` — mirrors `set_roster_exchange`). Unit: `bounded_block_on_cuts_a_never_completing_op_with_an_ordinary_error` (a never-completing op → prompt non-`TimedOut` error; a ready op untouched). Int: `dial_to_a_black_holing_peer_fails_with_a_bounded_ordinary_error` (the broker REPLIE...\n*420|- **Source:** the 7.6 B-half — deferred 2026-06-11 (doyle ruling A-now / B-deferred, DEFERRED.md) and shipped in v0.8.3 after the 2026-06-16 hfenduleam recurrence.\n 421|\n 422|### 7.9 A daemon-state wire change needs a deliberate BROKER restart (the broker is resident across a brain self-update)  `[REQ-HAZARD-BROKER-SEED-WIRE-SKEW]`\n 423|<!-- [doc->REQ-HAZARD-BROKER-SEED-WIRE-SKEW] -->\n...\n 557|### 7.27 A control/viewer stamp must NEVER outlive its session — every teardown path clears what attach stamped  `[REQ-HAZARD-CONTROL-STAMP-LIFETIME]`\n*558|- **Failure (F-026 #2, live evidence HFENDULEAM):** an spt-hosted endpoint stayed `ONLINE+CONTROLLED` after the operator's RC `/exit` — hours later hall-a's `info.json` still read `controlled:true` (status offline, dormant) and hfenduleam still GOSSIPED `controller_node=self` cross-node (SPT_DEV.json snapshot). ROOT: `/exit` kills the CHILD, not the controller connection, so the endpoint suspends via child termination and the teardown runs the REAP path (`broker.rs` exit-waiter → `sessions.remove(&id...\n 559|- **Invariant:** on session reap the broker clears the perch's control/viewer stamps — `OutputLog::stamp_reaped()` = `set_driven_by(None)` + `set_controlled(false)` + `set_viewer_count(0)` via the known endpoint id — so no teardown path leaves a stamp behind. The broker stays the SINGLE writer; the clear is unconditional (idempotent when already clear) and RACE-FREE — the session is dead, so there is no live controller to re-stamp concurrently (the same argument as 7.15's no-session leg). Best-effo...\n 560|- **spt-core mapping:** impl `broker.rs` `OutputLog::stamp_reaped` + the exit-waiter reap call (before `sessions.remove`); int (real broker+PTY, no mocks) `crates/spt-daemon/tests/control_stamp_lifetime.rs` `reap_clears_control_and_viewer_stamps` (spawn hosted session → the live controller stamps `controlled=true` → latch `driven_by`+`viewer_count` on disk → KILL the child → the reap clears all three; RED-first verified: fix disabled leaves `driven_by=Some`, `controlled=true`, `viewer_count=Some(...\n 561|- **Source:** F-026 W1 #2 (BUILD-F026-PICKERTRUTH; doyle triage + gate, todlando build 2026-07-03).\n...\n 567|- **Class rule:** a relative manifest path naming a filesystem location the ENDPOINT reads or writes MUST resolve against the endpoint's own cwd (its `info.json.cwd`, read at USE time), never the daemon's process cwd. A single daemon hosts many endpoints with different cwds, so a relative path frozen or read against the daemon cwd points at a directory no endpoint uses. Keys that resolve via `{cwd}` template substitution (`[digest].source`, `[history].locate_template` — `{cwd}` filled from `info.cwd`) ...\n*568|- **Failure (F-026 SI-1, box-wide, evidence-complete):** the two-tier context BranchStore (`tracked/.seed.git`) held ZERO `a-*`/`p-*` branches on HFENDULEAM despite months of live-agent use — 0 objects, unborn HEAD, no `projects/` worktree checkouts, no commune drop files anywhere (psyche context flowed via the SEPARATE spt-agent-storage sync, masking it). ROOT: `BrainLifecycle::with_config_in` used `manifest.session.commune_dir` / `signoff_dir` VERBATIM (`PathBuf::from`). claude-spt declares `commune_...\n 569|- **Invariant:** drop-dir resolution + project-id derivation happen AT INGEST TIME against the endpoint's fresh `info.cwd` (`pulse_tick`, not frozen at construction): absolute → as-is; relative + a recorded cwd → joined under it; relative + NO cwd → SKIPPED with a LOUD-once `DROP_INGEST_SKIP` diagnostic (never guessed, never the daemon cwd). Project-tier routing is owlery-gated — an owlery-internal anchor (psyche-host session) resolves its drops verbatim but routes NO `p-<project>` branch (empty ...\n 570|- **spt-core mapping:** impl `spt-daemon/src/lifecycle.rs` `resolve_endpoint_drop_dir` + `is_owlery_internal` + `warn_no_cwd_once` + `pulse_tick` (reads `info.cwd`, resolves each drop dir, derives owlery-gated `project_id`) + `spt-live/src/ingest.rs` `route_slices` (empty-project_id skips the project tier); unit `resolve_endpoint_drop_dir_cases` + `is_owlery_internal_cases` (lifecycle.rs) + `empty_project_id_skips_project_tier` (ingest.rs); int (real pulse + real store) `relative_commune_dir_resolves_aga...\n 571|- **Source:** F-026 SI-1 (BUILD-F026-PICKERTRUTH; doyle RCA-gate + design ruling, todlando build 2026-07-03). Hazard-class sweep confirmed commune_dir+signoff_dir the ONLY verbatim instances.\n...\n 675|<!-- [doc->REQ-HAZARD-MESH-BOOTSTRAP-TRAP] -->\n*676|- **Failure (paid-for, hertz field RCA 2026-07-10 — HFENDULEAM + ENLYZEAM fully sequestered from every subnet member, symmetric, green-status):** the pump resolved dial addresses from the exact `peer-addrs.json` entry else id-only discovery — never the valid `RosterEntry.address` — and every `PRESENCE_DIAL_FAILED` unconditionally `drop_seed`'d the cached entry, while the cache refilled only after a future successful seed-proof connection. One transient failure converted a warm route into id-only-or...\n 677|- **Invariant:** dial-address resolution is the ROUTE CHAIN — exact cache → validated `RosterEntry.address` (id-match required) → id-only discovery — always fully consulted in order. A failed dial demotes a cached route (suspect), never deletes a sole route; removal happens only via validated-fresher replacement or roster tombstone. Validated roster addresses reconcile into the cache at startup and on roster merge — recovery never requires an already-successful connection or operator state surg...\n 678|- **spt-core mapping:** `spt-daemon/src/pump/mod.rs` `resolve_submit_addr` + `presence_state_effect` (`PRESENCE_DIAL_FAILED` arm); `spt-store/src/peeraddrs.rs` `PeerAddrStore::put`/`drop_seed`; `spt-daemon/src/seedproofx.rs` `gapfill_peeraddrs`; status renders (`daemon status` / `subnet status`).\n 679|- **Source:** MESH-RECOVERY W1 (hertz RCA `.claude/reports/2026-07-10-hertz-session/02-mesh-isolation-rca.md`, doyle seam-verified 2026-07-16; ADR-0039 — amends REQ-CONV-1's falsified \"a stale addr never strands a peer\" drop-on-fail mechanism).\n## MESH-RECOVERY-TRIAGE.md\n 11|**Decision record:** ADR-0039. **Hazard:** KNOWN-HAZARDS 7.42.\n*12|**Field incident:** HFENDULEAM + ENLYZEAM symmetric sequester (2026-07-10),\n 13|both sides `PUMP_PEER_FAIL:<peer>:submit-dial exceeded the 10s bound` for all\n 14|targets, Tailscale ping ~12ms both directions, both `net_up: true`.\n 15|\n...\n 118|\n*119|Build-time cross-check (RCA note): compare the 2026-07-14 HFENDULEAM\n 120|pump-stall evidence (`C:/spt-diag/pump-stall-2026-07-14/`) against leg D's\n 121|lifecycle assertions — restart-cured behavior may be this class.\n 122|\n## MUSL-RELEASE-HANDOFF.md\n 17|- update-set stale-serve window ([[release-updateset-stale-window]]): upload-before-flip covers the musl entry.\n*18|- CI flake NOT to be spooked by: `inject_control_wedge::wan_arrival_to_idle_spt_hosted_injects_with_no_hook_poll` is a Windows-box-timing flake on the 80ms inject settle-window (untouched by W3, PASS on kitsubito, green in v0.29.1). If the hfenduleam test leg trips it, sweep leaked `spt.exe` (scoped) + rerun `--failed` — do NOT read it as a musl regression.\n 19|\n 20|Questions → doyle. gnu is unchanged; musl is purely additive.\n 21|\n## MUSL-W1-DISPATCH-RULING.md\n 31|- clippy `--workspace --all-targets -D warnings`; `traceable-reqs check --json` exit 0 (REQ-PLATFORM-REGISTRY +impl +unit).\n*32|- Full `nextest --workspace` BOTH legs (Windows hfenduleam + Linux kitsubito) — release/update/apply/propagate suites unchanged + green.\n 33|- Diff review: no behaviour change for gnu/windows; `SUPPORTED_PLATFORMS` is the single source; applyhost generalized correctly (N-platform, not hardcoded pair).\n 34|- A musl build is NOT required for W1 (that's W2) — but the tree must still compile for a musl target (the `\"unknown\"` fallback stays until W2 adds the arm).\n 35|\n## MUSL-W3-DISPATCH-RULING.md\n 25|- clippy `--workspace --all-targets -D warnings`; `traceable-reqs check --json` exit 0 (`REQ-RELEASE-MUSL-ARTIFACT` +impl +unit +int).\n*26|- Full `nextest --workspace` BOTH legs (Windows hfenduleam + Linux kitsubito) green — gnu/windows release/update/apply/propagate suites UNCHANGED (musl additive).\n 27|- **The int gate is a real cut**: assemble a **draft/test release** carrying the musl artifact, then on a **static musl binary running on a sub-2.39-glibc box**:\n 28|  - `spt update fetch` → gets the musl artifact (NO `NoArtifactForPlatform`)\n 29|  - verifies SHA256 + Ed25519 signature **over the musl bytes**\n\nShowing files 1-20 of 75+. Use skip=20 for the next page, or narrow paths/pattern.\n\n[Some lines truncated to 512 chars]"}],"details":{"scopePath":".claude, docs, C:/Users/decid/AppData/Local/spt-core","searchPath":"C:\\Users\\decid","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":54,"fileCount":20,"files":[".claude/doyle-to-todlando.md",".claude/flynn-commune.md",".claude/reports/2026-07-10-hertz-session/02-mesh-isolation-rca.md",".claude/reports/2026-07-10-hertz-session/03-cli-project-index-latency-rca.md",".claude/reports/2026-07-10-hertz-session/README.md",".claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt",".claude/reports/2026-07-17-registry-stall-rca/README.md",".claude/todlando-commune.md",".claude/todlando-to-doyle.md","docs/BROKER-BRAIN-SPLIT-RESTORATION.md","docs/DEFERRED.md","docs/DORMANCY-BUDGET.md","docs/F-030-PSYCHE-EPHEMERAL-DESIGN.md","docs/FLAKE-LEDGER.md","docs/INJECT-SETTLE-REARM-GATE-VERDICT.md","docs/KNOWN-HAZARDS.md","docs/MESH-RECOVERY-TRIAGE.md","docs/MUSL-RELEASE-HANDOFF.md","docs/MUSL-W1-DISPATCH-RULING.md","docs/MUSL-W3-DISPATCH-RULING.md"],"fileMatches":[{"path":".claude/doyle-to-todlando.md","count":1},{"path":".claude/flynn-commune.md","count":1},{"path":".claude/reports/2026-07-10-hertz-session/02-mesh-isolation-rca.md","count":10},{"path":".claude/reports/2026-07-10-hertz-session/03-cli-project-index-latency-rca.md","count":3},{"path":".claude/reports/2026-07-10-hertz-session/README.md","count":2},{"path":".claude/reports/2026-07-16-redispatch-truth/hertz-refresh-rca.txt","count":1},{"path":".claude/reports/2026-07-17-registry-stall-rca/README.md","count":4},{"path":".claude/todlando-commune.md","count":2},{"path":".claude/todlando-to-doyle.md","count":1},{"path":"docs/BROKER-BRAIN-SPLIT-RESTORATION.md","count":1},{"path":"docs/DEFERRED.md","count":2},{"path":"docs/DORMANCY-BUDGET.md","count":2},{"path":"docs/F-030-PSYCHE-EPHEMERAL-DESIGN.md","count":1},{"path":"docs/FLAKE-LEDGER.md","count":5},{"path":"docs/INJECT-SETTLE-REARM-GATE-VERDICT.md","count":1},{"path":"docs/KNOWN-HAZARDS.md","count":12},{"path":"docs/MESH-RECOVERY-TRIAGE.md","count":2},{"path":"docs/MUSL-RELEASE-HANDOFF.md","count":1},{"path":"docs/MUSL-W1-DISPATCH-RULING.md","count":1},{"path":"docs/MUSL-W3-DISPATCH-RULING.md","count":1}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# .claude/\n## doyle-to-todlando.md\n 40│\n*41│Your b2 leg (SPT_ENDPOINT_ID perch-gated, label-only) matches the field evidence — both our live sends stamp cli@HFENDULEAM under installed v0.30.6, which predates it. perri rider (OWL_SESSION_ID unexported → export restores detect leg a) noted; I'll carry that to perri when W4 merges.\n 42│\n 43│## Order of work (binding)\n 44│\n## flynn-commune.md\n 6│<live-context>\n*7│Agent identity: flynn, spt-mobile perch on node HFENDULEAM. Session ended via /exit with no task content — nothing to report.\n 8│</live-context>\n## todlando-commune.md\n  1│<live-context>\n *2│I am todlando, build-lane live agent on spt-core (HFENDULEAM; co-located: doyle=triage/gate, deployah=publish, perri=adapter, flynn=mobile, lia, hertz=roadblock-RCA). Operator: Reavo End.\n  3│\n  4│Standing working rules (burned-in / ruled):\n  5│- Messaging: `spt send <target>` for ALL agent traffic (SENT/QUEUED both = success, never retry). Long bodies from FILE, short printf-piped.\n   │...\n 10│- Per-wave REQ stage flips ride IN build commits with evidence tags; re-home [impl->] tags when moving code.\n*11│- hfenduleam = dev box + CI runner + gate box + live-daemon host: NO local suites while a CI test job runs here; NEVER kill installed-bin spt.exe; sweep target\\debug spt.exe orphans SCOPED by ExecutablePath before xtask/battery (bit me twice this milestone — os-error-5 on spt.exe = leaked orphans, not code).\n 12│- nextest: pure -E only. Repo NOT fmt-clean — never wholesale cargo fmt.\n 13│- Roles binding: doyle GATES, todlando BUILDS, deployah PUBLISHES, hertz RCAs roadblocks (nobody fixes an ungrounded red; 30-min-ungrounded → hertz) — hand off even when lanes look parked.\n 14│- CAVEMAN MODE hook active — terse user-facing replies, full technical substance.\n## todlando-to-doyle.md\n 30│  compile-verified — CI is runtime authority) + send-stamp detect leg (b2):\n*31│  SPT_ENDPOINT_ID perch-gated (label-only). Your hook-shell `from=cli@HFENDULEAM`\n 32│  datapoint = exactly what leg (b2) fixes, IF your hook shell exports\n 33│  SPT_ENDPOINT_ID (mine does); OWL_SESSION_ID reaches shells UNEXPORTED —\n 34│  adapter-side export is the perri fix that restores leg (a) too.\n\n## reports/\n\n### 2026-07-10-hertz-session/\n#### 02-mesh-isolation-rca.md\n   8│\n  *9│HFENDULEAM and ENLYZEAM became entirely sequestered from every remote node on their member subnets, including each other, while `spt daemon status` reported `running: true`, `net_up: true`, fresh pump heartbeat, and normal durable subnet counts.\n  10│\n  11│## Reproduction\n  12│\n    │...\n  14│\n *15│- HFENDULEAM reported only itself online and every remote node offline.\n  16│- ENLYZEAM reported only itself online and every remote node offline.\n  17│- Daemon logs repeatedly reported `PUMP_PEER_FAIL:<peer>:submit-dial exceeded the 10s bound` for all targets.\n  18│\n    │...\n  20│\n *21│- Tailscale HFENDULEAM↔ENLYZEAM direct ping: approximately 12 ms both directions.\n  22│- Both reached a healthy reference machine.\n  23│- Both daemon PIDs owned UDP listeners.\n *24│- HFENDULEAM's inbound SPT UDP firewall rule was enabled for all profiles.\n  25│- SPT_DEV and BIGNET seeds/epochs matched.\n  26│- `detached` was empty on both machines.\n  27│- Clock offsets were approximately +0.003 s and −0.135 s, far below the 30-second rendezvous step.\n    │...\n  42│\n *43│- HFENDULEAM's peer-address cache lacked ENLYZEAM's exact key.\n *44│- ENLYZEAM's cache lacked HFENDULEAM's exact key.\n  45│- Both `roster.json` files contained correct, current direct addresses and matching key/address identities.\n  46│- The pump ignored those roster addresses and continued all-peer ten-second timeouts.\n  47│\n    │...\n  53│\n *54│- HFENDULEAM: outer `5ff…` → nested ENLYZEAM ID `ecb39…`.\n *55│- ENLYZEAM: outer `5ff…` → nested HFENDULEAM ID `14ef…`.\n  56│\n  57│Current rosters are correct. `gapfill_peeraddrs` can persist `RosterEntry.pubkey_hex -> RosterEntry.address`, and `PeerAddrStore::put` validates neither the outer key nor `outer key == address.id` (`seedproofx.rs:862-879`; `peeraddrs.rs:80-93`). Fill-only behavior preserves historical corruption after the roster is corrected.\n  58│\n *59│This defect poisons reachability to the real `5ff…` member and proves the cache accepts invalid mappings. It amplifies isolation but did not cause deletion of the current HFENDULEAM/ENLYZEAM keys; its historical producer remains unproved.\n  60│\n  61│## Why status remains green\n  62│\n    │...\n 109│\n*110│Build-time cross-check: Todlando preserved the 2026-07-14 HFENDULEAM pump-stall evidence at `C:/spt-diag/pump-stall-2026-07-14/`. Its restart-cured behavior may fit this class and should be compared against the planned lifecycle assertions.\n#### 03-cli-project-index-latency-rca.md\n  8│\n *9│Commands including `spt endpoint list --json` and bare/partial `spt endpoint run` take 15–35 seconds. Removing HFENDULEAM from every subnet did not improve latency.\n 10│\n 11│## Reproduction\n 12│\n*13│Measured on HFENDULEAM:\n 14│\n 15│| Command | Wall time |\n 16│|---|---:|\n   │...\n 43│\n*44│HFENDULEAM had 13 local perches and 7 project branches. Minimum branch work was therefore:\n 45│\n 46│`13 × (1 branches_by_recency + 7 read_at_tip) = 104` sequential Git operations,\n 47│\n#### README.md\n  3│**Date:** 2026-07-10\n *4│**Purpose:** Triage-ready reports for issues diagnosed on HFENDULEAM/ENLYZEAM during this session.\n  5│**Constraint observed:** No live daemon or online endpoint was stopped, restarted, or killed during diagnosis.\n  6│\n  7│## Reports\n   │...\n 12│2. [`02-mesh-isolation-rca.md`](02-mesh-isolation-rca.md)\n*13│   HFENDULEAM/ENLYZEAM self-sequester through a peer-address deletion trap: a failed dial deletes the exact route, retry falls to failing ID-only discovery, and correct roster addresses are ignored until a successful connection that cannot occur. Includes a separate persisted cache key/ID invariant defect and honest-health requirements.\n 14│\n 15│3. [`03-cli-project-index-latency-rca.md`](03-cli-project-index-latency-rca.md)\n 16│   `endpoint list` and picker startup synchronously spawn 100+ Git processes to derive informational project metadata. Proposed work: persistent daemon-maintained materialized project index, asynchronous generation-aware refresh, event-driven invalidation, atomic last-known-good storage, and zero synchronous Git on CLI read paths.\n\n### 2026-07-16-redispatch-truth/\n#### hertz-refresh-rca.txt\n 15│\n*16│Field evidence on HFENDULEAM:\n 17│- Brain generations 2 and 3 both log `BRAIN_RESUMED: re-established 7 session cursor(s)` and `BRAIN_NET_CONSUMERS_UP`.\n 18│- During those generations the new dispatcher logs failures for persistent and historical streams: `DISPATCH:741:Failed(\"No process is on the other end of the pipe. (os error 233)\")`, `DISPATCH:3:Failed(\"failed to fill whole buffer\")`, `DISPATCH:4496:Failed(...)`, and `DISPATCH:4176:Failed(...)`. The very low and current-looking stream IDs in the same fresh generation are consistent with indiscriminate historical replay; the failures prove one-shot redispatch workers were abandoned. They are supporting e...\n 19│- Detach + `spt rc` reattach restores each session without restarting its hosted PTY, proving the PTY itself did not freeze.\n\n### 2026-07-17-registry-stall-rca/\n#### README.md\n  62│Date: 2026-07-16/17 UTC\n *63│Node: HFENDULEAM\n  64│Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n  65│\n  66│EXECUTIVE VERDICT\n    │...\n  72│claiming one hash per brain start. This alone predicts 61.29 MiB/s reads; measured brain reads\n *73│were 63.91 MiB/s.\n  74│\n  75│B. Periodic Registry feeds create historical stream state that is not retired on the sender, is\n  76│repeatedly enumerated by the dispatcher, and on receiver replay performs repeated full registry\n    │...\n  87│  p95 CPU: 29.2% of one logical core\n *88│  read throughput mean: 63.91 MiB/s\n  89│  threads: 18-24\n  90│  active CPU threads over 5s: 5\n  91│\n    │...\n 124│Observed:\n*125│  63.91 MiB/s\n 126│Prediction error:\n 127│  4.1%\n 128│\n\n# docs/\n## BROKER-BRAIN-SPLIT-RESTORATION.md\n 36│2. By explicit design, `applyhost.rs:36-38` states: *\"The daemon's own resident loops keep running the old logic until its next restart (`ensure_running` spawns the executable path — now the new binary); that restart is routine lifecycle, never an endpoint cycle.\"*\n*37│3. So new code only goes live on a *subsequent, unrelated* daemon restart (next logon, or a manual restart — which is what made the *other* node, `hfenduleam`, show a new pid). The practical consequence on `enlyzeam`: `gerald`'s live daemon kept running 0.3.0 — including the message-envelope codec — so the box from the original bug report **was still reproducing the original `\\r` corruption even though the fix sat on disk.**\n 38│\n 39│The operator then asked the real question this document answers: **what would it take to make an update actually hand off to the new executable seamlessly — no dropped processes, internal loop timings consistent across the swap, plus any other angles that matter?**\n 40│\n## DEFERRED.md\n 31│| CLI nounification (M8 candidate; ratified shape from the 2026-06-06 grill): `spt endpoint` namespace absorbs fork/suspend/wake/shutdown/rename/stop/digest + `access` (per-endpoint store — NOT subnet-scoped) + `description` (ex-`resources` blurb; bare = show, `set` = author); `spt endpoint list [--local\\|--subnet <name>]` = merged listing, default all-subnets grouped by subnet, SELF endpoint pinned distinctly at top (bare `spt endpoint` = this list); agent HOT PATH stays flat (`send`/`ring`/`ready`/`w...\n*32│| ~~Node label for an endpoint-less node (REQ-SUBNET-3 gap)~~ **SHIPPED 2026-06-08** (option 2 — node-level presence datum): a peer with **zero endpoints** rendered as a bare key-prefix in `status --nodes` because `node_label` only rode endpoint `Instance` rows. FIX: a node-LEVEL carrier — `SubnetRegistry.node_labels` (node→label) + a `NodeLabelUpdate` feed record riding the existing registry replication stream as an untagged `RegistryFeedRecord` variant (instance bytes unchanged → mixed-version ...\n 33│| **Instant + never-seen peer hostname via pairing-time capture (REQ-SUBNET-3 follow-up; the deferred \"option 1\")**: the shipped node-level label (option 2) is GOSSIP-ONLY, so a peer's name is learned only from a pump round while it is alive. Two residual gaps remain after the eviction fix below: (a) ~1 gossip cadence to appear after a join (the joiner trust-pins by pubkey with `label=None`; the hostname arrives next pump round — enlyzeam↔kitsubito converged to `ENLYZEAM` after a cadence, fine but no...\n*34│| ~~Subnet-scoped liveness probe (REQ-SUBNET-5 detach gap)~~ **SHIPPED 2026-06-08** (REQ-SUBNET-5 int stage): `subnet status --nodes` showed a DETACHED peer as **online** because liveness fell to `Probe` → a raw transport dial by node-pubkey, which succeeded on the peer's still-bound daemon endpoint (one ALPN `spt-core/net/0` serves all subnets, so the dial was subnet-blind). FIX: a new `ServeProbeRecord` (spt-net `serveprobe`) + daemon `serveprobe` handler/requester ask the peer \"serving subnet X?\", a...\n 35│| **Subnet full-mesh visibility (PLANNED MILESTONE — `SUBNET-MESH-PLAN.md`)**: non-directly-paired members never see each other — a subnet is currently the PAIRING GRAPH, not a mesh (A↔B, C↔B; B offline → A and C invisible; even with B online, B doesn't relay). Root: pairwise TOFU trust (`trust.rs`) + own-rows-only gossip / no transitive relay (`peerloop.rs`, KH 4.10/7.5) + no member roster in the pairing seed transfer. FIX = member-AUTHENTICATED subnet data (seed-MAC and/or per-node signatures...\n 36│| `xtask debug-converge` — automated convergence watcher for debug rollout (the REQ-UPD-6 first-slice item ADR-0016 names): watch every expected debug-pinned reachable lab node until all report the target version applied, else a per-node timeout table (Offline / StagedAwaitingConsent / BlockedByBrokerResources / Rejected{reason}). Activates REQ-UPD-6's `int` stage. Full build plan: `docs/DEBUG-CONVERGE-PLAN.md` | REQ-UPD-6 first slice (2026-06-06) | The first slice ships manual \"Apply and observe\" (`DE...\n 37│| **Origin-source update bootstrap (`spt update fetch` — pull the latest signed release from GitHub into the existing verify→stage→apply pipeline)**: today update DISCOVERY is **peer-only** (REQ-UPD-1: a daemon pulls offers from roster peers via `request_update`; `propagate.rs`/`peerloop.rs`). There is NO origin fetch, so the **first node in a fleet — or any isolated/solo node — cannot get a new release without a peer that already staged it** (the fleet converges by gossip, but only *after* a m...\n## DORMANCY-BUDGET.md\n 43│\n*44│### HFENDULEAM (Windows 11, 2026-06-04, local run)\n 45│\n 46│5 × `cmd` (shell seat — the floor):\n 47│\n   │...\n 70│floor is its measurement; the adapter-class number generalizes from\n*71│HFENDULEAM's, the harness binary being the same node runtime there):\n 72│\n 73│| metric | per-seat |\n 74│|---|---|\n## F-030-PSYCHE-EPHEMERAL-DESIGN.md\n 40│(lifecycle.rs:338) plus role-local extras — no `{subnet}`, no `{home}`. On\n*41│hfenduleam (2 subnets since BIGNET joined 7/3) the runner died instantly,\n 42│the daemon re-hosted, ~5 s churn forever: hall-bf-psyche ordinal 6491+, at\n 43│one point 54 stamped host attempts. Adapter v0.13.4 made the death LOUD\n 44│(`PSYCHE_POLL_FAIL`), but residency remains structurally impossible there.\n## FLAKE-LEDGER.md\n 14│| 5 | `spt-daemon attach.rs:600` re-serve (`output gap: got seq 1 want 0`) | 1× kitsubito Linux (2026-06-15 run 27545857429, PR #14 stale-base CI) | re-serve replays the buffered output stream on re-attach; under load the new subscriber observed `seq 1` before `seq 0` — an ordering/timing gap in the re-serve sequence assert, not a content error. Subsystem disjoint from the triggering change (PR #14 = digest-proof CLI key-fill, cannot touch attach sequencing) | OBSERVED 1×: did NOT reproduce on the cl...\n*15│| 6 | `spt-term tests/stream.rs:49 bounded_backpressure_stalls_an_unconsumed_reader` | 1× hfenduleam Windows (2026-06-15 run 27545857429, PR #14 stale-base CI) | asserts an unconsumed bounded stream stalls the writer-side reader; got `16 -> 82` (reader advanced past the bound) — a timing-sensitive backpressure assert racing the bound check under hosted-runner load. Subsystem disjoint from PR #14 (digest-proof CLI) | OBSERVED 1×: did NOT reproduce on the clean-base rerun (green both runners). Not hard...\n 16│| 7 | `spt-daemon::attach attach_survives_target_brain_restart_exactly_once` | 1× kitsubito (2026-06-16 run 27595180782 attempt 1, M11-W3) | **TIMEOUT, not an assertion fail** — SLOW>60>120>180>TERMINATING, nextest TIMEOUT at the 240s cap (`attach.rs:600`). A heavy multi-process brain-restart-exactly-once test on the slow shared kitsubito box under concurrent load (n1-gate on the same runner + a parallel `ci.yml` docs-publish run firing simultaneously). W3-INDEPENDENT: Windows green end-to-end; ALL tu...\n 17│| 8 | CI build step `Build notify-shell` (kitsubito Linux) | 1× kitsubito (2026-06-16 run 27652755792 attempt 1, v0.8.1 PR #17) | crates.io dep-download blip during the notify-shell build — `download of config.json failed, curl failed` fetching `serde_json`: a transient registry/network fetch failure on the runner, not a code or test fault (a real dep break fails both runners deterministically; this hit one runner once) | observed; cleared by `gh run rerun --failed` (attempt 2 green, builds reused). H...\n 18│| 9 | `spt dummy_harness_e2e` (BOTH tests: `endpoint_run_brings_up_a_long_lived_dummy_harness_and_rc_attaches` + `endpoint_run_attach_awaits_online_before_attaching`) | 1× kitsubito (2026-07-05, REMOTE-TRUTH Batch-2 re-gate @f2a799e; roles swap run-to-run) | **process-global `set_var` race in a multi-test e2e binary.** Both tests `std::env::set_var(\"SPT_HOME\", own_tempdir)` then do IN-PROC reads (`perch::spt_home`/`adapters_dir`, `registry::register`, psychebin `fs::copy` staging). One file = one test b...\n*19│| 10 | `spt-store registry::tests::concurrent_registration_never_locks` | 1× hfenduleam local gate (2026-07-05, REMOTE-TRUTH Batch-2 bless matrix @3f6f327, fresh worktree, `nextest --workspace --no-fail-fast`) | 16-concurrent-writer SQLite registration gate FAILED at 5.63s — the SQLITE_BUSY load-contention class ALREADY documented at `db.rs:60`: box saturated by the 1588-test full-parallel suite meant a writer couldn't schedule its retry inside the default 5s `registry_busy_timeout`. Isolated ×5: gre...\n 20│| 11 | `spt-daemon::resume resume_mode_brain_spawning_new_sessions_delivers_each` | 1× kitsubito (2026-07-05 run 28768663321 attempt 1, REMOTE-TRUTH [twohost] PR #52) | Phase-B heavy-class timing EOF — \"session exited before the expected output arrived\" (UnexpectedEof) at 62s under the serialized heavy pool. SAME FAMILY as this file's prior Linux-CI flake (7940318, D4-2b: sequential spawn/read hardening) — a spawned session's exit raced the expected output read on the slow shared box. File untouched...\n*21│| 12 | `spt-daemon::input_ack_deadlock input_flood_through_serve_attach_does_not_deadlock_broker` | 1× hfenduleam local gate (2026-07-06, REMOTE-TRUTH F-2 matrix @a21bc6b, `nextest --workspace --no-fail-fast`) | deadline-margin under full-suite load: the flood exchange's `recv_timeout(30s)` (input_ack_deadlock.rs:512) blew under the 1608-test parallel pool + 7 leaky daemons — FAIL at 34.5s vs ~32s natural runtime isolated (the margin is ~3s by design). Subsystem disjoint from the triggering commit (F-...\n*22│| 13 | `spt::bin cli::tests::probe_all_cap_batches_into_windows` | 1× hfenduleam local gate (2026-07-06, stack matrix @0f08fa9 leg-3 rerun) | fast unit (0.52s natural) FAILED at 1.7s under the 1614-test full-parallel pool — probe-batching window assert with a timing component starved under load; subsystem disjoint from the triggering stack (F-2 reporting / E-2 grid title / picker rider). Isolated ×5: green, 0.52–0.55s. Same night as #12 — the full-parallel local matrix under a busy box is the com...\n*23│| 14 | `spt::bin rc::tests::attach_viewport_reconnects_across_a_broker_bounce` | 1× hfenduleam local gate (2026-07-06, WORKER-TRUTH W-3 build @worker-truth, `nextest -p spt --bin spt` full-parallel 360-test run) | **TIMEOUT, not an assertion fail** — SLOW>60…>TERMINATING at the 240s cap under the 360-way `--bin spt` pool. A REAL-broker + broker-bounce reconnect UNIT test (rc.rs:2071) that escaped the HEAVY-class serialization: the Phase-A/B split + `heavy-broker-pty` test-group target integration te...\n## INJECT-SETTLE-REARM-GATE-VERDICT.md\n 23│- Proven env-driven: same test PASSES with `SPT_INJECT_VERIFY_ECHO` unset (deterministic both ways). Linux passed because its ssh env is clean.\n*24│- **CI-safe:** the var is **Process-scope only** (User/Machine scope empty) — the GitHub Actions runner service (hfenduleam, separate process tree) does NOT inherit it → PR CI runs clean. The clean-env full re-run (1707/1707) = CI's actual condition.\n 25│- The fix touches only Layer-1 settle; Layer-2 echo-verify is untouched W5-A code. The failure is orthogonal to the change.\n 26│\n 27│## Follow-up SEED (non-blocking; filed to todlando)\n## KNOWN-HAZARDS.md\n 151│<!-- [doc->REQ-HAZARD-REGISTRY-DIR-CREATE] -->\n*152│- **Failure:** `Connection::open` creates the database FILE but never its parent DIRECTORY. On a fresh home (first boot, fresh CI `_work` dir) a registry op that runs before any perch-creating op (`create_dir_all` side effects) fails `SQLITE_CANTOPEN` — \"unable to open database file …owlery\\.registry\". Timing-dependent: whichever code path touches the home first decides the outcome, so it surfaces as a parallel-test flake (bind-first tests losing the dir-creation race to perch-first tests). Bit the h...\n 153│- **Invariant:** every SQLite store's open path `create_dir_all`s its parent dir itself, best-effort, before `Connection::open` — never relying on another subsystem having materialized the home first. (Mirrors the spool, which always did this; the registry didn't.)\n 154│- **spt-core mapping:** `spt_store::registry::open_registry` (`create_dir_all(owlery)` before open). `spt_store::spool::open_spool_at` already creates its perch dir. Any future SQLite store must do the same — pair this with the 4.7 pragma ordering on every new store.\n 155│\n    │...\n 157│<!-- [doc->REQ-HAZARD-REGISTRY-GHOST-ROWS] -->\n*158│- **Failure:** the registry's only superseding mechanism is the per-`(endpoint_id, node)` epoch lease (4.8) — a row is replaced only by a newer row *from the same node*. When a node identity dies permanently (machine retired, or `node.key` regenerated so the \"node\" never speaks again), its rows are never superseded and never expire: they sit in the in-memory registries and the `identity/registry/<subnet>.json` snapshots forever. A bare-id send then resolves the same endpoint id on both the live and the...\n 159│- **Invariant:** registry rows authored by a **silent** peer node decay: a node not *heard* (admitted inbound feed — the M7 D2 heard-map, REQ-SUBNET-1) within the eviction window (`registry_evict_after_ms`, default 300s ≈ 10 default pump cadences) has its rows **evicted** from every subnet registry, snapshots rewritten. Own rows never decay (the node always hears itself implicitly — it authors them each pump tick). Eviction is safe under the lease: v1 has **no transitive gossip**, so any future upd...\n 160│- **spt-core mapping:** `spt_net::net::registry::SubnetRegistry::evict_nodes` (model) + `spt_daemon::registryhost::RegistryHost::evict_silent_peers` (heard-map TTL) driven from the registry pump tick (`peerloop`). Trust rows are NOT auto-evicted (trust is a user decision; a stale trust row only costs dead dials) — pruning those is a separate verb.\n 161│- **Source:** M7 acceptance run 2026-06-06 (DEFERRED.md \"Ghost registry row eviction\"); the AMBIGUOUS render fix rode along.\n    │...\n 232│- **spt-core mapping:** `spt-daemon::peerloop::due` (the sole cadence gate behind `due_reg`/`due_notif`/`due_sync`/`due_upd`); cadence legs are `Option<Instant>` seeded `None`.\n*233│- **Source:** spt-core CI failure, 2026-06-07 — Windows runner `hfenduleam` (just booted) panicked the peer pump at the v0.1.1 release gate.\n 234│\n 235│### 5.10 `sudo spt` dead-ends on a user-local install (secure_path)  `[REQ-HAZARD-SUDO-SECURE-PATH]`\n 236│- **Failure:** the elevation-gated commands (`subnet create` / `subnet join` / `show-code`) refuse when unelevated and tell the user to \"run as administrator / root\". The user types the obvious `sudo spt subnet create FOO` → `sudo: spt: command not found`. `spt` is a user-local install (`~/.local/bin`, `~/.cargo/bin`), and sudo's `secure_path` (a `/etc/sudoers` default) does NOT include those dirs, so a bare command name doesn't resolve under sudo. The guidance is a trap: it names an action that cannot...\n    │...\n 331│- **D1 (restoration skeleton, ADR-0018 Q2/Q3):** the process boundary is restored — `spt daemon run` is the broker process and spawns a supervised `spt daemon brain` child (`brainproc.rs`); the broker survives the brain dying and respawns it (proven in production topology by `crates/spt/tests/brain_split.rs`). The logic loops still run broker-side (D2 migrates them); the `int` process-level survival E2E + the in-process re-point land at D7.\n*332│- **Closed out (2026-06-11, v0.4.0–v0.4.2):** the two-process model shipped (v0.4.0); the D7 `int` E2E (`brain_survive.rs`) + the N-1 gate prove process-level survival onto swapped bytes and re-pointed REQ-DAEMON-2 / REQ-UPD-3. The v0.4.1 fleet-verify proved this Windows-seamless (hfenduleam: brain pid rolls, broker held, `exe_hash` flips, no manual bounce) but exposed a **Linux** respawn-path gap — the resident broker respawned the brain via per-spawn `current_exe()`, which on Linux follows the `app...\n 333│\n 334│### 6.8 No irreversible durable-state migration before update ready-promotion `[REQ-HAZARD-ROLLBACK-STATE-COMPAT]`\n 335│- **Failure:** the readiness-gated auto-rollback (ADR-0018 Q7) spawns the *previous* binary against durable state the *new* brain already wrote. The first release that migrates a durable-state schema in place would make the old binary unable to read it — silently bricking rollback exactly when it is needed (a logic-bricking update that can no longer fall back).\n    │...\n 356│### 6.11 Brain respawn must exec the APPLIED bytes, not the renamed old binary (Linux `current_exe` follows the apply-rename; readiness ≠ new-bytes) `[REQ-HAZARD-BRAIN-RESPAWN-PATH]`\n*357│- **Failure:** the broker respawns the brain candidate from `std::env::current_exe()` resolved **per spawn** (`brainproc.rs:817`). `spt update apply` swaps the binary by renaming the running file `spt` → `spt.old-N` and writing the new bytes at `spt`. On **Linux**, `current_exe()` = `readlink(/proc/self/exe)` is **inode-tracking** and follows the rename to `.old-N`, so the resident broker respawns the brain onto the **OLD** bytes — the brain comes up ready (readiness passes), the trial **promotes**, ...\n 358│- **Invariant:** the candidate-binary default is the canonical exe path **captured once at broker start** (before any `apply` can rename under the process), never a per-spawn `current_exe()` — giving Linux the path-at-start semantics Windows already had. AND promotion is **bytes-gated**: a trial promotes only if the candidate's stamped `brain.ready` `exe_hash` equals the staged artifact's hash for this platform; a mismatch is a failed trial → auto-rollback + loud notif (readiness alone is not proof t...\n 359│- **spt-core mapping:** v0.4.2 fix (`V042-PLAN.md`). Half 1 = `spawn_brain_supervisor` canonical-exe capture threaded into `spawn_brain_child`'s `None` default; Half 2 = the promotion bytes-gate in `supervise_brain`'s `Promoted` arm (`TrialEnv::ready_exe_hash` + `staged_artifact_hash`). The rollback path (`Some(.old-N)` selection) is unchanged. Sibling of 6.7 — the broker *process* is correct; the bytes it respawned the brain ONTO were not.\n 360│- **Origin:** ADR-0018 Q3 silently assumed `current_exe()` path-string semantics; surfaced by the v0.4.1 fleet-roll `exe_hash` bytes assert (agents `todlando` + `doyle` + `deployah`, 2026-06-11). ADR-0018 Q3 amended.\n    │...\n 402│<!-- [doc->REQ-HAZARD-PUMP-IPC-DEADLINE] -->\n*403│- **Failure:** the peer pump is a SINGLE thread driving every leg (registry/notif/sync/update) against every peer over ONE brain-IPC client. Its reply reads (`net_open_stream`, `net_stream_send`, `net_dial`, and the sync/update pull `read_event` loops) were `loop { read_event() }` with no deadline. When a peer's QUIC path black-holes, the broker's stream-open/send awaits the dead peer and never sends the reply, so the brain's `read_frame` blocks FOREVER and the pump freezes mid-round. The heartbeat (loop...\n 404│- **Invariant:** in PUMP mode the brain carrier is **SPLIT at construction** — a dedicated `pump-ipc-reader` thread does blocking `read_frame` on the `RecvHalf` and forwards each framed result down a channel; the main thread writes on the `SendHalf` and reads with `Receiver::recv_timeout`. Every IPC reply read is bounded by a per-call **total-wait** deadline (`PUMP_PEER_IO_TIMEOUT` = 30s, > any legitimate round-trip, < the 60s QUIC idle; re-armed on stream progress for the streaming pull legs so a heal...\n 405│- **spt-core mapping:** `Brain::cold_start_pump` (splits the carrier + arms the deadline) / `BrainConn::Split` (the `SendHalf` + reader-thread channel) / `call_deadline` / `read_event_until` / `read_frame_until` (the `recv_timeout` dispatch), `pump::run_peer_pump` (connects in pump mode) + `pump::peer_outcome` (the tier-split), the `request_sync`/`request_update` pull loops (deadline re-armed on progress). The broker-side half — the broker must never make a brain wait unbounded on a QUIC op (bound the ...\n*406│- **Source:** field diagnosis 2026-06-11 (the 2.2h hfenduleam wedge); doyle ruling A-now / B-deferred. The stall warning (M8 decision 23) was the band-aid; this is the fix. The B-half landed v0.8.3 (§7.8) after the 2026-06-16 recurrence.\n 407│\n 408│### 7.7 A slow/dead/hostile remote VIEWER must never stall the controller, child, or drain  `[REQ-HAZARD-VIEWER-ISOLATION]`\n 409│<!-- [doc->REQ-HAZARD-VIEWER-ISOLATION] -->\n    │...\n 416│<!-- [doc->REQ-HAZARD-BROKER-QUIC-DEADLINE] -->\n*417│- **Failure:** the broker's brain-facing QUIC handlers (`dispatch_net_dial` / `dispatch_net_stream_open` / `dispatch_net_stream_send`) call into `NetHost::dial` / `open_stream` / `send_stream`, whose iroh awaits (`endpoint.connect` + `prove_membership`; `open_bi`; `write_all`/`finish`) had NO bound of their own. A dead/black-holed roster peer (its process gone, or a mixed-pair that accepts the conn but never answers the seed-proof) makes the broker await its QUIC path FOREVER, so the brain escapes only v...\n 418│- **Invariant:** every brain-waiting QUIC op is wrapped in a broker-side deadline (`NetHost::bounded_block_on` → `tokio::time::timeout`, `BROKER_QUIC_OP_TIMEOUT_MS` = 10s). On elapse the future is DROPPED (cancelling the in-flight connect/stream op, so nothing is half-registered) and a non-`TimedOut` `io::Error` is returned, which the broker REPLIES as an ordinary error frame. The bound (10s) sits comfortably above any legitimate LAN/relay round-trip and 20s below the brain's 30s `PUMP_PEER_IO_TIMEOUT`...\n 419│- **spt-core mapping:** `NetHost::bounded_block_on` (the timeout wrapper) wrapping `NetHost::dial` / `open_stream` (QUIC branch) / `send_stream`; `BROKER_QUIC_OP_TIMEOUT_MS` + `set_quic_op_timeout` (test override, off `NetConfig` — mirrors `set_roster_exchange`). Unit: `bounded_block_on_cuts_a_never_completing_op_with_an_ordinary_error` (a never-completing op → prompt non-`TimedOut` error; a ready op untouched). Int: `dial_to_a_black_holing_peer_fails_with_a_bounded_ordinary_error` (the broker REPLIE...\n*420│- **Source:** the 7.6 B-half — deferred 2026-06-11 (doyle ruling A-now / B-deferred, DEFERRED.md) and shipped in v0.8.3 after the 2026-06-16 hfenduleam recurrence.\n 421│\n 422│### 7.9 A daemon-state wire change needs a deliberate BROKER restart (the broker is resident across a brain self-update)  `[REQ-HAZARD-BROKER-SEED-WIRE-SKEW]`\n 423│<!-- [doc->REQ-HAZARD-BROKER-SEED-WIRE-SKEW] -->\n    │...\n 557│### 7.27 A control/viewer stamp must NEVER outlive its session — every teardown path clears what attach stamped  `[REQ-HAZARD-CONTROL-STAMP-LIFETIME]`\n*558│- **Failure (F-026 #2, live evidence HFENDULEAM):** an spt-hosted endpoint stayed `ONLINE+CONTROLLED` after the operator's RC `/exit` — hours later hall-a's `info.json` still read `controlled:true` (status offline, dormant) and hfenduleam still GOSSIPED `controller_node=self` cross-node (SPT_DEV.json snapshot). ROOT: `/exit` kills the CHILD, not the controller connection, so the endpoint suspends via child termination and the teardown runs the REAP path (`broker.rs` exit-waiter → `sessions.remove(&id...\n 559│- **Invariant:** on session reap the broker clears the perch's control/viewer stamps — `OutputLog::stamp_reaped()` = `set_driven_by(None)` + `set_controlled(false)` + `set_viewer_count(0)` via the known endpoint id — so no teardown path leaves a stamp behind. The broker stays the SINGLE writer; the clear is unconditional (idempotent when already clear) and RACE-FREE — the session is dead, so there is no live controller to re-stamp concurrently (the same argument as 7.15's no-session leg). Best-effo...\n 560│- **spt-core mapping:** impl `broker.rs` `OutputLog::stamp_reaped` + the exit-waiter reap call (before `sessions.remove`); int (real broker+PTY, no mocks) `crates/spt-daemon/tests/control_stamp_lifetime.rs` `reap_clears_control_and_viewer_stamps` (spawn hosted session → the live controller stamps `controlled=true` → latch `driven_by`+`viewer_count` on disk → KILL the child → the reap clears all three; RED-first verified: fix disabled leaves `driven_by=Some`, `controlled=true`, `viewer_count=Some(...\n 561│- **Source:** F-026 W1 #2 (BUILD-F026-PICKERTRUTH; doyle triage + gate, todlando build 2026-07-03).\n    │...\n 567│- **Class rule:** a relative manifest path naming a filesystem location the ENDPOINT reads or writes MUST resolve against the endpoint's own cwd (its `info.json.cwd`, read at USE time), never the daemon's process cwd. A single daemon hosts many endpoints with different cwds, so a relative path frozen or read against the daemon cwd points at a directory no endpoint uses. Keys that resolve via `{cwd}` template substitution (`[digest].source`, `[history].locate_template` — `{cwd}` filled from `info.cwd`) ...\n*568│- **Failure (F-026 SI-1, box-wide, evidence-complete):** the two-tier context BranchStore (`tracked/.seed.git`) held ZERO `a-*`/`p-*` branches on HFENDULEAM despite months of live-agent use — 0 objects, unborn HEAD, no `projects/` worktree checkouts, no commune drop files anywhere (psyche context flowed via the SEPARATE spt-agent-storage sync, masking it). ROOT: `BrainLifecycle::with_config_in` used `manifest.session.commune_dir` / `signoff_dir` VERBATIM (`PathBuf::from`). claude-spt declares `commune_...\n 569│- **Invariant:** drop-dir resolution + project-id derivation happen AT INGEST TIME against the endpoint's fresh `info.cwd` (`pulse_tick`, not frozen at construction): absolute → as-is; relative + a recorded cwd → joined under it; relative + NO cwd → SKIPPED with a LOUD-once `DROP_INGEST_SKIP` diagnostic (never guessed, never the daemon cwd). Project-tier routing is owlery-gated — an owlery-internal anchor (psyche-host session) resolves its drops verbatim but routes NO `p-<project>` branch (empty ...\n 570│- **spt-core mapping:** impl `spt-daemon/src/lifecycle.rs` `resolve_endpoint_drop_dir` + `is_owlery_internal` + `warn_no_cwd_once` + `pulse_tick` (reads `info.cwd`, resolves each drop dir, derives owlery-gated `project_id`) + `spt-live/src/ingest.rs` `route_slices` (empty-project_id skips the project tier); unit `resolve_endpoint_drop_dir_cases` + `is_owlery_internal_cases` (lifecycle.rs) + `empty_project_id_skips_project_tier` (ingest.rs); int (real pulse + real store) `relative_commune_dir_resolves_aga...\n 571│- **Source:** F-026 SI-1 (BUILD-F026-PICKERTRUTH; doyle RCA-gate + design ruling, todlando build 2026-07-03). Hazard-class sweep confirmed commune_dir+signoff_dir the ONLY verbatim instances.\n    │...\n 675│<!-- [doc->REQ-HAZARD-MESH-BOOTSTRAP-TRAP] -->\n*676│- **Failure (paid-for, hertz field RCA 2026-07-10 — HFENDULEAM + ENLYZEAM fully sequestered from every subnet member, symmetric, green-status):** the pump resolved dial addresses from the exact `peer-addrs.json` entry else id-only discovery — never the valid `RosterEntry.address` — and every `PRESENCE_DIAL_FAILED` unconditionally `drop_seed`'d the cached entry, while the cache refilled only after a future successful seed-proof connection. One transient failure converted a warm route into id-only-or...\n 677│- **Invariant:** dial-address resolution is the ROUTE CHAIN — exact cache → validated `RosterEntry.address` (id-match required) → id-only discovery — always fully consulted in order. A failed dial demotes a cached route (suspect), never deletes a sole route; removal happens only via validated-fresher replacement or roster tombstone. Validated roster addresses reconcile into the cache at startup and on roster merge — recovery never requires an already-successful connection or operator state surg...\n 678│- **spt-core mapping:** `spt-daemon/src/pump/mod.rs` `resolve_submit_addr` + `presence_state_effect` (`PRESENCE_DIAL_FAILED` arm); `spt-store/src/peeraddrs.rs` `PeerAddrStore::put`/`drop_seed`; `spt-daemon/src/seedproofx.rs` `gapfill_peeraddrs`; status renders (`daemon status` / `subnet status`).\n 679│- **Source:** MESH-RECOVERY W1 (hertz RCA `.claude/reports/2026-07-10-hertz-session/02-mesh-isolation-rca.md`, doyle seam-verified 2026-07-16; ADR-0039 — amends REQ-CONV-1's falsified \"a stale addr never strands a peer\" drop-on-fail mechanism).\n## MESH-RECOVERY-TRIAGE.md\n  11│**Decision record:** ADR-0039. **Hazard:** KNOWN-HAZARDS 7.42.\n *12│**Field incident:** HFENDULEAM + ENLYZEAM symmetric sequester (2026-07-10),\n  13│both sides `PUMP_PEER_FAIL:<peer>:submit-dial exceeded the 10s bound` for all\n  14│targets, Tailscale ping ~12ms both directions, both `net_up: true`.\n  15│\n    │...\n 118│\n*119│Build-time cross-check (RCA note): compare the 2026-07-14 HFENDULEAM\n 120│pump-stall evidence (`C:/spt-diag/pump-stall-2026-07-14/`) against leg D's\n 121│lifecycle assertions — restart-cured behavior may be this class.\n 122│\n## MUSL-RELEASE-HANDOFF.md\n 17│- update-set stale-serve window ([[release-updateset-stale-window]]): upload-before-flip covers the musl entry.\n*18│- CI flake NOT to be spooked by: `inject_control_wedge::wan_arrival_to_idle_spt_hosted_injects_with_no_hook_poll` is a Windows-box-timing flake on the 80ms inject settle-window (untouched by W3, PASS on kitsubito, green in v0.29.1). If the hfenduleam test leg trips it, sweep leaked `spt.exe` (scoped) + rerun `--failed` — do NOT read it as a musl regression.\n 19│\n 20│Questions → doyle. gnu is unchanged; musl is purely additive.\n 21│\n## MUSL-W1-DISPATCH-RULING.md\n 31│- clippy `--workspace --all-targets -D warnings`; `traceable-reqs check --json` exit 0 (REQ-PLATFORM-REGISTRY +impl +unit).\n*32│- Full `nextest --workspace` BOTH legs (Windows hfenduleam + Linux kitsubito) — release/update/apply/propagate suites unchanged + green.\n 33│- Diff review: no behaviour change for gnu/windows; `SUPPORTED_PLATFORMS` is the single source; applyhost generalized correctly (N-platform, not hardcoded pair).\n 34│- A musl build is NOT required for W1 (that's W2) — but the tree must still compile for a musl target (the `\"unknown\"` fallback stays until W2 adds the arm).\n 35│\n## MUSL-W3-DISPATCH-RULING.md\n 25│- clippy `--workspace --all-targets -D warnings`; `traceable-reqs check --json` exit 0 (`REQ-RELEASE-MUSL-ARTIFACT` +impl +unit +int).\n*26│- Full `nextest --workspace` BOTH legs (Windows hfenduleam + Linux kitsubito) green — gnu/windows release/update/apply/propagate suites UNCHANGED (musl additive).\n 27│- **The int gate is a real cut**: assemble a **draft/test release** carrying the musl artifact, then on a **static musl binary running on a sub-2.39-glibc box**:\n 28│  - `spt update fetch` → gets the musl artifact (NO `NoArtifactForPlatform`)\n 29│  - verifies SHA256 + Ed25519 signature **over the musl bytes**","linesTruncated":true,"meta":{"limits":{"columnTruncated":{"maxColumn":512}}}},"isError":false,"timestamp":1784293036082}}
{"type":"message","id":"2039e78e","parentId":"d78e1194","timestamp":"2026-07-17T12:57:28.993Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Reviewing README for v0.37 details**"},{"type":"toolCall","id":"call_KimmbcVVSgX4mzZSPKipeS3P|fc_0148993141920bab016a5a26b8b870819587d5aba8cd78a23a","name":"read","arguments":{"i":"Reading registry CPU RCA","path":".claude/reports/2026-07-17-registry-stall-rca/README.md","selector":"60-240"}},{"type":"toolCall","id":"call_qTRHjivKjiqdENF4cj1wjod8|fc_0148993141920bab016a5a26b8b8908195abab795c254d5bbe","name":"glob","arguments":{"i":"Mapping registry RCA artifacts","path":".claude/reports/2026-07-17-registry-stall-rca/*","hidden":false,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_kY14f4EDjKczkEmQze9UqedC|fc_0148993141920bab016a5a26b8b8a48195ad34ca9b7141bd15","name":"grep","arguments":{"i":"Finding v037 CPU followup","pattern":"v0\\.37|0\\.37|8\\.39|6\\.44|24/90|27/90|field.?gate|CPU","path":".claude/reports/2026-07-17-registry-stall-rca;docs/REGISTRY-LIFECYCLE-TRIAGE.md;CHANGELOG.md","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_JEIjBEioeYePIHZ9cGyTmTTP|fc_0148993141920bab016a5a26b8b8b08195ae7bf1b2a8e3159a","name":"grep","arguments":{"i":"Finding CPU sample files","pattern":"CPU|cpu|sample|PercentProcessorTime|WorkingSet|ReadTransfer","path":"C:/spt-diag","selector":null,"case":false,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":19740,"output":354,"cacheRead":201216,"cacheWrite":0,"totalTokens":221310,"reasoningTokens":63,"cost":{"input":0.09870000000000001,"output":0.010620000000000001,"cacheRead":0.10060799999999999,"cacheWrite":0,"total":0.209928}},"stopReason":"toolUse","timestamp":1784293036137,"responseId":"resp_0148993141920bab016a5a26ac6f20819592e31884a07e0945","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26af686481959fc5804421a9cd08","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWia4c4JmaS1a-dhJ5gNIOAsHm41ZZ1bz-AKmNmpwNVikfIiTFpEEcnHI86Sj_ozpAtuFYSKKHcNzEmbNe8zphuS6MmaAzDzyGFDIv6FJ8oH0ciWb4PBmJ0Jlz7pJc0EYaKYvlbvibIV5zbDPwhxswmiZ65Z1a0WGX_h8N7bxDP2UzFgwNWDPeBZLdwbNTAMo7kwqeTKYDb5tNZNNaAwlC3k-EOd8kudcAh5ap8-lGKKdobvHeJ4Nlg52PfinzoGhz_v-P3huFOQMlccq34guUVBnfGiWWU8hp91SJDfCtC3fJDxhRvHEyUZQHjM_dVIijJsv5kQGGTbpw6fiFbF-AGzeyNxYka4AddfLDwR3KrCrp_Bcs8qoQv-Ewxb4vTwyZ4JfM8FKjEznlAmqaCMnD-Afm3ox7if8hpoHhz5HNGGQKl6uxPqUY4ijikHHsOjNvM-8tQyWZOBbr30k0AQnRaw-pUw2aUCmcWUohZGWF-xGofVqXz-LC7kUm9JpERZMgd06pShXMO3OyF8d5FRDi9s5V3humZFyRfMt-gDSi3znR0xcTV3mmOT3gv33879FjnGbiFLEmA-7BQOVRp0lbswNIbQRIBJkH60ln8_uOoGT293QFARQ1lSaXzST_jl0pJsIZcrRFjjbbhdmER1_Y_FbB8ft5jVpDl4OXBnjgDdhrP5AP9r8T4OHDYzlRjYT9Bv7kByJJl3CCnqHtpyfoIW3eC-kFgFckyybVd-yNu048OPoXhn-N7PbFUE74l_RXZd4nDUWso6DuOug3qNiUs3KtKwod7iJHbpnxCObJ9R2usQBw7KaJ-szqf83IzXlj5yPG6hl4fgfPgXdEJbc-IlMHVNiyLFzaNX_tsRI7xqcVRibVKeod1m7i8cWlrD0xsFVBvZLuU9T12P9FjgyYj882EVsiA6XoyvgYFnz7QeDRwrMEMDzX1qgOFxmfKpIlYTs3-02VwqDcg4phkrTYIQ639ciWhSp4IBalI3yvv_6viV5hNqKORd0BDuV3hWx8EG0aET0X-PbNmvEsbN9-sCd7R1OcX0ZklfT78IZM01jR__XEoT7vkOabuG73zn9jpFMY3HL4PFd91xiP22YrPfZzVz3Q2aRXqgkrjjf7Z0Wi-NGcVhe8iTPZDbcrb7jmMu49abgItVVsVIeYD_SBohRsamnz04FmmT9HjZjtfP7t8xsZa2eDEwKs0Xaihlt4_fF31roJxsxW5Y1ZlWTTaJvCouEq8eR7t6riUjYYHqGFXTgF-k46X54060UPGyqw87B2zil8-77sPjp9tnHMgsMXqmeWPLSDm7SUDFGhfZ_BC8=","summary":[{"type":"summary_text","text":"**Reviewing README for v0.37 details**"}]},{"id":"fc_0148993141920bab016a5a26b8b870819587d5aba8cd78a23a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry CPU RCA\",\"path\":\".claude/reports/2026-07-17-registry-stall-rca/README.md\",\"selector\":\"60-240\"}","call_id":"call_KimmbcVVSgX4mzZSPKipeS3P","name":"read"},{"id":"fc_0148993141920bab016a5a26b8b8908195abab795c254d5bbe","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping registry RCA artifacts\",\"path\":\".claude/reports/2026-07-17-registry-stall-rca/*\",\"hidden\":false,\"gitignore\":false,\"limit\":100}","call_id":"call_qTRHjivKjiqdENF4cj1wjod8","name":"glob"},{"id":"fc_0148993141920bab016a5a26b8b8a48195ad34ca9b7141bd15","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding v037 CPU followup\",\"pattern\":\"v0\\\\.37|0\\\\.37|8\\\\.39|6\\\\.44|24/90|27/90|field.?gate|CPU\",\"path\":\".claude/reports/2026-07-17-registry-stall-rca;docs/REGISTRY-LIFECYCLE-TRIAGE.md;CHANGELOG.md\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_kY14f4EDjKczkEmQze9UqedC","name":"grep"},{"id":"fc_0148993141920bab016a5a26b8b8b08195ae7bf1b2a8e3159a","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding CPU sample files\",\"pattern\":\"CPU|cpu|sample|PercentProcessorTime|WorkingSet|ReadTransfer\",\"path\":\"C:/spt-diag\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_JEIjBEioeYePIHZ9cGyTmTTP","name":"grep"}]},"duration":12833.85110001266,"ttft":3283.9405000060797,"contextSnapshot":{"promptTokens":220956,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KimmbcVVSgX4mzZSPKipeS3P|fc_0148993141920bab016a5a26b8b870819587d5aba8cd78a23a","toolName":"read","startedAt":"2026-07-17T12:57:28.994Z","args":{"path":".claude/reports/2026-07-17-registry-stall-rca/README.md"},"intent":"Reading registry CPU RCA"},"id":"5af2aa15","parentId":"2039e78e","timestamp":"2026-07-17T12:57:28.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qTRHjivKjiqdENF4cj1wjod8|fc_0148993141920bab016a5a26b8b8908195abab795c254d5bbe","toolName":"glob","startedAt":"2026-07-17T12:57:28.994Z","args":{"path":".claude/reports/2026-07-17-registry-stall-rca/*"},"intent":"Mapping registry RCA artifacts"},"id":"2b2e04b9","parentId":"5af2aa15","timestamp":"2026-07-17T12:57:28.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kY14f4EDjKczkEmQze9UqedC|fc_0148993141920bab016a5a26b8b8a48195ad34ca9b7141bd15","toolName":"grep","startedAt":"2026-07-17T12:57:28.994Z","args":{"path":".claude/reports/2026-07-17-registry-stall-rca;docs/REGISTRY-LIFECYCLE-TRIAGE.md;CHANGELOG.md"},"intent":"Finding v037 CPU followup"},"id":"37d76822","parentId":"2b2e04b9","timestamp":"2026-07-17T12:57:28.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_JEIjBEioeYePIHZ9cGyTmTTP|fc_0148993141920bab016a5a26b8b8b08195ae7bf1b2a8e3159a","toolName":"grep","startedAt":"2026-07-17T12:57:28.994Z","args":{"path":"C:/spt-diag"},"intent":"Finding CPU sample files"},"id":"8b5d57fc","parentId":"37d76822","timestamp":"2026-07-17T12:57:28.994Z"}
{"type":"message","id":"9342e107","parentId":"8b5d57fc","timestamp":"2026-07-17T12:57:28.998Z","message":{"role":"toolResult","toolCallId":"call_qTRHjivKjiqdENF4cj1wjod8|fc_0148993141920bab016a5a26b8b8908195abab795c254d5bbe","toolName":"glob","content":[{"type":"text","text":"# .claude/reports/2026-07-17-registry-stall-rca/\nREADME.md"}],"details":{"scopePath":".claude/reports/2026-07-17-registry-stall-rca","fileCount":1,"files":[".claude/reports/2026-07-17-registry-stall-rca/README.md"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784293048997}}
{"type":"message","id":"bad1b733","parentId":"9342e107","timestamp":"2026-07-17T12:57:29.004Z","message":{"role":"toolResult","toolCallId":"call_KimmbcVVSgX4mzZSPKipeS3P|fc_0148993141920bab016a5a26b8b870819587d5aba8cd78a23a","toolName":"read","content":[{"type":"text","text":"\n```\nHERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\nDate: 2026-07-16/17 UTC\nNode: HFENDULEAM\nSeverity: HIGH performance regression plus post-close REDISPATCH recurrence\n\nEXECUTIVE VERDICT\n=================\nThe two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n4-5-session streaming overhead. Two source defects are independently proven:\n\nA. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\nclaiming one hash per brain start. This alone predicts 61.29 MiB/s reads; measured brain reads\nwere 63.91 MiB/s.\n\nB. Periodic Registry feeds create historical stream state that is not retired on the sender, is\nrepeatedly enumerated by the dispatcher, and on receiver replay performs repeated full registry\nsnapshot rewrites. The live v0.36 log now contains 12 new 15-25s Registry-family\nCONN_WRITE_POISONED incidents. This supersedes the earlier clean-window field verdict: the\noriginal Attach-family freeze is fixed, but the same broad blocking/replay failure class remains\nfor Registry streams.\n\nMEASURED PROCESS ATTRIBUTION\n============================\nPID 58272:\n  command: spt daemon brain --generation 1 --start-reason update\n  20-second mean CPU: 15.5% of one logical core\n  p95 CPU: 29.2% of one logical core\n  read throughput mean: 63.91 MiB/s\n  threads: 18-24\n  active CPU threads over 5s: 5\n\nPID 72488:\n  command: spt daemon run --detached\n  20-second mean CPU: 11.4% of one logical core\n  p95 CPU: 23.4% of one logical core\n  write throughput mean: 3.74 MiB/s\n  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n  active CPU threads over 5s: only 4\n\nHost: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n12.8-32% of one logical core, consistent with the psutil process measurements.\n\nThis is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\nspike.\n\nROOT CAUSE A — HEARTBEAT SELF-HASH LOOP\n=======================================\nExact source chain:\n  crates/spt-daemon/src/brainproc.rs:63\n    BRAIN_HEARTBEAT = 500ms\n  brainproc.rs:259-260\n    infinite heartbeat loop sleeps 500ms\n  brainproc.rs:297\n    write_ready(generation) on every heartbeat\n  brainproc.rs:365-372\n    write_ready calls current_exe_hash every time\n  brainproc.rs:381-384\n    current_exe_hash does std::fs::read(current_exe) then SHA-256 over all bytes\n\nBinary size:\n  32,132,608 bytes = 30.64 MiB\nPredicted at two hashes/second:\n  61.29 MiB/s\nObserved:\n  63.91 MiB/s\nPrediction error:\n  4.1%\n\nThe source comment at brainproc.rs:378-380 explicitly says \"One exe read + hash per brain\nstart.\" Implementation contradicts it by placing the call inside the 500ms heartbeat write.\n\nThis explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\na52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n\nRecommended fix A:\n  Compute current_exe_hash exactly once in run_brain after process start, retain the\n  Option<String>, and pass/reference the cached value for every readiness breadcrumb rewrite. A\n  new brain after update is a new process and therefore computes the new binary hash once,\n  preserving the resident-image diagnostic contract.\n\nRegression seam A:\n  Inject/count the hash provider or extract a cached readiness payload builder; multiple\n  heartbeat writes in one brain generation must invoke executable hashing exactly once while\n  keeping pid/generation/hash stable. A new process/generation fixture must compute\n  independently.\n\nROOT CAUSE B — REGISTRY STREAM HISTORY + REPLAY WRITE AMPLIFICATION\n==================================================================\nProducer lifecycle:\n  crates/spt-daemon/src/pump/registry.rs:153-176\n    every registry pump round advertises local rows per peer/subnet.\n  crates/spt-daemon/src/pump/mod.rs:1116-1122\n    push_feed opens a fresh bidi stream, writes the feed, and FINs it; one stream per feed.\n  Pump cadence is approximately 30s.\n\nSender retention:\n  The sender-created StreamEntry is not retired after fire-and-forget completion.\n  crates/spt-daemon/src/nethost.rs:1825-1855 retire_stream hides eligibility and clears the\n  ring, but deliberately retains physical entry/subscriber until QUIC connection close.\n  The pump connection is long-lived, so sender rows accumulate.\n  nethost.rs:1805-1823 stream_infos filters retired rows but does not server-side exclude\n  initiated_local rows.\n  crates/spt-daemon/src/dispatch.rs:455-469 polls frequently and receives/clones the full\n  historical row set before client-side initiated_local rejection.\n  Result: steady-state enumeration cost is O(total feeds since connection start), not O(active\n  exchanges).\n\nReceiver replay and disk amplification:\n  dispatch.rs:346-369 treats only finished Attach rows as terminal; finished Registry rows\n  remain pending by design because request/reply families may FIN request halves.\n  dispatch.rs:984-1047 serve_registry_feed subscribes from seq 0 and drains replay.\n  nethost.rs:165-221 installs one SubscriberSeat OS writer thread per subscription and writes\n  the complete replay before live frames.\n  dispatch.rs:997-1039 processes each decoded chunk and separately calls apply_node_labels and\n  apply_feed_flips.\n  registryhost.rs:241-342: BOTH apply functions call write_snapshots.\n  registryhost.rs:734-760: write_snapshots serializes and atomically rewrites every subnet\n  registry plus heard.meta.\n  Thus a replay split into multiple 64KiB NetStreamData chunks performs repeated full-state\n  rewrites, twice per chunk when labels and instances coexist. While the brain does this\n  synchronous work, it stops draining IPC; the broker writer fills the pipe, blocks, hits the\n  15s write deadline, poisons, and the dispatcher later retries the replay.\n\nLIVE v0.36 FAILURE PROOF\n========================\nAfter the earlier clean sampling window, the same generation-1 log accumulated 12\nCONN_WRITE_POISONED events. Every classified event is family=Registry, attempt=0, endpoint=-:\n\n  stream 524   elapsed 15,800ms\n  stream 1161  elapsed 15,518ms\n  stream 1347  elapsed 15,924ms\n  stream 3053  elapsed 15,967ms\n  stream 3810  elapsed 16,401ms\n  stream 5600  elapsed 25,363ms\n  stream 5716  elapsed 18,575ms\n  stream 5779  elapsed 16,997ms\n  stream 6139  elapsed 17,461ms\n  stream 6303  elapsed 16,117ms\n  stream 6411  elapsed 20,433ms\n  plus one interleaved event whose matching DISPATCH_EV was beyond the short association window\n\nCanonical example:\n  CONN_WRITE_POISONED: conn=1243 ... stream=524 ... write exceeded its 15000ms bound\n  event=stream-sub-writer-poison replay write failed\n  event=transport-close poisoned=true timed_out=true\n  DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12\n  event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n\nThe events prove the structured key set is emitted, but they do NOT close the prior\nendpoint-identity residual: Registry has no endpoint concept, so endpoint=- is the honest value.\nThe passive residual remains pending until the first natural failure in an endpoint-bearing\nfamily (Attach/Rest/Xfer/ShellLink/WanMsg). The transport/replay behavior is independently\ndefective.\n\nPrimary evidence:\n  C:\\Users\\decid\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log\n  first poison line: 3136\n  latest quantified poison: line 33285 at sampling time\n\nRecommended fix B, ordered:\n  1. Stop sender-history growth: retire locally initiated fire-and-forget Registry feed rows\n     immediately after successful FIN, or give this one-way family explicit terminal lifecycle\n     semantics.\n  2. Filter initiated_local and retired rows inside broker stream_infos before\n     cloning/serializing them to the dispatcher. Do not pay O(history) IPC cost merely to skip\n     client-side.\n  3. Make registry feed application transactional per feed: merge decoded labels/instances in\n     memory and write snapshots once at EOF (or at one bounded batch commit), not separately for\n     labels and instances on every transport chunk.\n  4. Ensure failed Registry replay cannot remain an indefinitely redispatchable poison loop. Fix\n     lifecycle/write amplification at source rather than merely increasing the 15s deadline.\n  5. Audit physical StreamEntry/subscriber teardown on successful one-way completion;\n     eligibility retirement alone deliberately retains entries until connection close and\n     therefore cannot bound long-lived pump-connection resources.\n\nRegression seam B:\n  Real long-lived pump + dispatcher integration test. Run N registry-only rounds over one\n  persistent connection. Assert:\n  - dispatcher-eligible Registry rows plateau at O(active), not N;\n  - physical stream/subscriber/handler counts plateau after completion;\n  - snapshot writes are O(feeds), not O(chunks × record-kinds);\n  - brain refresh produces no historical Registry replay subscriptions;\n  - zero CONN_WRITE_POISONED / replay-write-failed events;\n…\nduring this diagnosis.\n```\n\n[Showing lines 59-243 of 300. Use :244 to continue]"}],"details":{"truncation":{"content":"\n```\nHERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\nDate: 2026-07-16/17 UTC\nNode: HFENDULEAM\nSeverity: HIGH performance regression plus post-close REDISPATCH recurrence\n\nEXECUTIVE VERDICT\n=================\nThe two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n4-5-session streaming overhead. Two source defects are independently proven:\n\nA. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\nclaiming one hash per brain start. This alone predicts 61.29 MiB/s reads; measured brain reads\nwere 63.91 MiB/s.\n\nB. Periodic Registry feeds create historical stream state that is not retired on the sender, is\nrepeatedly enumerated by the dispatcher, and on receiver replay performs repeated full registry\nsnapshot rewrites. The live v0.36 log now contains 12 new 15-25s Registry-family\nCONN_WRITE_POISONED incidents. This supersedes the earlier clean-window field verdict: the\noriginal Attach-family freeze is fixed, but the same broad blocking/replay failure class remains\nfor Registry streams.\n\nMEASURED PROCESS ATTRIBUTION\n============================\nPID 58272:\n  command: spt daemon brain --generation 1 --start-reason update\n  20-second mean CPU: 15.5% of one logical core\n  p95 CPU: 29.2% of one logical core\n  read throughput mean: 63.91 MiB/s\n  threads: 18-24\n  active CPU threads over 5s: 5\n\nPID 72488:\n  command: spt daemon run --detached\n  20-second mean CPU: 11.4% of one logical core\n  p95 CPU: 23.4% of one logical core\n  write throughput mean: 3.74 MiB/s\n  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n  active CPU threads over 5s: only 4\n\nHost: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n12.8-32% of one logical core, consistent with the psutil process measurements.\n\nThis is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\nspike.\n\nROOT CAUSE A — HEARTBEAT SELF-HASH LOOP\n=======================================\nExact source chain:\n  crates/spt-daemon/src/brainproc.rs:63\n    BRAIN_HEARTBEAT = 500ms\n  brainproc.rs:259-260\n    infinite heartbeat loop sleeps 500ms\n  brainproc.rs:297\n    write_ready(generation) on every heartbeat\n  brainproc.rs:365-372\n    write_ready calls current_exe_hash every time\n  brainproc.rs:381-384\n    current_exe_hash does std::fs::read(current_exe) then SHA-256 over all bytes\n\nBinary size:\n  32,132,608 bytes = 30.64 MiB\nPredicted at two hashes/second:\n  61.29 MiB/s\nObserved:\n  63.91 MiB/s\nPrediction error:\n  4.1%\n\nThe source comment at brainproc.rs:378-380 explicitly says \"One exe read + hash per brain\nstart.\" Implementation contradicts it by placing the call inside the 500ms heartbeat write.\n\nThis explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\na52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n\nRecommended fix A:\n  Compute current_exe_hash exactly once in run_brain after process start, retain the\n  Option<String>, and pass/reference the cached value for every readiness breadcrumb rewrite. A\n  new brain after update is a new process and therefore computes the new binary hash once,\n  preserving the resident-image diagnostic contract.\n\nRegression seam A:\n  Inject/count the hash provider or extract a cached readiness payload builder; multiple\n  heartbeat writes in one brain generation must invoke executable hashing exactly once while\n  keeping pid/generation/hash stable. A new process/generation fixture must compute\n  independently.\n\nROOT CAUSE B — REGISTRY STREAM HISTORY + REPLAY WRITE AMPLIFICATION\n==================================================================\nProducer lifecycle:\n  crates/spt-daemon/src/pump/registry.rs:153-176\n    every registry pump round advertises local rows per peer/subnet.\n  crates/spt-daemon/src/pump/mod.rs:1116-1122\n    push_feed opens a fresh bidi stream, writes the feed, and FINs it; one stream per feed.\n  Pump cadence is approximately 30s.\n\nSender retention:\n  The sender-created StreamEntry is not retired after fire-and-forget completion.\n  crates/spt-daemon/src/nethost.rs:1825-1855 retire_stream hides eligibility and clears the\n  ring, but deliberately retains physical entry/subscriber until QUIC connection close.\n  The pump connection is long-lived, so sender rows accumulate.\n  nethost.rs:1805-1823 stream_infos filters retired rows but does not server-side exclude\n  initiated_local rows.\n  crates/spt-daemon/src/dispatch.rs:455-469 polls frequently and receives/clones the full\n  historical row set before client-side initiated_local rejection.\n  Result: steady-state enumeration cost is O(total feeds since connection start), not O(active\n  exchanges).\n\nReceiver replay and disk amplification:\n  dispatch.rs:346-369 treats only finished Attach rows as terminal; finished Registry rows\n  remain pending by design because request/reply families may FIN request halves.\n  dispatch.rs:984-1047 serve_registry_feed subscribes from seq 0 and drains replay.\n  nethost.rs:165-221 installs one SubscriberSeat OS writer thread per subscription and writes\n  the complete replay before live frames.\n  dispatch.rs:997-1039 processes each decoded chunk and separately calls apply_node_labels and\n  apply_feed_flips.\n  registryhost.rs:241-342: BOTH apply functions call write_snapshots.\n  registryhost.rs:734-760: write_snapshots serializes and atomically rewrites every subnet\n  registry plus heard.meta.\n  Thus a replay split into multiple 64KiB NetStreamData chunks performs repeated full-state\n  rewrites, twice per chunk when labels and instances coexist. While the brain does this\n  synchronous work, it stops draining IPC; the broker writer fills the pipe, blocks, hits the\n  15s write deadline, poisons, and the dispatcher later retries the replay.\n\nLIVE v0.36 FAILURE PROOF\n========================\nAfter the earlier clean sampling window, the same generation-1 log accumulated 12\nCONN_WRITE_POISONED events. Every classified event is family=Registry, attempt=0, endpoint=-:\n\n  stream 524   elapsed 15,800ms\n  stream 1161  elapsed 15,518ms\n  stream 1347  elapsed 15,924ms\n  stream 3053  elapsed 15,967ms\n  stream 3810  elapsed 16,401ms\n  stream 5600  elapsed 25,363ms\n  stream 5716  elapsed 18,575ms\n  stream 5779  elapsed 16,997ms\n  stream 6139  elapsed 17,461ms\n  stream 6303  elapsed 16,117ms\n  stream 6411  elapsed 20,433ms\n  plus one interleaved event whose matching DISPATCH_EV was beyond the short association window\n\nCanonical example:\n  CONN_WRITE_POISONED: conn=1243 ... stream=524 ... write exceeded its 15000ms bound\n  event=stream-sub-writer-poison replay write failed\n  event=transport-close poisoned=true timed_out=true\n  DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12\n  event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n\nThe events prove the structured key set is emitted, but they do NOT close the prior\nendpoint-identity residual: Registry has no endpoint concept, so endpoint=- is the honest value.\nThe passive residual remains pending until the first natural failure in an endpoint-bearing\nfamily (Attach/Rest/Xfer/ShellLink/WanMsg). The transport/replay behavior is independently\ndefective.\n\nPrimary evidence:\n  C:\\Users\\decid\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log\n  first poison line: 3136\n  latest quantified poison: line 33285 at sampling time\n\nRecommended fix B, ordered:\n  1. Stop sender-history growth: retire locally initiated fire-and-forget Registry feed rows\n     immediately after successful FIN, or give this one-way family explicit terminal lifecycle\n     semantics.\n  2. Filter initiated_local and retired rows inside broker stream_infos before\n     cloning/serializing them to the dispatcher. Do not pay O(history) IPC cost merely to skip\n     client-side.\n  3. Make registry feed application transactional per feed: merge decoded labels/instances in\n     memory and write snapshots once at EOF (or at one bounded batch commit), not separately for\n     labels and instances on every transport chunk.\n  4. Ensure failed Registry replay cannot remain an indefinitely redispatchable poison loop. Fix\n     lifecycle/write amplification at source rather than merely increasing the 15s deadline.\n  5. Audit physical StreamEntry/subscriber teardown on successful one-way completion;\n     eligibility retirement alone deliberately retains entries until connection close and\n     therefore cannot bound long-lived pump-connection resources.\n\nRegression seam B:\n  Real long-lived pump + dispatcher integration test. Run N registry-only rounds over one\n  persistent connection. Assert:\n  - dispatcher-eligible Registry rows plateau at O(active), not N;\n  - physical stream/subscriber/handler counts plateau after completion;\n  - snapshot writes are O(feeds), not O(chunks × record-kinds);\n  - brain refresh produces no historical Registry replay subscriptions;\n  - zero CONN_WRITE_POISONED / replay-write-failed events;","truncated":true,"truncatedBy":"lines","totalLines":242,"totalBytes":9035,"outputLines":185,"outputBytes":9035,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\n```\nHERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\nDate: 2026-07-16/17 UTC\nNode: HFENDULEAM\nSeverity: HIGH performance regression plus post-close REDISPATCH recurrence\n\nEXECUTIVE VERDICT\n=================\nThe two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n4-5-session streaming overhead. Two source defects are independently proven:\n\nA. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\nclaiming one hash per brain start. This alone predicts 61.29 MiB/s reads; measured brain reads\nwere 63.91 MiB/s.\n\nB. Periodic Registry feeds create historical stream state that is not retired on the sender, is\nrepeatedly enumerated by the dispatcher, and on receiver replay performs repeated full registry\nsnapshot rewrites. The live v0.36 log now contains 12 new 15-25s Registry-family\nCONN_WRITE_POISONED incidents. This supersedes the earlier clean-window field verdict: the\noriginal Attach-family freeze is fixed, but the same broad blocking/replay failure class remains\nfor Registry streams.\n\nMEASURED PROCESS ATTRIBUTION\n============================\nPID 58272:\n  command: spt daemon brain --generation 1 --start-reason update\n  20-second mean CPU: 15.5% of one logical core\n  p95 CPU: 29.2% of one logical core\n  read throughput mean: 63.91 MiB/s\n  threads: 18-24\n  active CPU threads over 5s: 5\n\nPID 72488:\n  command: spt daemon run --detached\n  20-second mean CPU: 11.4% of one logical core\n  p95 CPU: 23.4% of one logical core\n  write throughput mean: 3.74 MiB/s\n  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n  active CPU threads over 5s: only 4\n\nHost: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n12.8-32% of one logical core, consistent with the psutil process measurements.\n\nThis is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\nspike.\n\nROOT CAUSE A — HEARTBEAT SELF-HASH LOOP\n=======================================\nExact source chain:\n  crates/spt-daemon/src/brainproc.rs:63\n    BRAIN_HEARTBEAT = 500ms\n  brainproc.rs:259-260\n    infinite heartbeat loop sleeps 500ms\n  brainproc.rs:297\n    write_ready(generation) on every heartbeat\n  brainproc.rs:365-372\n    write_ready calls current_exe_hash every time\n  brainproc.rs:381-384\n    current_exe_hash does std::fs::read(current_exe) then SHA-256 over all bytes\n\nBinary size:\n  32,132,608 bytes = 30.64 MiB\nPredicted at two hashes/second:\n  61.29 MiB/s\nObserved:\n  63.91 MiB/s\nPrediction error:\n  4.1%\n\nThe source comment at brainproc.rs:378-380 explicitly says \"One exe read + hash per brain\nstart.\" Implementation contradicts it by placing the call inside the 500ms heartbeat write.\n\nThis explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\na52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n\nRecommended fix A:\n  Compute current_exe_hash exactly once in run_brain after process start, retain the\n  Option<String>, and pass/reference the cached value for every readiness breadcrumb rewrite. A\n  new brain after update is a new process and therefore computes the new binary hash once,\n  preserving the resident-image diagnostic contract.\n\nRegression seam A:\n  Inject/count the hash provider or extract a cached readiness payload builder; multiple\n  heartbeat writes in one brain generation must invoke executable hashing exactly once while\n  keeping pid/generation/hash stable. A new process/generation fixture must compute\n  independently.\n\nROOT CAUSE B — REGISTRY STREAM HISTORY + REPLAY WRITE AMPLIFICATION\n==================================================================\nProducer lifecycle:\n  crates/spt-daemon/src/pump/registry.rs:153-176\n    every registry pump round advertises local rows per peer/subnet.\n  crates/spt-daemon/src/pump/mod.rs:1116-1122\n    push_feed opens a fresh bidi stream, writes the feed, and FINs it; one stream per feed.\n  Pump cadence is approximately 30s.\n\nSender retention:\n  The sender-created StreamEntry is not retired after fire-and-forget completion.\n  crates/spt-daemon/src/nethost.rs:1825-1855 retire_stream hides eligibility and clears the\n  ring, but deliberately retains physical entry/subscriber until QUIC connection close.\n  The pump connection is long-lived, so sender rows accumulate.\n  nethost.rs:1805-1823 stream_infos filters retired rows but does not server-side exclude\n  initiated_local rows.\n  crates/spt-daemon/src/dispatch.rs:455-469 polls frequently and receives/clones the full\n  historical row set before client-side initiated_local rejection.\n  Result: steady-state enumeration cost is O(total feeds since connection start), not O(active\n  exchanges).\n\nReceiver replay and disk amplification:\n  dispatch.rs:346-369 treats only finished Attach rows as terminal; finished Registry rows\n  remain pending by design because request/reply families may FIN request halves.\n  dispatch.rs:984-1047 serve_registry_feed subscribes from seq 0 and drains replay.\n  nethost.rs:165-221 installs one SubscriberSeat OS writer thread per subscription and writes\n  the complete replay before live frames.\n  dispatch.rs:997-1039 processes each decoded chunk and separately calls apply_node_labels and\n  apply_feed_flips.\n  registryhost.rs:241-342: BOTH apply functions call write_snapshots.\n  registryhost.rs:734-760: write_snapshots serializes and atomically rewrites every subnet\n  registry plus heard.meta.\n  Thus a replay split into multiple 64KiB NetStreamData chunks performs repeated full-state\n  rewrites, twice per chunk when labels and instances coexist. While the brain does this\n  synchronous work, it stops draining IPC; the broker writer fills the pipe, blocks, hits the\n  15s write deadline, poisons, and the dispatcher later retries the replay.\n\nLIVE v0.36 FAILURE PROOF\n========================\nAfter the earlier clean sampling window, the same generation-1 log accumulated 12\nCONN_WRITE_POISONED events. Every classified event is family=Registry, attempt=0, endpoint=-:\n\n  stream 524   elapsed 15,800ms\n  stream 1161  elapsed 15,518ms\n  stream 1347  elapsed 15,924ms\n  stream 3053  elapsed 15,967ms\n  stream 3810  elapsed 16,401ms\n  stream 5600  elapsed 25,363ms\n  stream 5716  elapsed 18,575ms\n  stream 5779  elapsed 16,997ms\n  stream 6139  elapsed 17,461ms\n  stream 6303  elapsed 16,117ms\n  stream 6411  elapsed 20,433ms\n  plus one interleaved event whose matching DISPATCH_EV was beyond the short association window\n\nCanonical example:\n  CONN_WRITE_POISONED: conn=1243 ... stream=524 ... write exceeded its 15000ms bound\n  event=stream-sub-writer-poison replay write failed\n  event=transport-close poisoned=true timed_out=true\n  DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12\n  event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n\nThe events prove the structured key set is emitted, but they do NOT close the prior\nendpoint-identity residual: Registry has no endpoint concept, so endpoint=- is the honest value.\nThe passive residual remains pending until the first natural failure in an endpoint-bearing\nfamily (Attach/Rest/Xfer/ShellLink/WanMsg). The transport/replay behavior is independently\ndefective.\n\nPrimary evidence:\n  C:\\Users\\decid\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log\n  first poison line: 3136\n  latest quantified poison: line 33285 at sampling time\n\nRecommended fix B, ordered:\n  1. Stop sender-history growth: retire locally initiated fire-and-forget Registry feed rows\n     immediately after successful FIN, or give this one-way family explicit terminal lifecycle\n     semantics.\n  2. Filter initiated_local and retired rows inside broker stream_infos before\n     cloning/serializing them to the dispatcher. Do not pay O(history) IPC cost merely to skip\n     client-side.\n  3. Make registry feed application transactional per feed: merge decoded labels/instances in\n     memory and write snapshots once at EOF (or at one bounded batch commit), not separately for\n     labels and instances on every transport chunk.\n  4. Ensure failed Registry replay cannot remain an indefinitely redispatchable poison loop. Fix\n     lifecycle/write amplification at source rather than merely increasing the 15s deadline.\n  5. Audit physical StreamEntry/subscriber teardown on successful one-way completion;\n     eligibility retirement alone deliberately retains entries until connection close and\n     therefore cannot bound long-lived pump-connection resources.\n\nRegression seam B:\n  Real long-lived pump + dispatcher integration test. Run N registry-only rounds over one\n  persistent connection. Assert:\n  - dispatcher-eligible Registry rows plateau at O(active), not N;\n  - physical stream/subscriber/handler counts plateau after completion;\n  - snapshot writes are O(feeds), not O(chunks × record-kinds);\n  - brain refresh produces no historical Registry replay subscriptions;\n  - zero CONN_WRITE_POISONED / replay-write-failed events;\n…\nduring this diagnosis.\n```","startLine":59,"lineNumbers":[59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,null,298,299]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\.claude\\reports\\2026-07-17-registry-stall-rca\\README.md"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":300,"totalBytes":9035,"outputLines":185,"outputBytes":9035,"shownRange":{"start":59,"end":243},"nextOffset":244}}},"isError":false,"timestamp":1784293049004}}
{"type":"message","id":"067daf63","parentId":"bad1b733","timestamp":"2026-07-17T12:57:29.009Z","message":{"role":"toolResult","toolCallId":"call_kY14f4EDjKczkEmQze9UqedC|fc_0148993141920bab016a5a26b8b8a48195ad34ca9b7141bd15","toolName":"grep","content":[{"type":"text","text":"# CHANGELOG.md\n 11|\n*12|## [0.37.0] - 2026-07-17\n 13|\n*14|A stability and lifecycle release. It ends the steady background CPU use on every\n 15|node, stops attached endpoints from stalling, and makes stopping, starting, and\n 16|controlling endpoints behave predictably.\n 17|\n...\n 27|\n*28|- Nodes no longer use steady background CPU while idle. The daemon was\n 29|  re-verifying its own program file about twice a second; it now does so once at\n 30|  startup.\n 31|\n...\n 798|\n*799|- **One adapter package can cover multiple platforms.** A `.spt` adapter can now bundle binaries for several operating systems and CPU architectures alongside one shared manifest; installing extracts the shared files plus the binary for your platform. Existing single-platform packages keep working.\n 800|- **Adapters update without restarting your agents.** When an adapter updates, the daemon stops just that adapter's background binary, swaps it in place, reloads its manifest, and restarts it — running agents continue across the update.\n 801|- **Adapter installs and updates can use private GitHub repositories.** `spt adapter add --release` can fetch from a private repo through the GitHub CLI, with no access token to manage. New `--gh` / `--https` flags choose the transport (default: automatic).\n 802|- **Adapters can show a notice after they update.** An adapter may declare a short Markdown message shown once, only when an update is actually applied.\n\n# .claude/reports/2026-07-17-registry-stall-rca/\n## README.md\n*1|# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n 2|\n 3|**Status: doyle gate verdict ACCEPTED IN FULL 2026-07-17 — every source claim code-verified same day.**\n 4|Canonical RCA for the REGISTRY-STALL milestone candidate (ranked FIRST in the findings backlog,\n...\n 10|- **Defect A is a DROPPED RIDER**: identical defect was ruled 2026-07-15 as a THE-FORKENING W4\n*11|  rider (see `.claude/reports/2026-07-10-brain-self-hash-cpu/README.md` — OnceLock once-per-process\n 12|  digest, doc-comment fix same commit, injected digest-counter==1 gate, D7 process-replacement\n 13|  truthfulness leg). W4 closed without landing it. The prior ruling's stronger angle stands: the\n 14|  per-tick re-hash reads the current exe PATH, so a post-swap resident-old-bytes brain publishes\n...\n 53|- Final corrected RCA artifact (adds the resident-old/path-new hash truthfulness defect):\n*54|  `C:\\Users\\decid\\.omp\\state\\spt-endpoint\\hertz-v036-cpu-registry-rca.txt`.\n 55|\n 56|---\n 57|\n...\n 60|```\n*61|HERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n 62|Date: 2026-07-16/17 UTC\n 63|Node: HFENDULEAM\n 64|Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n...\n 67|=================\n*68|The two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n 69|4-5-session streaming overhead. Two source defects are independently proven:\n 70|\n 71|A. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\n...\n 85|  command: spt daemon brain --generation 1 --start-reason update\n*86|  20-second mean CPU: 15.5% of one logical core\n*87|  p95 CPU: 29.2% of one logical core\n 88|  read throughput mean: 63.91 MiB/s\n 89|  threads: 18-24\n*90|  active CPU threads over 5s: 5\n 91|\n 92|PID 72488:\n 93|  command: spt daemon run --detached\n*94|  20-second mean CPU: 11.4% of one logical core\n*95|  p95 CPU: 23.4% of one logical core\n 96|  write throughput mean: 3.74 MiB/s\n 97|  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n*98|  active CPU threads over 5s: only 4\n 99|\n*100|Host: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n 101|12.8-32% of one logical core, consistent with the psutil process measurements.\n 102|\n 103|This is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\n...\n 131|\n*132|This explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\n 133|a52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n 134|\n 135|Recommended fix A:\n...\n 283|   hashing, not daemon-log or PTY-file growth.\n*284|3. Zero-timeout IPC spin: FALSIFIED as primary cause. CPU is distributed across a few active\n 285|   threads and exact self-hash throughput predicts the brain load.\n 286|4. Normal 4-5-session streaming: FALSIFIED. The self-hash load is session-independent; Registry\n 287|   work scales with historical feeds; fresh 15-25s poisons prove pathological backpressure.\n...\n 290|========================================\n*291|Classify A as a clear always-on CPU/I/O regression with a narrow fix.\n 292|Classify B as a REDISPATCH/Registry lifecycle and write-amplification defect. The earlier v0.36\n 293|milestone was closed from a clean short window; the later 12-event natural sample invalidates\n 294|the claim that the broad poison fingerprint is dead. Attach/PTy calm remains valid, but\n\n# docs/\n## REGISTRY-LIFECYCLE-TRIAGE.md\n 3|Operator-fired 2026-07-17: REGISTRY-STALL and the DAEMON-LIFECYCLE cluster roll into ONE\n*4|milestone. Target release: **v0.37.0 (counter 64)** after all waves gate.\n 5|\n 6|Sources (all doyle code-verified before this triage):\n 7|\n...\n 71|green every leg (retire machinery + registry gate = substrate). Field discriminator\n*72|post-release: hertz's snapshot poison count freezes; brain CPU drops to noise; broker thread\n 73|census bounded.\n 74|\n 75|### W2 — ENDPOINT-LIFECYCLE (todlando; REQs registered, activate at W2 start)\n...\n 123|\n*124|W3 rides the same release; if W3 slips, operator call whether v0.37.0 ships W1+W2 only\n 125|(waves are independently releasable — W1 alone fixes the active field regression).\n 126|\n 127|## Lane + release\n...\n 135|- `traceable-reqs check` green before any wave declares done.\n*136|- Release: deployah drives v0.37.0 counter 64, bump rides IN the release PR, CHANGELOG by\n*137|  observable user surface (field census: 15%/11% core CPU gone, attached-endpoint stalls\n 138|  from Registry poisons gone, zombie wake loops gone, --create truthful), notes in end-user\n 139|  voice per RELEASE-RUNBOOK step-2 standard.\n*140|- hertz field-verifies against their preserved baseline (poison count freeze + CPU + thread\n 141|  census + WAKE_RESUME absence are the discriminators)."}],"details":{"scopePath":".claude/reports/2026-07-17-registry-stall-rca, docs/REGISTRY-LIFECYCLE-TRIAGE.md, CHANGELOG.md","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":25,"fileCount":3,"files":[".claude/reports/2026-07-17-registry-stall-rca/README.md","docs/REGISTRY-LIFECYCLE-TRIAGE.md","CHANGELOG.md"],"fileMatches":[{"path":".claude/reports/2026-07-17-registry-stall-rca/README.md","count":15},{"path":"docs/REGISTRY-LIFECYCLE-TRIAGE.md","count":6},{"path":"CHANGELOG.md","count":4}],"truncated":false,"displayContent":"# CHANGELOG.md\n  11│\n *12│## [0.37.0] - 2026-07-17\n  13│\n *14│A stability and lifecycle release. It ends the steady background CPU use on every\n  15│node, stops attached endpoints from stalling, and makes stopping, starting, and\n  16│controlling endpoints behave predictably.\n  17│\n    │...\n  27│\n *28│- Nodes no longer use steady background CPU while idle. The daemon was\n  29│  re-verifying its own program file about twice a second; it now does so once at\n  30│  startup.\n  31│\n    │...\n 798│\n*799│- **One adapter package can cover multiple platforms.** A `.spt` adapter can now bundle binaries for several operating systems and CPU architectures alongside one shared manifest; installing extracts the shared files plus the binary for your platform. Existing single-platform packages keep working.\n 800│- **Adapters update without restarting your agents.** When an adapter updates, the daemon stops just that adapter's background binary, swaps it in place, reloads its manifest, and restarts it — running agents continue across the update.\n 801│- **Adapter installs and updates can use private GitHub repositories.** `spt adapter add --release` can fetch from a private repo through the GitHub CLI, with no access token to manage. New `--gh` / `--https` flags choose the transport (default: automatic).\n 802│- **Adapters can show a notice after they update.** An adapter may declare a short Markdown message shown once, only when an update is actually applied.\n\n# .claude/reports/2026-07-17-registry-stall-rca/\n## README.md\n  *1│# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n   2│\n   3│**Status: doyle gate verdict ACCEPTED IN FULL 2026-07-17 — every source claim code-verified same day.**\n   4│Canonical RCA for the REGISTRY-STALL milestone candidate (ranked FIRST in the findings backlog,\n    │...\n  10│- **Defect A is a DROPPED RIDER**: identical defect was ruled 2026-07-15 as a THE-FORKENING W4\n *11│  rider (see `.claude/reports/2026-07-10-brain-self-hash-cpu/README.md` — OnceLock once-per-process\n  12│  digest, doc-comment fix same commit, injected digest-counter==1 gate, D7 process-replacement\n  13│  truthfulness leg). W4 closed without landing it. The prior ruling's stronger angle stands: the\n  14│  per-tick re-hash reads the current exe PATH, so a post-swap resident-old-bytes brain publishes\n    │...\n  53│- Final corrected RCA artifact (adds the resident-old/path-new hash truthfulness defect):\n *54│  `C:\\Users\\decid\\.omp\\state\\spt-endpoint\\hertz-v036-cpu-registry-rca.txt`.\n  55│\n  56│---\n  57│\n    │...\n  60│```\n *61│HERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n  62│Date: 2026-07-16/17 UTC\n  63│Node: HFENDULEAM\n  64│Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n    │...\n  67│=================\n *68│The two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n  69│4-5-session streaming overhead. Two source defects are independently proven:\n  70│\n  71│A. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\n    │...\n  85│  command: spt daemon brain --generation 1 --start-reason update\n *86│  20-second mean CPU: 15.5% of one logical core\n *87│  p95 CPU: 29.2% of one logical core\n  88│  read throughput mean: 63.91 MiB/s\n  89│  threads: 18-24\n *90│  active CPU threads over 5s: 5\n  91│\n  92│PID 72488:\n  93│  command: spt daemon run --detached\n *94│  20-second mean CPU: 11.4% of one logical core\n *95│  p95 CPU: 23.4% of one logical core\n  96│  write throughput mean: 3.74 MiB/s\n  97│  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n *98│  active CPU threads over 5s: only 4\n  99│\n*100│Host: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n 101│12.8-32% of one logical core, consistent with the psutil process measurements.\n 102│\n 103│This is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\n    │...\n 131│\n*132│This explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\n 133│a52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n 134│\n 135│Recommended fix A:\n    │...\n 283│   hashing, not daemon-log or PTY-file growth.\n*284│3. Zero-timeout IPC spin: FALSIFIED as primary cause. CPU is distributed across a few active\n 285│   threads and exact self-hash throughput predicts the brain load.\n 286│4. Normal 4-5-session streaming: FALSIFIED. The self-hash load is session-independent; Registry\n 287│   work scales with historical feeds; fresh 15-25s poisons prove pathological backpressure.\n    │...\n 290│========================================\n*291│Classify A as a clear always-on CPU/I/O regression with a narrow fix.\n 292│Classify B as a REDISPATCH/Registry lifecycle and write-amplification defect. The earlier v0.36\n 293│milestone was closed from a clean short window; the later 12-event natural sample invalidates\n 294│the claim that the broad poison fingerprint is dead. Attach/PTy calm remains valid, but\n\n# docs/\n## REGISTRY-LIFECYCLE-TRIAGE.md\n   3│Operator-fired 2026-07-17: REGISTRY-STALL and the DAEMON-LIFECYCLE cluster roll into ONE\n  *4│milestone. Target release: **v0.37.0 (counter 64)** after all waves gate.\n   5│\n   6│Sources (all doyle code-verified before this triage):\n   7│\n    │...\n  71│green every leg (retire machinery + registry gate = substrate). Field discriminator\n *72│post-release: hertz's snapshot poison count freezes; brain CPU drops to noise; broker thread\n  73│census bounded.\n  74│\n  75│### W2 — ENDPOINT-LIFECYCLE (todlando; REQs registered, activate at W2 start)\n    │...\n 123│\n*124│W3 rides the same release; if W3 slips, operator call whether v0.37.0 ships W1+W2 only\n 125│(waves are independently releasable — W1 alone fixes the active field regression).\n 126│\n 127│## Lane + release\n    │...\n 135│- `traceable-reqs check` green before any wave declares done.\n*136│- Release: deployah drives v0.37.0 counter 64, bump rides IN the release PR, CHANGELOG by\n*137│  observable user surface (field census: 15%/11% core CPU gone, attached-endpoint stalls\n 138│  from Registry poisons gone, zombie wake loops gone, --create truthful), notes in end-user\n 139│  voice per RELEASE-RUNBOOK step-2 standard.\n*140│- hertz field-verifies against their preserved baseline (poison count freeze + CPU + thread\n 141│  census + WAKE_RESUME absence are the discriminators)."},"isError":false,"timestamp":1784293049009}}
{"type":"message","id":"c7a337d1","parentId":"067daf63","timestamp":"2026-07-17T12:57:29.976Z","message":{"role":"toolResult","toolCallId":"call_JEIjBEioeYePIHZ9cGyTmTTP|fc_0148993141920bab016a5a26b8b8b08195ae7bf1b2a8e3159a","toolName":"grep","content":[{"type":"text","text":"No matches found"}],"details":{"scopePath":"C:/spt-diag","searchPath":"C:/spt-diag","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false},"isError":false,"useless":true,"timestamp":1784293049976}}
{"type":"message","id":"11eeec4f","parentId":"c7a337d1","timestamp":"2026-07-17T12:57:38.581Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Expanding search scope to C:/spt-diag**"},{"type":"toolCall","id":"call_gNBS3HXLPUsjLH7qLEDGubz3|fc_0148993141920bab016a5a26c28154819597ed1e3eb5f2ecf6","name":"read","arguments":{"i":"Mapping diagnostic directory","path":"C:/spt-diag","selector":null}},{"type":"toolCall","id":"call_RLzU1aHl8SNCCPbc7V79OAPy|fc_0148993141920bab016a5a26c281688195bca5f862964fec97","name":"grep","arguments":{"i":"Finding v037 measurements broader","pattern":"8\\.39|6\\.44|0\\.29|24/90|27/90|90 one-second|65s CPU","path":"C:/Users/decid","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_kdUEQ7cwUYOvZeXyHLniP669|fc_0148993141920bab016a5a26c28170819581a6f62a2d168aff","name":"read","arguments":{"i":"Reading RCA alternatives","path":".claude/reports/2026-07-17-registry-stall-rca/README.md","selector":"244-300"}},{"type":"toolCall","id":"call_DUXQegG3IXWtXm0cxhaz3wJt|fc_0148993141920bab016a5a26c28178819599a9bb5c44ae5743","name":"read","arguments":{"i":"Reading lifecycle triage gate","path":"docs/REGISTRY-LIFECYCLE-TRIAGE.md","selector":"1-145"}},{"type":"toolCall","id":"call_iYNl0w1WD4d0XW729qIiAlha|fc_0148993141920bab016a5a26c281808195b0517e5409b1e1e2","name":"read","arguments":{"i":"Reading v037 changelog","path":"CHANGELOG.md","selector":"12-55"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":4672,"output":266,"cacheRead":220672,"cacheWrite":0,"totalTokens":225610,"reasoningTokens":28,"cost":{"input":0.023360000000000002,"output":0.007980000000000001,"cacheRead":0.11033599999999999,"cacheWrite":0,"total":0.141676}},"stopReason":"toolUse","timestamp":1784293050027,"responseId":"resp_0148993141920bab016a5a26ba4b4c8195b4fdb7cc753c1662","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26bda1948195a71b392536e3d727","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWibCbkvv9KF6NxiQSYa-B8ZMS-R8Bpf08YkIyIafWsMNW3Hod59zx8_1eHHzuOeaWxpDoUcFdIMCRxPigeCjSFEF9XMd0cH6JmUnl3CH444THelvizltNJzLtjLmp5psTdY3wMdCBcnvY9f8IiNs0HKf5hAGHKy3W8vsi16c1iqaY7SX_2-SuUVZUWOmnMktTb8NqTsg3l7U6CUDU76qkQ9P8AKRwVmlL3GibMOBgVRtIBaYFm0hO_4_nEqNVT3q8G-n-uRGh6PVZ63cDJ8YoZCv-eOInaM_XCA_LU8deomv1y4DIuymZ5M8wnbSncV8jCdekb5DkpkwJ-QhtRx5DE7daWdzctC1NYVIuRF4q8X0J44naCxqjpWCzYyu2j902Ny6NTdUc4mFn6Y11Zuj_GlHBjMZN4fd-ewr8I54TvFffsaDrYL5XzWbtRbpoEeLvmfdJOz39eC525q1sWwa1buZ1irGPnM8LOIydNsKhprjjaZy57v3qNt9-7wKiYVoWAojVVomFtWgobLLDAEAgPY4_mD6ZxxGIXp3IXyxSelDzmuTD_vx0otLXpeW84Bp0MV7w59lIqPIo9725FMaiZf0tVRQvYGo1fsNnWu_3FgvS-ehvpLuX5HkCKApx3jcltjl0b7U-bcTfHPyIpdVf7Os2Y4NJ-u4pW7jXbjn8l5PJTt2JKa0abBgOQOodGDrg32rqnYDQxDiCVGZQWHhKKo8s2JJ_BkHvUTgNCfMtn73kUBKxvWCQgKNRKcqXTkKs4hqZwbj8wu_LSr_a6ywk4kz05YEj6I652iYHmlpdu8knQYTwYFLEdtUyQ8z55p1ZFA1BxJ5-p_AjE2vjjP-UFW_THyHpmLfbFV0NNDOaYhCbDSvrHylfTE97nmLzlHmg5wJzrueiwxNKi_Q80Tmfh2a67_7-ELAtK6FzteJXbW-6vTHQS3Q6Hadnx68e92pkU8r95VQlH1zVDcVTREOKf1fnLDwZnzNnX-YypHC8ZfdI_VtQiG6Ag2JPyKIQ2GZImirzinAhT-pca7zevqevc6QiQ==","summary":[{"type":"summary_text","text":"**Expanding search scope to C:/spt-diag**"}]},{"id":"fc_0148993141920bab016a5a26c28154819597ed1e3eb5f2ecf6","type":"function_call","status":"completed","arguments":"{\"i\":\"Mapping diagnostic directory\",\"path\":\"C:/spt-diag\",\"selector\":null}","call_id":"call_gNBS3HXLPUsjLH7qLEDGubz3","name":"read"},{"id":"fc_0148993141920bab016a5a26c281688195bca5f862964fec97","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding v037 measurements broader\",\"pattern\":\"8\\\\.39|6\\\\.44|0\\\\.29|24/90|27/90|90 one-second|65s CPU\",\"path\":\"C:/Users/decid\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_RLzU1aHl8SNCCPbc7V79OAPy","name":"grep"},{"id":"fc_0148993141920bab016a5a26c28170819581a6f62a2d168aff","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading RCA alternatives\",\"path\":\".claude/reports/2026-07-17-registry-stall-rca/README.md\",\"selector\":\"244-300\"}","call_id":"call_kdUEQ7cwUYOvZeXyHLniP669","name":"read"},{"id":"fc_0148993141920bab016a5a26c28178819599a9bb5c44ae5743","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading lifecycle triage gate\",\"path\":\"docs/REGISTRY-LIFECYCLE-TRIAGE.md\",\"selector\":\"1-145\"}","call_id":"call_DUXQegG3IXWtXm0cxhaz3wJt","name":"read"},{"id":"fc_0148993141920bab016a5a26c281808195b0517e5409b1e1e2","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading v037 changelog\",\"path\":\"CHANGELOG.md\",\"selector\":\"12-55\"}","call_id":"call_iYNl0w1WD4d0XW729qIiAlha","name":"read"}]},"duration":8554.016300007701,"ttft":3619.300300002098,"contextSnapshot":{"promptTokens":225344,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gNBS3HXLPUsjLH7qLEDGubz3|fc_0148993141920bab016a5a26c28154819597ed1e3eb5f2ecf6","toolName":"read","startedAt":"2026-07-17T12:57:38.582Z","args":{"path":"C:/spt-diag"},"intent":"Mapping diagnostic directory"},"id":"525b7eee","parentId":"11eeec4f","timestamp":"2026-07-17T12:57:38.582Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_RLzU1aHl8SNCCPbc7V79OAPy|fc_0148993141920bab016a5a26c281688195bca5f862964fec97","toolName":"grep","startedAt":"2026-07-17T12:57:38.582Z","args":{"path":"C:/Users/decid"},"intent":"Finding v037 measurements broader"},"id":"703fa888","parentId":"525b7eee","timestamp":"2026-07-17T12:57:38.582Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kdUEQ7cwUYOvZeXyHLniP669|fc_0148993141920bab016a5a26c28170819581a6f62a2d168aff","toolName":"read","startedAt":"2026-07-17T12:57:38.582Z","args":{"path":".claude/reports/2026-07-17-registry-stall-rca/README.md"},"intent":"Reading RCA alternatives"},"id":"66dc69bc","parentId":"703fa888","timestamp":"2026-07-17T12:57:38.582Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_DUXQegG3IXWtXm0cxhaz3wJt|fc_0148993141920bab016a5a26c28178819599a9bb5c44ae5743","toolName":"read","startedAt":"2026-07-17T12:57:38.582Z","args":{"path":"docs/REGISTRY-LIFECYCLE-TRIAGE.md"},"intent":"Reading lifecycle triage gate"},"id":"fca6111a","parentId":"66dc69bc","timestamp":"2026-07-17T12:57:38.582Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_iYNl0w1WD4d0XW729qIiAlha|fc_0148993141920bab016a5a26c281808195b0517e5409b1e1e2","toolName":"read","startedAt":"2026-07-17T12:57:38.582Z","args":{"path":"CHANGELOG.md"},"intent":"Reading v037 changelog"},"id":"60b73cb0","parentId":"fca6111a","timestamp":"2026-07-17T12:57:38.582Z"}
{"type":"message","id":"e43c59e7","parentId":"60b73cb0","timestamp":"2026-07-17T12:57:38.584Z","message":{"role":"toolResult","toolCallId":"call_gNBS3HXLPUsjLH7qLEDGubz3|fc_0148993141920bab016a5a26c28154819597ed1e3eb5f2ecf6","toolName":"read","content":[{"type":"text","text":".\n  - pump-stall-2026-07-14/                     2d ago\n    - daemon.stderr.pre-restart.log  110.1MB   2d ago\n  - capture2-out.txt                 22.2KB    1w ago\n  - spt.exe                          56.5MB    1w ago\n  - capture-out.txt                  10.1KB    1w ago\n  - run.ps1                          1.5KB     1w ago\n  - setup.ps1                        1.1KB     1w ago"}],"details":{"isDirectory":true,"resolvedPath":"C:\\spt-diag","meta":{"source":{"type":"path","value":"C:\\spt-diag"}}},"isError":false,"timestamp":1784293058583}}
{"type":"message","id":"ecfae510","parentId":"e43c59e7","timestamp":"2026-07-17T12:57:38.588Z","message":{"role":"toolResult","toolCallId":"call_DUXQegG3IXWtXm0cxhaz3wJt|fc_0148993141920bab016a5a26c28178819599a9bb5c44ae5743","toolName":"read","content":[{"type":"text","text":"# REGISTRY-LIFECYCLE — milestone triage (doyle, 2026-07-17)\n\nOperator-fired 2026-07-17: REGISTRY-STALL and the DAEMON-LIFECYCLE cluster roll into ONE\nmilestone. Target release: **v0.37.0 (counter 64)** after all waves gate.\n\nSources (all doyle code-verified before this triage):\n\n- REGISTRY-STALL: hertz post-close v0.36 field RCA 2026-07-17 —\n  `.claude/reports/2026-07-17-registry-stall-rca/README.md` (canonical, incl. the\n  family-agnostic seat-retention correction and the dropped-W4-rider provenance of the\n  self-hash defect). Evidence baseline: hertz-preserved live log + byte-for-byte snapshot\n  (15 poisons and growing at pump cadence).\n- DAEMON-LIFECYCLE: three hertz reports (2026-07-16, verbatim in the findings ledger) —\n  emphasys triple (C1 hybrid-online / C2 viewport stream leak / C3 poll-vs-reap race),\n  rest-normalize (zombie WAKE_RESUME), spawn-fresh (`--create` silently reattaches) — plus\n  the operator-field deployah cycle wedge (ALREADY_LIVE vs OFFLINE contradiction).\n\nDecisions: **ADR-0040** (bounded stream/seat lifecycle + one-way terminal semantics + lease\nclasses — completes ADR-0038's lifecycle story), **ADR-0041** (endpoint lifecycle truth).\nHazards: **KNOWN-HAZARDS 7.44, 7.45**. Requirements registered in `traceable-reqs.toml`;\nstages activate per wave (traceable-per-wave-activation).\n\n## Wave plan\n\n### W1 — REGISTRY-STALL (todlando; REQs ACTIVATED)\n\nFixes, in dependency order:\n\n1. **R1 `REQ-BRAIN-HASH-ONCE`** (dropped THE-FORKENING W4 rider, escalated): capture\n   `current_exe_hash()` ONCE per brain process (`OnceLock` in `run_brain`, before the\n   heartbeat loop); every `write_ready` reuses the cached value. Failed capture stays `None`\n   — no per-tick retry. Fix the `current_exe_hash` doc-comment in the same commit (today it\n   claims once-per-start while the call site runs 2×/s — and the per-tick re-hash reads the\n   exe PATH, so a post-swap resident-old-bytes brain publishes the NEW file's hash: the\n   breadcrumb lies in the exact enlyzeam class it exists to catch; once-at-start capture IS\n   the truthfulness fix). 500ms ready-write cadence unchanged.\n2. **R2 `REQ-ONEWAY-STREAM-TERMINAL`** (B1): the registry feed is a fire-and-forget one-way\n   family — the pump retires its OWN feed row after successful write+FIN via the existing\n   `net-stream-retire` verb (N-1 best-effort per ADR-0038 A). Sender-side history stops\n   accumulating on the long-lived pump conn.\n3. **R3 `REQ-STREAM-INFOS-SERVER-FILTER`** (B2): broker `stream_infos` excludes\n   `initiated_locally` rows server-side (retired already excluded). Dispatcher keeps its\n   client-side guard (double-filter harmless; N-1 safe both directions — an older dispatcher\n   skips those rows anyway, an older broker just keeps paying the old cost).\n4. **R4 `REQ-REGISTRY-APPLY-TRANSACTIONAL`** (B3): `serve_registry_feed` accumulates decoded\n   labels + instance updates in memory across chunks and applies ONCE at EOF (or one bounded\n   batch commit for oversized feeds) — `write_snapshots` runs O(feeds), never\n   O(chunks × record-kinds). Attention-shift side effects fire once, post-merge.\n5. **R5 `REQ-REGISTRY-REPLAY-BOUNDED`** (B4): a deadline-poisoned Registry replay gets a\n   per-stream strike budget; at budget the row is retired TERMINAL with loud telemetry.\n   Safe by family semantics: a feed is an idempotent snapshot advertisement — the next pump\n   round (~30s) re-advertises everything; dropping a poisoned one loses nothing durable.\n   Defense-in-depth behind R2 (which removes the historical-replay population at source).\n6. **R6 `REQ-SEAT-LIFETIME-BOUNDED`** (B5, CROSS-FAMILY per hertz correction): new\n   `KIND_NET_STREAM_UNSUBSCRIBE` broker verb — removes the SubscriberSeat, stops/joins its\n   writer thread, drops the cursor. Called by every dispatch worker on serve completion\n   (ALL families, success or failure) and by the retire sweep. N-1: unknown-kind on an older\n   broker is the tolerated `send_error` path; caller is best-effort. Rider: NAME spawned\n   daemon threads (SubscriberSeat writer `sub-writer` minimum; accept handlers) so the next\n   field census isn't 93% unnamed.\n7. **R7 `REQ-HAZARD-REGISTRY-STALL`** (KH 7.44 umbrella): hertz's regression seam verbatim —\n   real long-lived pump + dispatcher int test, N registry rounds over ONE persistent\n   connection, asserting: dispatcher-eligible Registry rows plateau O(active) not O(N);\n   physical stream/subscriber/seat counts plateau after completion (CROSS-FAMILY — assert on\n   sync/update seats too, not just Registry); snapshot writes O(feeds) not O(chunks×kinds);\n   brain refresh produces zero historical Registry replay subscriptions; zero\n   CONN_WRITE_POISONED / replay-write-failed; broker thread count returns to bounded\n   baseline. HEAVY nextest group at birth.\n\nBinding gate additions: redispatch D1/D1b + REDISPATCH-STALL T1–T7 + mesh-recovery legs stay\ngreen every leg (retire machinery + registry gate = substrate). Field discriminator\npost-release: hertz's snapshot poison count freezes; brain CPU drops to noise; broker thread\ncensus bounded.\n\n### W2 — ENDPOINT-LIFECYCLE (todlando; REQs registered, activate at W2 start)\n\n1. **L1 `REQ-ENDPOINT-ONLINE-TRUTH`** (emphasys C1, P0): creator gate — `cmd_listen` stamps\n   ONLINE only from actual persisted state/hosting authority, never from manifest\n   `psyche_init` alone; livehost reconcile SPLITS control cleanup (clear\n   `controlled`/`driven_by`/`viewer_count` for every endpoint absent from session truth,\n   regardless of state/controllable) from offline classification (live_agent+controllable\n   only); legacy hybrid rows self-heal after a SUCCESSFUL broker query (broker failure ≠\n   empty set); terminal signoff/owner-loss = atomic CAS-guarded offline + ready/address\n   removal without overloading soft api session-end (/clear preserves the live listener).\n2. **L2 `REQ-STREAM-LEASE-CLASSES`** (emphasys C2, P0): explicit stream lifetime classes —\n   RC attach/view streams are **ConnectionBound** (opener conn EOF ⇒ FIN/detach at the\n   target: serve_attach sees EOF, detach_session runs, controller slot + CONTROLLED stamps\n   clear); inter-brain durable streams stay durable. NEVER globally retire on Brain\n   disconnect (breaks brain-swap). detach identity preserved (late close from opener A can't\n   evict newer controller B — rides W1 R6's ownership machinery + REDISPATCH-STALL fix 6\n   generation tokens). Builds directly on W1's unsubscribe/teardown verb — same\n   neighborhood, built once (the standing C2×stall-fix-4 coordination ruling).\n3. **L3 `REQ-REST-TERMINAL-NORMALIZE`** (rest-normalize, P0): ONE store-level atomic\n   mutation for definitive hosted-session loss — status=offline + rest_state=suspended +\n   clear dormant_since_ms in the SAME info.json write; used at authoritative\n   broker-session-loss/liveness-reap + `cmd_stop`. NOT `daemon_rest_event(Suspend)` (no\n   edge when effective already Suspended); NOT reader-side blanket offline⇒suspended\n   (destroys explicit-Wake semantics). Kills the zombie WAKE_RESUME loop.\n4. **L4 `REQ-CONTROL-STAMP-CONVERGENCE`** (emphasys C3, P1): session/generation-validated\n   stamp convergence (or serialized per-endpoint stamp transitions) so a pre-reap\n   KIND_SESSIONS poll can't relatch `controlled=true` after the exit-waiter reap; no fs I/O\n   under global locks (KH 7.12); every no-session path clears all three control fields.\n5. **`REQ-HAZARD-ENDPOINT-LIFECYCLE`** (KH 7.45 umbrella): regression matrix from the three\n   reports — dead-PID hybrid row does NOT survive reconcile; raw viewport close frees the\n   controller (full chain, broker restart included); definitive death ⇒ offline+suspended\n   atomically, next reconcile NO WAKE_RESUME; explicit Wake still launches exactly once;\n   poll-vs-reap interleave converges to cleared stamps.\n\n### W3 — SPAWN-TRUTH (todlando; REQs registered, activate at W3 start)\n\n1. **S1 `REQ-SPAWN-FRESH-TRUTHFUL`**: broker = atomic authority; split spawn policies\n   Fresh/RejectExisting vs ResumeOrReuse; new `KIND_SPAWN_FRESH` wire verb with typed\n   conflict (distinct kind fails LOUD on an N-1 broker vs a silently-ignored serde field),\n   sharing the single-flight/PTY spawn body. Fresh at AlreadyLive/lost-race returns the\n   typed conflict, NEVER `Spawned(existing)`. CLI contract: exit 1 + stable\n   `ENDPOINT_CREATE_CONFLICT:<id>:…no session was created`, no attach, no state mutation,\n   never kills the live session. Product ruling (standing): omitted `--resume` keeps the\n   documented create-default = fresh-and-conflict same as explicit `--create`.\n2. **S2 `REQ-ENDPOINT-CYCLE-HONEST`**: the ALREADY_LIVE dup-guard liveness-probes the\n   claimed session's client tree before refusing (dead client tree ⇒ reap + respawn\n   honestly); reconcile shutdown's NO_EDGE state machine with the dup-guard so the two\n   \"is it live\" sources can't contradict (the deployah stop/run wedge shape).\n\nW3 rides the same release; if W3 slips, operator call whether v0.37.0 ships W1+W2 only\n(waves are independently releasable — W1 alone fixes the active field regression).\n\n## Lane + release\n\n- todlando builds per wave on `build/registry-lifecycle-w<N>` branches; PR per wave; doyle\n  gates each in an isolated worktree + throwaway target (binding memories: nextest, clippy\n  --workspace preflight, grep-old-behavior-tests, seam-test sweep).\n- **hertz root-causes every NEW roadblock that arises during the milestone** (operator\n  ruling 2026-07-17): unexplained build/gate reds, field anomalies, wedges — route to hertz\n  for RCA first; doyle rules on the RCA; todlando fixes. Nobody fixes an ungrounded red.\n- `traceable-reqs check` green before any wave declares done.\n- Release: deployah drives v0.37.0 counter 64, bump rides IN the release PR, CHANGELOG by\n  observable user surface (field census: 15%/11% core CPU gone, attached-endpoint stalls\n  from Registry poisons gone, zombie wake loops gone, --create truthful), notes in end-user\n  voice per RELEASE-RUNBOOK step-2 standard.\n- hertz field-verifies against their preserved baseline (poison count freeze + CPU + thread\n  census + WAKE_RESUME absence are the discriminators).\n"}],"details":{"displayContent":{"text":"# REGISTRY-LIFECYCLE — milestone triage (doyle, 2026-07-17)\n\nOperator-fired 2026-07-17: REGISTRY-STALL and the DAEMON-LIFECYCLE cluster roll into ONE\nmilestone. Target release: **v0.37.0 (counter 64)** after all waves gate.\n\nSources (all doyle code-verified before this triage):\n\n- REGISTRY-STALL: hertz post-close v0.36 field RCA 2026-07-17 —\n  `.claude/reports/2026-07-17-registry-stall-rca/README.md` (canonical, incl. the\n  family-agnostic seat-retention correction and the dropped-W4-rider provenance of the\n  self-hash defect). Evidence baseline: hertz-preserved live log + byte-for-byte snapshot\n  (15 poisons and growing at pump cadence).\n- DAEMON-LIFECYCLE: three hertz reports (2026-07-16, verbatim in the findings ledger) —\n  emphasys triple (C1 hybrid-online / C2 viewport stream leak / C3 poll-vs-reap race),\n  rest-normalize (zombie WAKE_RESUME), spawn-fresh (`--create` silently reattaches) — plus\n  the operator-field deployah cycle wedge (ALREADY_LIVE vs OFFLINE contradiction).\n\nDecisions: **ADR-0040** (bounded stream/seat lifecycle + one-way terminal semantics + lease\nclasses — completes ADR-0038's lifecycle story), **ADR-0041** (endpoint lifecycle truth).\nHazards: **KNOWN-HAZARDS 7.44, 7.45**. Requirements registered in `traceable-reqs.toml`;\nstages activate per wave (traceable-per-wave-activation).\n\n## Wave plan\n\n### W1 — REGISTRY-STALL (todlando; REQs ACTIVATED)\n\nFixes, in dependency order:\n\n1. **R1 `REQ-BRAIN-HASH-ONCE`** (dropped THE-FORKENING W4 rider, escalated): capture\n   `current_exe_hash()` ONCE per brain process (`OnceLock` in `run_brain`, before the\n   heartbeat loop); every `write_ready` reuses the cached value. Failed capture stays `None`\n   — no per-tick retry. Fix the `current_exe_hash` doc-comment in the same commit (today it\n   claims once-per-start while the call site runs 2×/s — and the per-tick re-hash reads the\n   exe PATH, so a post-swap resident-old-bytes brain publishes the NEW file's hash: the\n   breadcrumb lies in the exact enlyzeam class it exists to catch; once-at-start capture IS\n   the truthfulness fix). 500ms ready-write cadence unchanged.\n2. **R2 `REQ-ONEWAY-STREAM-TERMINAL`** (B1): the registry feed is a fire-and-forget one-way\n   family — the pump retires its OWN feed row after successful write+FIN via the existing\n   `net-stream-retire` verb (N-1 best-effort per ADR-0038 A). Sender-side history stops\n   accumulating on the long-lived pump conn.\n3. **R3 `REQ-STREAM-INFOS-SERVER-FILTER`** (B2): broker `stream_infos` excludes\n   `initiated_locally` rows server-side (retired already excluded). Dispatcher keeps its\n   client-side guard (double-filter harmless; N-1 safe both directions — an older dispatcher\n   skips those rows anyway, an older broker just keeps paying the old cost).\n4. **R4 `REQ-REGISTRY-APPLY-TRANSACTIONAL`** (B3): `serve_registry_feed` accumulates decoded\n   labels + instance updates in memory across chunks and applies ONCE at EOF (or one bounded\n   batch commit for oversized feeds) — `write_snapshots` runs O(feeds), never\n   O(chunks × record-kinds). Attention-shift side effects fire once, post-merge.\n5. **R5 `REQ-REGISTRY-REPLAY-BOUNDED`** (B4): a deadline-poisoned Registry replay gets a\n   per-stream strike budget; at budget the row is retired TERMINAL with loud telemetry.\n   Safe by family semantics: a feed is an idempotent snapshot advertisement — the next pump\n   round (~30s) re-advertises everything; dropping a poisoned one loses nothing durable.\n   Defense-in-depth behind R2 (which removes the historical-replay population at source).\n6. **R6 `REQ-SEAT-LIFETIME-BOUNDED`** (B5, CROSS-FAMILY per hertz correction): new\n   `KIND_NET_STREAM_UNSUBSCRIBE` broker verb — removes the SubscriberSeat, stops/joins its\n   writer thread, drops the cursor. Called by every dispatch worker on serve completion\n   (ALL families, success or failure) and by the retire sweep. N-1: unknown-kind on an older\n   broker is the tolerated `send_error` path; caller is best-effort. Rider: NAME spawned\n   daemon threads (SubscriberSeat writer `sub-writer` minimum; accept handlers) so the next\n   field census isn't 93% unnamed.\n7. **R7 `REQ-HAZARD-REGISTRY-STALL`** (KH 7.44 umbrella): hertz's regression seam verbatim —\n   real long-lived pump + dispatcher int test, N registry rounds over ONE persistent\n   connection, asserting: dispatcher-eligible Registry rows plateau O(active) not O(N);\n   physical stream/subscriber/seat counts plateau after completion (CROSS-FAMILY — assert on\n   sync/update seats too, not just Registry); snapshot writes O(feeds) not O(chunks×kinds);\n   brain refresh produces zero historical Registry replay subscriptions; zero\n   CONN_WRITE_POISONED / replay-write-failed; broker thread count returns to bounded\n   baseline. HEAVY nextest group at birth.\n\nBinding gate additions: redispatch D1/D1b + REDISPATCH-STALL T1–T7 + mesh-recovery legs stay\ngreen every leg (retire machinery + registry gate = substrate). Field discriminator\npost-release: hertz's snapshot poison count freezes; brain CPU drops to noise; broker thread\ncensus bounded.\n\n### W2 — ENDPOINT-LIFECYCLE (todlando; REQs registered, activate at W2 start)\n\n1. **L1 `REQ-ENDPOINT-ONLINE-TRUTH`** (emphasys C1, P0): creator gate — `cmd_listen` stamps\n   ONLINE only from actual persisted state/hosting authority, never from manifest\n   `psyche_init` alone; livehost reconcile SPLITS control cleanup (clear\n   `controlled`/`driven_by`/`viewer_count` for every endpoint absent from session truth,\n   regardless of state/controllable) from offline classification (live_agent+controllable\n   only); legacy hybrid rows self-heal after a SUCCESSFUL broker query (broker failure ≠\n   empty set); terminal signoff/owner-loss = atomic CAS-guarded offline + ready/address\n   removal without overloading soft api session-end (/clear preserves the live listener).\n2. **L2 `REQ-STREAM-LEASE-CLASSES`** (emphasys C2, P0): explicit stream lifetime classes —\n   RC attach/view streams are **ConnectionBound** (opener conn EOF ⇒ FIN/detach at the\n   target: serve_attach sees EOF, detach_session runs, controller slot + CONTROLLED stamps\n   clear); inter-brain durable streams stay durable. NEVER globally retire on Brain\n   disconnect (breaks brain-swap). detach identity preserved (late close from opener A can't\n   evict newer controller B — rides W1 R6's ownership machinery + REDISPATCH-STALL fix 6\n   generation tokens). Builds directly on W1's unsubscribe/teardown verb — same\n   neighborhood, built once (the standing C2×stall-fix-4 coordination ruling).\n3. **L3 `REQ-REST-TERMINAL-NORMALIZE`** (rest-normalize, P0): ONE store-level atomic\n   mutation for definitive hosted-session loss — status=offline + rest_state=suspended +\n   clear dormant_since_ms in the SAME info.json write; used at authoritative\n   broker-session-loss/liveness-reap + `cmd_stop`. NOT `daemon_rest_event(Suspend)` (no\n   edge when effective already Suspended); NOT reader-side blanket offline⇒suspended\n   (destroys explicit-Wake semantics). Kills the zombie WAKE_RESUME loop.\n4. **L4 `REQ-CONTROL-STAMP-CONVERGENCE`** (emphasys C3, P1): session/generation-validated\n   stamp convergence (or serialized per-endpoint stamp transitions) so a pre-reap\n   KIND_SESSIONS poll can't relatch `controlled=true` after the exit-waiter reap; no fs I/O\n   under global locks (KH 7.12); every no-session path clears all three control fields.\n5. **`REQ-HAZARD-ENDPOINT-LIFECYCLE`** (KH 7.45 umbrella): regression matrix from the three\n   reports — dead-PID hybrid row does NOT survive reconcile; raw viewport close frees the\n   controller (full chain, broker restart included); definitive death ⇒ offline+suspended\n   atomically, next reconcile NO WAKE_RESUME; explicit Wake still launches exactly once;\n   poll-vs-reap interleave converges to cleared stamps.\n\n### W3 — SPAWN-TRUTH (todlando; REQs registered, activate at W3 start)\n\n1. **S1 `REQ-SPAWN-FRESH-TRUTHFUL`**: broker = atomic authority; split spawn policies\n   Fresh/RejectExisting vs ResumeOrReuse; new `KIND_SPAWN_FRESH` wire verb with typed\n   conflict (distinct kind fails LOUD on an N-1 broker vs a silently-ignored serde field),\n   sharing the single-flight/PTY spawn body. Fresh at AlreadyLive/lost-race returns the\n   typed conflict, NEVER `Spawned(existing)`. CLI contract: exit 1 + stable\n   `ENDPOINT_CREATE_CONFLICT:<id>:…no session was created`, no attach, no state mutation,\n   never kills the live session. Product ruling (standing): omitted `--resume` keeps the\n   documented create-default = fresh-and-conflict same as explicit `--create`.\n2. **S2 `REQ-ENDPOINT-CYCLE-HONEST`**: the ALREADY_LIVE dup-guard liveness-probes the\n   claimed session's client tree before refusing (dead client tree ⇒ reap + respawn\n   honestly); reconcile shutdown's NO_EDGE state machine with the dup-guard so the two\n   \"is it live\" sources can't contradict (the deployah stop/run wedge shape).\n\nW3 rides the same release; if W3 slips, operator call whether v0.37.0 ships W1+W2 only\n(waves are independently releasable — W1 alone fixes the active field regression).\n\n## Lane + release\n\n- todlando builds per wave on `build/registry-lifecycle-w<N>` branches; PR per wave; doyle\n  gates each in an isolated worktree + throwaway target (binding memories: nextest, clippy\n  --workspace preflight, grep-old-behavior-tests, seam-test sweep).\n- **hertz root-causes every NEW roadblock that arises during the milestone** (operator\n  ruling 2026-07-17): unexplained build/gate reds, field anomalies, wedges — route to hertz\n  for RCA first; doyle rules on the RCA; todlando fixes. Nobody fixes an ungrounded red.\n- `traceable-reqs check` green before any wave declares done.\n- Release: deployah drives v0.37.0 counter 64, bump rides IN the release PR, CHANGELOG by\n  observable user surface (field census: 15%/11% core CPU gone, attached-endpoint stalls\n  from Registry poisons gone, zombie wake loops gone, --create truthful), notes in end-user\n  voice per RELEASE-RUNBOOK step-2 standard.\n- hertz field-verifies against their preserved baseline (poison count freeze + CPU + thread\n  census + WAKE_RESUME absence are the discriminators).\n","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\docs\\REGISTRY-LIFECYCLE-TRIAGE.md"}}},"isError":false,"timestamp":1784293058588}}
{"type":"message","id":"62a67f04","parentId":"ecfae510","timestamp":"2026-07-17T12:57:38.594Z","message":{"role":"toolResult","toolCallId":"call_kdUEQ7cwUYOvZeXyHLniP669|fc_0148993141920bab016a5a26c28170819581a6f62a2d168aff","toolName":"read","content":[{"type":"text","text":"# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n…\n```\nHERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n…\n  - zero CONN_WRITE_POISONED / replay-write-failed events;\n  - broker thread/handle count returns to a bounded baseline.\n\nREQUESTED CARRIER + THREAD DISCRIMINATORS\n========================================\nAll 12 poison events belong to fresh physical broker connections:\n  1243, 2665, 3072, 6648, 8236, 12009, 12266, 12409, 12563, 13200, 13542, 13782\nThey cover 12 distinct Registry streams. None of those physical connections remains open.\n\nAll matching DISPATCH_EV records report attempt=0. No breaker-trip record brackets any poison.\nDispatcher-worker IPC connections are reused in cohorts (12, 16, 26, 33, 46, 55), but the\npoisoned carrier connections are all distinct. This is fresh-carrier historical-replay churn,\nnot one wedged connection or an escalating retry ladder. Stream 5846's delayed worker outcome\nwas 53,009ms; the other classified outcomes were 15,518-25,363ms.\n\nLive Win32 GetThreadDescription census for broker PID 72488:\n  total                 589\n  unnamed               546\n  conn-watchdog          33\n  spt-broker-net          7\n  main                    1\n  spt-docs-server         1\n  linger pool (persist.)  1\n\nThe source names conn-watchdog and network runtime threads; Broker accept handlers and\nSubscriberSeat writers are unnamed. Whole-log lifecycle accounting found only 30 currently open\nBrokerConn handlers, 13 of them stream subscribers, and zero poisoned connections still open.\nThe dispatcher worker pool is capped at 8. Therefore the roughly 500 excess unnamed sleeping\nthreads fit retained SubscriberSeat writers attached to completed Registry StreamEntries on\nlong-lived QUIC connections. This is stronger than the earlier short-term \"stable thread count\"\nobservation: the count grows by periodic feed history, then plateaus only between pump\nrounds/connection changes.\n\nHYPOTHESIS DISPOSITION\n======================\n1. Historical stream-worker leak: PARTIALLY CONFIRMED. Thread count was stable over a short 30s\n   sample rather than monotonically leaking each second, but long-lived Registry stream\n   entries/history accumulate per pump round and drive O(history) enumeration/replay. Hundreds\n   of sleeping broker threads are not explained by the 8-worker dispatcher pool alone.\n2. PTY output replay: FALSIFIED as primary cause. The high brain read rate matches executable\n   hashing, not daemon-log or PTY-file growth.\n3. Zero-timeout IPC spin: FALSIFIED as primary cause. CPU is distributed across a few active\n   threads and exact self-hash throughput predicts the brain load.\n4. Normal 4-5-session streaming: FALSIFIED. The self-hash load is session-independent; Registry\n   work scales with historical feeds; fresh 15-25s poisons prove pathological backpressure.\n\nSEVERITY / MILESTONE DISPOSITION REQUEST\n========================================\nClassify A as a clear always-on CPU/I/O regression with a narrow fix.\nClassify B as a REDISPATCH/Registry lifecycle and write-amplification defect. The earlier v0.36\nmilestone was closed from a clean short window; the later 12-event natural sample invalidates\nthe claim that the broad poison fingerprint is dead. Attach/PTy calm remains valid, but\nRegistry-family poison recurrence requires explicit triage and a release disposition.\n\nNo production process was stopped, no hosted session was killed, and no source was edited\nduring this diagnosis.\n```\n"}],"details":{"displayContent":{"text":"# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n…\n```\nHERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n…\n  - zero CONN_WRITE_POISONED / replay-write-failed events;\n  - broker thread/handle count returns to a bounded baseline.\n\nREQUESTED CARRIER + THREAD DISCRIMINATORS\n========================================\nAll 12 poison events belong to fresh physical broker connections:\n  1243, 2665, 3072, 6648, 8236, 12009, 12266, 12409, 12563, 13200, 13542, 13782\nThey cover 12 distinct Registry streams. None of those physical connections remains open.\n\nAll matching DISPATCH_EV records report attempt=0. No breaker-trip record brackets any poison.\nDispatcher-worker IPC connections are reused in cohorts (12, 16, 26, 33, 46, 55), but the\npoisoned carrier connections are all distinct. This is fresh-carrier historical-replay churn,\nnot one wedged connection or an escalating retry ladder. Stream 5846's delayed worker outcome\nwas 53,009ms; the other classified outcomes were 15,518-25,363ms.\n\nLive Win32 GetThreadDescription census for broker PID 72488:\n  total                 589\n  unnamed               546\n  conn-watchdog          33\n  spt-broker-net          7\n  main                    1\n  spt-docs-server         1\n  linger pool (persist.)  1\n\nThe source names conn-watchdog and network runtime threads; Broker accept handlers and\nSubscriberSeat writers are unnamed. Whole-log lifecycle accounting found only 30 currently open\nBrokerConn handlers, 13 of them stream subscribers, and zero poisoned connections still open.\nThe dispatcher worker pool is capped at 8. Therefore the roughly 500 excess unnamed sleeping\nthreads fit retained SubscriberSeat writers attached to completed Registry StreamEntries on\nlong-lived QUIC connections. This is stronger than the earlier short-term \"stable thread count\"\nobservation: the count grows by periodic feed history, then plateaus only between pump\nrounds/connection changes.\n\nHYPOTHESIS DISPOSITION\n======================\n1. Historical stream-worker leak: PARTIALLY CONFIRMED. Thread count was stable over a short 30s\n   sample rather than monotonically leaking each second, but long-lived Registry stream\n   entries/history accumulate per pump round and drive O(history) enumeration/replay. Hundreds\n   of sleeping broker threads are not explained by the 8-worker dispatcher pool alone.\n2. PTY output replay: FALSIFIED as primary cause. The high brain read rate matches executable\n   hashing, not daemon-log or PTY-file growth.\n3. Zero-timeout IPC spin: FALSIFIED as primary cause. CPU is distributed across a few active\n   threads and exact self-hash throughput predicts the brain load.\n4. Normal 4-5-session streaming: FALSIFIED. The self-hash load is session-independent; Registry\n   work scales with historical feeds; fresh 15-25s poisons prove pathological backpressure.\n\nSEVERITY / MILESTONE DISPOSITION REQUEST\n========================================\nClassify A as a clear always-on CPU/I/O regression with a narrow fix.\nClassify B as a REDISPATCH/Registry lifecycle and write-amplification defect. The earlier v0.36\nmilestone was closed from a clean short window; the later 12-event natural sample invalidates\nthe claim that the broad poison fingerprint is dead. Attach/PTy calm remains valid, but\nRegistry-family poison recurrence requires explicit triage and a release disposition.\n\nNo production process was stopped, no hosted session was killed, and no source was edited\nduring this diagnosis.\n```\n","startLine":1,"lineNumbers":[1,null,60,61,null,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\.claude\\reports\\2026-07-17-registry-stall-rca\\README.md"}}},"isError":false,"timestamp":1784293058594}}
{"type":"message","id":"cffc1be8","parentId":"62a67f04","timestamp":"2026-07-17T12:57:38.628Z","message":{"role":"toolResult","toolCallId":"call_iYNl0w1WD4d0XW729qIiAlha|fc_0148993141920bab016a5a26c281808195b0517e5409b1e1e2","toolName":"read","content":[{"type":"text","text":"## [Unreleased]\n\n## [0.37.0] - 2026-07-17\n\nA stability and lifecycle release. It ends the steady background CPU use on every\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\ncontrolling endpoints behave predictably.\n\n### Changed\n\n- `spt endpoint run` no longer silently reattaches to a running session. When a\n  live session already exists for the endpoint, it now stops with\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\n  existing one. Attach to the running session with `spt rc <id>`, or pass\n  `--resume` to resume it.\n\n### Fixed\n\n- Nodes no longer use steady background CPU while idle. The daemon was\n  re-verifying its own program file about twice a second; it now does so once at\n  startup.\n\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\n  could keep re-applying old peer-directory updates; each update is now applied\n  once and completed transfers are discarded immediately. This also ends the slow\n  thread and memory growth that built up on long-lived connections.\n\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\n  reporting CONTROLLED. The state is released even if the daemon restarts.\n\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\n  stale ONLINE entries left by dead processes now clear on their own.\n\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\n  genuinely dead leftover is cleaned up and the restart proceeds.\n\n### Internal\n\n- Improved daemon diagnostics — named threads and stream/seat gauges.\n\n## [0.36.0] - 2026-07-16\n\nA stability release for attached sessions. A daemon update no longer disrupts\nactive sessions, and a session stuck by a bad connection now recovers on its own.\n\n### Fixed\n\n- Attached sessions no longer freeze after a daemon update or refresh.\n…\n  up to a minute; a stuck viewer can no longer freeze other sessions.\n\n…\n\n…\n\n\n[Showing lines 11-58 of 1186. Use :59 to continue]"}],"details":{"truncation":{"content":"\r\n## [0.37.0] - 2026-07-17\r\n\r\nA stability and lifecycle release. It ends the steady background CPU use on every\r\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\r\ncontrolling endpoints behave predictably.\r\n\r\n### Changed\r\n\r\n- `spt endpoint run` no longer silently reattaches to a running session. When a\r\n  live session already exists for the endpoint, it now stops with\r\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\r\n  existing one. Attach to the running session with `spt rc <id>`, or pass\r\n  `--resume` to resume it.\r\n\r\n### Fixed\r\n\r\n- Nodes no longer use steady background CPU while idle. The daemon was\r\n  re-verifying its own program file about twice a second; it now does so once at\r\n  startup.\r\n\r\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\r\n  could keep re-applying old peer-directory updates; each update is now applied\r\n  once and completed transfers are discarded immediately. This also ends the slow\r\n  thread and memory growth that built up on long-lived connections.\r\n\r\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\r\n  reporting CONTROLLED. The state is released even if the daemon restarts.\r\n\r\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\r\n  stale ONLINE entries left by dead processes now clear on their own.\r\n\r\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\r\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\r\n  genuinely dead leftover is cleaned up and the restart proceeds.\r\n\r\n### Internal\r\n\r\n- Improved daemon diagnostics — named threads and stream/seat gauges.\r\n\r\n## [0.36.0] - 2026-07-16\r\n\r\nA stability release for attached sessions. A daemon update no longer disrupts\r\nactive sessions, and a session stuck by a bad connection now recovers on its own.\r\n\r\n### Fixed\r\n\r\n- Attached sessions no longer freeze after a daemon update or refresh.\r","truncated":true,"truncatedBy":"lines","totalLines":1176,"totalBytes":1990,"outputLines":48,"outputBytes":1990,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"## [Unreleased]\n\r\n## [0.37.0] - 2026-07-17\r\n\r\nA stability and lifecycle release. It ends the steady background CPU use on every\r\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\r\ncontrolling endpoints behave predictably.\r\n\r\n### Changed\r\n\r\n- `spt endpoint run` no longer silently reattaches to a running session. When a\r\n  live session already exists for the endpoint, it now stops with\r\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\r\n  existing one. Attach to the running session with `spt rc <id>`, or pass\r\n  `--resume` to resume it.\r\n\r\n### Fixed\r\n\r\n- Nodes no longer use steady background CPU while idle. The daemon was\r\n  re-verifying its own program file about twice a second; it now does so once at\r\n  startup.\r\n\r\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\r\n  could keep re-applying old peer-directory updates; each update is now applied\r\n  once and completed transfers are discarded immediately. This also ends the slow\r\n  thread and memory growth that built up on long-lived connections.\r\n\r\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\r\n  reporting CONTROLLED. The state is released even if the daemon restarts.\r\n\r\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\r\n  stale ONLINE entries left by dead processes now clear on their own.\r\n\r\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\r\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\r\n  genuinely dead leftover is cleaned up and the restart proceeds.\r\n\r\n### Internal\r\n\r\n- Improved daemon diagnostics — named threads and stream/seat gauges.\r\n\r\n## [0.36.0] - 2026-07-16\r\n\r\nA stability release for attached sessions. A daemon update no longer disrupts\r\nactive sessions, and a session stuck by a bad connection now recovers on its own.\r\n\r\n### Fixed\r\n\r\n- Attached sessions no longer freeze after a daemon update or refresh.\r\n…\n  up to a minute; a stuck viewer can no longer freeze other sessions.\n\n…\n\n…\n","startLine":10,"lineNumbers":[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,null,60,61,null,67,null,71]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\CHANGELOG.md"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1186,"totalBytes":1990,"outputLines":48,"outputBytes":1990,"shownRange":{"start":11,"end":58},"nextOffset":59}}},"isError":false,"timestamp":1784293058628}}
{"type":"message","id":"4ecf9e19","parentId":"cffc1be8","timestamp":"2026-07-17T12:58:08.592Z","message":{"role":"toolResult","toolCallId":"call_RLzU1aHl8SNCCPbc7V79OAPy|fc_0148993141920bab016a5a26c281688195bca5f862964fec97","toolName":"grep","content":[{"type":"text","text":"Grep timed out after 30s; narrow paths or pattern, or scope with `glob` first"}],"details":{},"isError":true,"timestamp":1784293088592}}
{"type":"custom_message","customType":"irc:incoming","content":"<irc>\nIncoming IRC message from agent `V037GaugeProbe`:\n\nI’m tracing v0.37 broker thread census/gauges. Do you have field net-status gauge values or named/unnamed thread-name breakdown beyond total 47–56, unnamed 23–26, sub-writer=3? Please send concise anchors/findings.\n\nAn agent sent this while you were waiting or working. Any active interruptible wait was stopped early so you can read it now.\n\nIf a response is expected, reply with the `irc` tool (`op: \"send\"`, `to: \"V037GaugeProbe\"`) — you may finish your current step first. Nobody replies on your behalf.\n</irc>","display":true,"details":{"id":"15335745911c5f58","from":"V037GaugeProbe","message":"I’m tracing v0.37 broker thread census/gauges. Do you have field net-status gauge values or named/unnamed thread-name breakdown beyond total 47–56, unnamed 23–26, sub-writer=3? Please send concise anchors/findings."},"attribution":"agent","id":"142865bb","parentId":"4ecf9e19","timestamp":"2026-07-17T12:58:08.615Z"}
{"type":"message","id":"840274c0","parentId":"142865bb","timestamp":"2026-07-17T12:58:20.241Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Checking pump health status**"},{"type":"toolCall","id":"call_pgguKNjvR1dYELXXvpyW7Tul|fc_0148993141920bab016a5a26e9a5f08195b10c177cb777acc8","name":"irc","arguments":{"i":"Sharing gauge anchors","op":"send","to":"V037GaugeProbe","message":"No direct current net-status values yet. Source anchors: broker.rs:4233-4251 populates streams_held/stream_seats from nethost.rs:1912-1919 stream_counts; current pump-health.json says 6 targets/4 live/2 failing. Post-refresh gen1 starts log lines 1008-1019; grep finds zero DISPATCH:/DISPATCH_EV after line 1000, while many stream-sub attaches complete with poisoned=false. Your 47–56 total / 23–26 unnamed / sub-writer=3 is the only live thread census I have.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5118,"output":247,"cacheRead":224768,"cacheWrite":0,"totalTokens":230133,"reasoningTokens":67,"cost":{"input":0.02559,"output":0.00741,"cacheRead":0.112384,"cacheWrite":0,"total":0.145384}},"stopReason":"toolUse","timestamp":1784293088634,"responseId":"resp_0148993141920bab016a5a26e0f8048195bded51ee16954504","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26e7b5788195ada9c6c95c9b332d","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWibpCoCYkrv5Ddu5Xt6NVURKpIPHzSilhwe0FgGho9ydgPBgx1-E5pk7P92REy8ePaJzYPUDwfSSu8KddR1GRjTDx0sL1L9mbruDkxOVrH2hX9WYOMAZ7wP9WV_7YXIixhyfOpUzA9uX8Gci_STJnD9ByW-m9iZ0-uW_yWDRv6lgnhKTjISPf23t6kSzfhITdPzSvijwn_7UiDNdHBhe-VpAbUycqc54LgtZqPfw3KHuhSGwnTqmoVhJWU0zdE0fasrk1_DW5y5ddU0qMxHFasmgzdvxvoLReIoUatjoNcQL1gfdbLPyVoh5V3GjABP_DFaHB1euhDdGXJGzYppNf7TDxm5gVqm4g4fgLf1UUZAYkYGykkloF9pTU3v67pTq9yy_KQTdFs5pg0EqrsKjOH_ZsjmmZQpn-6XP1onavNBW4zd3VEVCfJcs_VX-6MRr--GGpZ4PhwhUZZB6vVs50-E0jpy6-YTdXVMZeI1bhQFUqAQkDyNRqnGb_OK0xI6TqkJAcgRAwmtc2qRupypgyCLNs5Ag6hvqFcE2WwDn972eZAAUBM_39-X3zT-LCADBHV_E2fgV5plReSX-5yzyve-UV_dOxkWFFmLSLMMkGVUF0ZEQQdN3T2jStkMwOoB-y6QE7hHUQmLY6rAiBma7Io4BlCJYs9JgmRNfpEN7Q4Qafer6ARBZKYa2JSRna66YIWlx5_vEKKkeuSF-x80XQkimyQsM-LT0TPEwUL3s5P2-gThjMP4q0-uJpeVEt6YoPUBlFib_5m6SaUSqIf_E73mD17nb6YP1tC2vriVorpG8eql0CGSxfgGt9WyivjVYzcoYwZEmjD1lpUZt1ORBPI08A0qJveL38DKqBN_HzzgoDld3GHBrBNkzpo2HtnQ7-jlaDCZAZgPTm_pQdmVGAS_2YRvAKQyw6fDDhpZySjeZPT_Gc5qouT1vuEsV9vDXq4WUf8UF0j_AvK_vLp0dTB2tONlKATWnww9VOk-WVa26txxOwUKFcJYR6kGLb1w3Q9LKelyf3F8rpbf4ak7G5rARe9gIyF9Fo7eMvPZ7Y-iW3iNk7Cb2mBDlFv-xRXpYmUUa4girY_BA_3aok_1CmCcmjQGnk0GFYrMIXnIsyWFrQV4qPs2e5VNhsEWnw7jPGTx6iE34i63Ii3VZND47jnvjpNjosfx2x0SznVriyiqPPUaQfpGj8LbyPV2CU5vfe0JEzrrMDt7I3EijPgHxJ7kyPtrQhF4hoLOS69v4dTWuAD5p786EFrtiP4W2NDkyba7yZO2WjILQgetH42owLUONVQ==","summary":[{"type":"summary_text","text":"**Checking pump health status**"}]},{"id":"fc_0148993141920bab016a5a26e9a5f08195b10c177cb777acc8","type":"function_call","status":"completed","arguments":"{\"i\":\"Sharing gauge anchors\",\"op\":\"send\",\"to\":\"V037GaugeProbe\",\"message\":\"No direct current net-status values yet. Source anchors: broker.rs:4233-4251 populates streams_held/stream_seats from nethost.rs:1912-1919 stream_counts; current pump-health.json says 6 targets/4 live/2 failing. Post-refresh gen1 starts log lines 1008-1019; grep finds zero DISPATCH:/DISPATCH_EV after line 1000, while many stream-sub attaches complete with poisoned=false. Your 47–56 total / 23–26 unnamed / sub-writer=3 is the only live thread census I have.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_pgguKNjvR1dYELXXvpyW7Tul","name":"irc"}]},"duration":11594.34699998796,"ttft":7091.627899989486,"contextSnapshot":{"promptTokens":229886,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pgguKNjvR1dYELXXvpyW7Tul|fc_0148993141920bab016a5a26e9a5f08195b10c177cb777acc8","toolName":"irc","startedAt":"2026-07-17T12:58:20.242Z","intent":"Sharing gauge anchors"},"id":"2f4d4ea2","parentId":"840274c0","timestamp":"2026-07-17T12:58:20.242Z"}
{"type":"message","id":"de06dc31","parentId":"2f4d4ea2","timestamp":"2026-07-17T12:58:20.242Z","message":{"role":"toolResult","toolCallId":"call_pgguKNjvR1dYELXXvpyW7Tul|fc_0148993141920bab016a5a26e9a5f08195b10c177cb777acc8","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- V037GaugeProbe: injected"}],"details":{"op":"send","from":"ResidualBrainCpu","to":"V037GaugeProbe","receipts":[{"to":"V037GaugeProbe","outcome":"injected"}]},"isError":false,"timestamp":1784293100242}}
{"type":"message","id":"8a853f83","parentId":"de06dc31","timestamp":"2026-07-17T12:58:37.760Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing loop cadence from logs**\n\n**Planning user state file search**"},{"type":"toolCall","id":"call_C0MRBvtOaNLrGYsxFdP0DBej|fc_0148993141920bab016a5a26fdaa2081958b0257be61bafc87","name":"glob","arguments":{"i":"Locating Hertz CPU artifacts","path":"C:/Users/decid/.omp/state/spt-endpoint/*cpu*; C:/Users/decid/.omp/state/spt-endpoint/*v037*; C:/Users/decid/.omp/state/spt-endpoint/*registry*; C:/Users/decid/.omp/state/spt-endpoint/hertz*","hidden":true,"gitignore":false,"limit":200}},{"type":"toolCall","id":"call_SpNS8MowIR4FrHPDKfJP14zt|fc_0148993141920bab016a5a26fdabc08195b93babfddf97634e","name":"glob","arguments":{"i":"Locating recent diagnostic data","path":"C:/Users/decid/Documents/**/*.csv; C:/Users/decid/Documents/**/*.json; C:/Users/decid/Documents/**/*.txt","hidden":true,"gitignore":false,"limit":200}},{"type":"toolCall","id":"call_3j7k8dTvxdeoA37piSbk9Q9d|fc_0148993141920bab016a5a26fdabcc8195b184979c0132482f","name":"grep","arguments":{"i":"Finding v037 evidence in endpoint state","pattern":"8\\.39|6\\.44|0\\.29|24/90|27/90|v0\\.37|90 one-second","path":"C:/Users/decid/.omp/state/spt-endpoint","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_5ghha8BMAD22voRV0aKmQ5jD|fc_0148993141920bab016a5a26fdabd081959e27549359d66efb","name":"grep","arguments":{"i":"Finding current status captures","pattern":"streams_held|stream_seats|threads|sub-writer|CPU|cpu","path":".claude/reports;C:/Users/decid/AppData/Local/spt-core/rca-*","selector":null,"case":false,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":1294,"output":541,"cacheRead":228864,"cacheWrite":0,"totalTokens":230699,"reasoningTokens":192,"cost":{"input":0.006470000000000001,"output":0.01623,"cacheRead":0.11443199999999999,"cacheWrite":0,"total":0.137132}},"stopReason":"toolUse","timestamp":1784293100255,"responseId":"resp_0148993141920bab016a5a26ec85e48195b9b85d1139503ea5","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a26f3df408195a51cdf80c709b213","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWib9WfWZ0FbSltNPcz-dcydxNJ98NKNm02sgmlxHlkPzJeG9A8OpYm-E4MpWSAafhxY2KPghInvAM5yQl9yfpDVAaUbSjLfXrt1IGzvtWdRfDjlvAhKP2l3v8PGG6nviv3JChZFi-Yage--pticXUJ9dcfu_BRVK6CqT-jFIsXN-prWLSW0gJYWaXkONWAu-p4Wb9InQPAlz-CX6iq-TCo6JWulqjdhBzgalxjBHlK78y266mrTiRYNxbsKRR4fOXTeNmF-PQbQnv7GKflmxmLjd1PJdd_3oGmf75AFU83CmTrLrtUZ7JzK_BatxHMj9XwOJTUWAe4r8uMnmcIVd4SJiEEHoyisbLOBtba7dhGCXciJZMVhAFW6sq8FhrN2_r6i5O3khdMnLlYUKtBi4sYyr73TGDXj1e8gW3VQM2WSx06e7CMVuxAJs6IYPdYThYCEWvs-TzHarkb3l2Z6UlRfH_D706p4vWrcXxVEVtr9tlrcbxruu4Sf91RiMcCmis1FAeklnZBn4rH5Zkd2zTpJUuYu82QgwGfMGfU1GO_Bk-BhH36YiufQfhG_sEyQl3U_3Ys16zN9WG9TNJxUiMnZaWzY_S50NpT3izYAdf1xOr3K2dtLjvEeIggxtMVCvHTleHYu0D3y-tVd1OFG1D5VxG-mxMgYalnL19pEfb64te2MUgA2zkh7cytuo9d3lTlBfFcPkOW__UIqKdTJrT0BLCTahgnN1sLWjypuqXRuyfRBmd5Cno3vli5XKEMVGiJ1ldFQfpxEvue4Rd_k4fv8-nnsUHX-9PpGP9fqe-IDK_zSqjmDlovM6Jp9UC3zaJF_JCU43kTWCiKurUP64eWz2SA4f73F0BRgIV9RC7JNZTqASbB2pLtq_Dg6FCIaQ7dgCaf9E4jIRzhihQJd35vr_m-bagRPAZecfWvOKWG14VNLjNNyqbCxF-kjVKin2bXC9lggLxdjZiD2iGDvu0BH-oK2yiW1-LP9hBUq5Xd2Dwy237LGE4g6oP0NI4t67okG1_C_b5kl-h_-RuNz7x-h1XYpdgAX7x96TFeHDUjFWXezGziYHBwLnAxn8xqT7hGFDLn08DLCIDagQGhHGQ_qSqQ7oCWfKI7it51uP2_WRHHv1C69wCKDR0ov5XbFRXh2cPKPM8aaS4DS3dr5QYuFld72XFslB5P4RKPrK3qMnTbmfuBqlp-iHWbqaRTVh8TK3lzSZZBdlsYjHlB9wiMwjwIjdiZcoo0n1OXRuHvn81vdfChZj7v-ul4dUo1sv6rZRridreDPBx96exwgAFGm6hrpXdKsWLnvqm6IR8Qtksof6EYFGeW5vhsVX3NV4vZarm6RmY05CFdBx-uPVgH3cXMENqO0M63bKCRh7mO9xCq2AOkcopDdsGcyQQ2RAylPYdtCBZhc74q0WhHEsAwVfE5cPniUiZ6YKcdmWK1UzTrtrKaKaauCl__RefE2dvrW-DTk8LmKs4ncsu08cuNnvvy04-egYWcB_mnTJsPa22IWKrh_DEAoBh254ZTcnI8N-XhhZXw784Qd0MHEhF5TfPQKEx40JLSpBmu3RRB75sgdc1117Fbbb0_-sytbylAvgEEeqpL-iJy9-P7S3eNBljeb7JMZLKMGp8pIKqS1KL2UWMMOqeEKCGzIfSNGWqPq-oOPL-d-ddY4Jr_8xVX4OZgqZlxDeut8koD3ddT3VzFjX_HjquYMNgwFTx9KpJdSBWfERSv4V3rTd1A8srZcw1FQeNYZ6VtQpo1VUeZNBjGg4_E5P0Qc67c3G05gSrJLThiw_pAG21qAZtAHfRCPpyn1GG64mMOiwhMllVNiPZmjzNjRP9YD2vvc0N3Di_htjEhj5NhzkbqOIPkYeouF8V6moWaEA1HNfzESd0hQW4vqJMQAN_Qfrndlj955M3kh4D-Bmmnggul1vRiFFWVGzepX8iVQsAt1Ju5rrqYOPuBcXGux20RM2PbY8Hl5RVMmjUFYCvaxOGDLS0chwPu8LJg5ph_0ZneMJpvs7SxcT2XQ=","summary":[{"type":"summary_text","text":"**Analyzing loop cadence from logs**"},{"type":"summary_text","text":"**Planning user state file search**"}]},{"id":"fc_0148993141920bab016a5a26fdaa2081958b0257be61bafc87","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating Hertz CPU artifacts\",\"path\":\"C:/Users/decid/.omp/state/spt-endpoint/*cpu*; C:/Users/decid/.omp/state/spt-endpoint/*v037*; C:/Users/decid/.omp/state/spt-endpoint/*registry*; C:/Users/decid/.omp/state/spt-endpoint/hertz*\",\"hidden\":true,\"gitignore\":false,\"limit\":200}","call_id":"call_C0MRBvtOaNLrGYsxFdP0DBej","name":"glob"},{"id":"fc_0148993141920bab016a5a26fdabc08195b93babfddf97634e","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating recent diagnostic data\",\"path\":\"C:/Users/decid/Documents/**/*.csv; C:/Users/decid/Documents/**/*.json; C:/Users/decid/Documents/**/*.txt\",\"hidden\":true,\"gitignore\":false,\"limit\":200}","call_id":"call_SpNS8MowIR4FrHPDKfJP14zt","name":"glob"},{"id":"fc_0148993141920bab016a5a26fdabcc8195b184979c0132482f","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding v037 evidence in endpoint state\",\"pattern\":\"8\\\\.39|6\\\\.44|0\\\\.29|24/90|27/90|v0\\\\.37|90 one-second\",\"path\":\"C:/Users/decid/.omp/state/spt-endpoint\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_3j7k8dTvxdeoA37piSbk9Q9d","name":"grep"},{"id":"fc_0148993141920bab016a5a26fdabd081959e27549359d66efb","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding current status captures\",\"pattern\":\"streams_held|stream_seats|threads|sub-writer|CPU|cpu\",\"path\":\".claude/reports;C:/Users/decid/AppData/Local/spt-core/rca-*\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_5ghha8BMAD22voRV0aKmQ5jD","name":"grep"}]},"duration":17503.98829999566,"ttft":7632.239199995995,"contextSnapshot":{"promptTokens":230158,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_C0MRBvtOaNLrGYsxFdP0DBej|fc_0148993141920bab016a5a26fdaa2081958b0257be61bafc87","toolName":"glob","startedAt":"2026-07-17T12:58:37.760Z","args":{"path":"C:/Users/decid/.omp/state/spt-endpoint/*cpu*; C:/Users/decid/.omp/state/spt-endpoint/*v037*; C:/Users/decid/.omp/state/spt-endpoint/*registry*; C:/Users/decid/.omp/state/spt-endpoint/hertz*"},"intent":"Locating Hertz CPU artifacts"},"id":"3e58927e","parentId":"8a853f83","timestamp":"2026-07-17T12:58:37.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SpNS8MowIR4FrHPDKfJP14zt|fc_0148993141920bab016a5a26fdabc08195b93babfddf97634e","toolName":"glob","startedAt":"2026-07-17T12:58:37.760Z","args":{"path":"C:/Users/decid/Documents/**/*.csv; C:/Users/decid/Documents/**/*.json; C:/Users/decid/Documents/**/*.txt"},"intent":"Locating recent diagnostic data"},"id":"fedde7ff","parentId":"3e58927e","timestamp":"2026-07-17T12:58:37.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_3j7k8dTvxdeoA37piSbk9Q9d|fc_0148993141920bab016a5a26fdabcc8195b184979c0132482f","toolName":"grep","startedAt":"2026-07-17T12:58:37.760Z","args":{"path":"C:/Users/decid/.omp/state/spt-endpoint"},"intent":"Finding v037 evidence in endpoint state"},"id":"0dba707b","parentId":"fedde7ff","timestamp":"2026-07-17T12:58:37.760Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5ghha8BMAD22voRV0aKmQ5jD|fc_0148993141920bab016a5a26fdabd081959e27549359d66efb","toolName":"grep","startedAt":"2026-07-17T12:58:37.760Z","args":{"path":".claude/reports;C:/Users/decid/AppData/Local/spt-core/rca-*"},"intent":"Finding current status captures"},"id":"e358ad5c","parentId":"0dba707b","timestamp":"2026-07-17T12:58:37.760Z"}
{"type":"message","id":"6160b1c7","parentId":"e358ad5c","timestamp":"2026-07-17T12:58:37.765Z","message":{"role":"toolResult","toolCallId":"call_C0MRBvtOaNLrGYsxFdP0DBej|fc_0148993141920bab016a5a26fdaa2081958b0257be61bafc87","toolName":"glob","content":[{"type":"text","text":"# C:/Users/decid/.omp/state/spt-endpoint/\nhertz.events.cursor\nhertz.events.log\nhertz-v036-cpu-registry-rca.txt\nv036-registry-stall-daemon.stderr.log.snapshot\nhertz-v036-redispatch-field-verdict.txt\nhertz-v035-mesh-triple-verdict.txt\nhertz-v034-pty-stall-rca.txt\nhertz-elevated-endpoint-rca.txt\nhertz-perri-lifecycle-triage.txt\nhertz-v034-redispatch-verdict.txt\nhertz-gaki-correction.txt\nhertz-refresh-rca.txt\nhertz-v033-verdict.txt\nhertz-verify.events.log\nhertz-verify.events.cursor"}],"details":{"scopePath":"C:/Users/decid/.omp/state/spt-endpoint/*cpu*, C:/Users/decid/.omp/state/spt-endpoint/*v037*, C:/Users/decid/.omp/state/spt-endpoint/*registry*, C:/Users/decid/.omp/state/spt-endpoint/hertz*","fileCount":15,"files":["C:/Users/decid/.omp/state/spt-endpoint/hertz.events.cursor","C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log","C:/Users/decid/.omp/state/spt-endpoint/hertz-v036-cpu-registry-rca.txt","C:/Users/decid/.omp/state/spt-endpoint/v036-registry-stall-daemon.stderr.log.snapshot","C:/Users/decid/.omp/state/spt-endpoint/hertz-v036-redispatch-field-verdict.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-v035-mesh-triple-verdict.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-v034-pty-stall-rca.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-elevated-endpoint-rca.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-perri-lifecycle-triage.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-v034-redispatch-verdict.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-gaki-correction.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-refresh-rca.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-v033-verdict.txt","C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.log","C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.cursor"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784293117765}}
{"type":"message","id":"7325c762","parentId":"6160b1c7","timestamp":"2026-07-17T12:58:37.807Z","message":{"role":"toolResult","toolCallId":"call_5ghha8BMAD22voRV0aKmQ5jD|fc_0148993141920bab016a5a26fdabd081959e27549359d66efb","toolName":"grep","content":[{"type":"text","text":"# .claude/reports/\n\n## 2026-07-10-brain-self-hash-cpu/\n### README.md\n 10|\n*11|On an otherwise idle four-vCPU Linux VPS, `spt daemon brain` continuously consumes approximately 40–55% of one CPU. `perf` attributes roughly 73–76% of samples to `sha2::sha256::compress256`. File tracing repeatedly observes:\n 12|\n 13|1. `readlink(\"/proc/self/exe\", ...)`;\n 14|2. opening and reading `/usr/local/bin/spt`;\n...\n 17|\n*18|The issue's five-second sample averaged 45.2% of one CPU. No daemon or endpoint lifecycle operation was performed during the original or source-level diagnosis.\n 19|\n 20|## Pinned call chain\n 21|\n...\n 71|\n*72|### Atomic JSON publication is the dominant CPU source\n 73|\n*74|It causes avoidable disk churn but does not match the profile: approximately three quarters of CPU samples are in SHA-256, and source reads/hashes the entire binary before writing a small JSON record.\n 75|\n 76|### Repeated hashing is required to detect executable replacement\n 77|\n...\n 99|\n*100|After digest caching, the remaining two small atomic writes per second may still be worth reducing, but it is not necessary to close the reported SHA-256 CPU regression and should not be bundled without evidence.\n 101|\n 102|## Deterministic regression seam\n 103|\n...\n 119|\n*120|Avoid a flaky wall-clock CPU assertion as the primary CI gate. Use digest-call counters for deterministic behavior; keep a bounded Linux profiling/smoke acceptance to confirm idle CPU returns near sleep baseline.\n 121|\n 122|## Operational expectation after fix\n 123|\n\n## 2026-07-10-hertz-session/\n### 01-pty-freeze-rca.md\n 64|- whether a parallel `spt rc --view <endpoint>` also froze;\n*65|- daemon CPU;\n 66|- whether recovery followed reattach, update, restart, or no action.\n 67|\n 68|## Agreed milestone disposition\n\n## 2026-07-17-registry-stall-rca/\n### README.md\n*1|# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n 2|\n 3|**Status: doyle gate verdict ACCEPTED IN FULL 2026-07-17 — every source claim code-verified same day.**\n 4|Canonical RCA for the REGISTRY-STALL milestone candidate (ranked FIRST in the findings backlog,\n...\n 10|- **Defect A is a DROPPED RIDER**: identical defect was ruled 2026-07-15 as a THE-FORKENING W4\n*11|  rider (see `.claude/reports/2026-07-10-brain-self-hash-cpu/README.md` — OnceLock once-per-process\n 12|  digest, doc-comment fix same commit, injected digest-counter==1 gate, D7 process-replacement\n 13|  truthfulness leg). W4 closed without landing it. The prior ruling's stronger angle stands: the\n 14|  per-tick re-hash reads the current exe PATH, so a post-swap resident-old-bytes brain publishes\n...\n 25|  live until a conn-close sweep that never comes on the long-lived pump conn → ~500 parked\n*26|  writers of 589 broker threads. Doyle rider: name all spawned daemon threads (sub-writer\n 27|  minimum) so future censuses aren't blind.\n 28|- **Attribution correction (hertz final cross-check 2026-07-17, doyle-verified)**: the ~500\n 29|  retained writers are NOT Registry-only. The retention mechanism is FAMILY-AGNOSTIC: the broker\n...\n 53|- Final corrected RCA artifact (adds the resident-old/path-new hash truthfulness defect):\n*54|  `C:\\Users\\decid\\.omp\\state\\spt-endpoint\\hertz-v036-cpu-registry-rca.txt`.\n 55|\n 56|---\n 57|\n...\n 60|```\n*61|HERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n 62|Date: 2026-07-16/17 UTC\n 63|Node: HFENDULEAM\n 64|Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n...\n 67|=================\n*68|The two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n 69|4-5-session streaming overhead. Two source defects are independently proven:\n 70|\n 71|A. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\n...\n 85|  command: spt daemon brain --generation 1 --start-reason update\n*86|  20-second mean CPU: 15.5% of one logical core\n*87|  p95 CPU: 29.2% of one logical core\n 88|  read throughput mean: 63.91 MiB/s\n*89|  threads: 18-24\n*90|  active CPU threads over 5s: 5\n 91|\n 92|PID 72488:\n 93|  command: spt daemon run --detached\n*94|  20-second mean CPU: 11.4% of one logical core\n*95|  p95 CPU: 23.4% of one logical core\n 96|  write throughput mean: 3.74 MiB/s\n*97|  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n*98|  active CPU threads over 5s: only 4\n 99|\n*100|Host: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n 101|12.8-32% of one logical core, consistent with the psutil process measurements.\n 102|\n 103|This is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\n...\n 131|\n*132|This explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\n 133|a52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n 134|\n 135|Recommended fix A:\n...\n 203|  CONN_WRITE_POISONED: conn=1243 ... stream=524 ... write exceeded its 15000ms bound\n*204|  event=stream-sub-writer-poison replay write failed\n 205|  event=transport-close poisoned=true timed_out=true\n 206|  DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12\n 207|  event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n...\n 266|\n*267|The source names conn-watchdog and network runtime threads; Broker accept handlers and\n 268|SubscriberSeat writers are unnamed. Whole-log lifecycle accounting found only 30 currently open\n 269|BrokerConn handlers, 13 of them stream subscribers, and zero poisoned connections still open.\n 270|The dispatcher worker pool is capped at 8. Therefore the roughly 500 excess unnamed sleeping\n*271|threads fit retained SubscriberSeat writers attached to completed Registry StreamEntries on\n 272|long-lived QUIC connections. This is stronger than the earlier short-term \"stable thread count\"\n 273|observation: the count grows by periodic feed history, then plateaus only between pump\n 274|rounds/connection changes.\n...\n 280|   entries/history accumulate per pump round and drive O(history) enumeration/replay. Hundreds\n*281|   of sleeping broker threads are not explained by the 8-worker dispatcher pool alone.\n 282|2. PTY output replay: FALSIFIED as primary cause. The high brain read rate matches executable\n 283|   hashing, not daemon-log or PTY-file growth."}],"details":{"scopePath":".claude/reports, C:/Users/decid/AppData/Local/spt-core/rca-*","searchPath":"C:\\Users\\decid","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":27,"fileCount":3,"files":[".claude/reports/2026-07-10-brain-self-hash-cpu/README.md",".claude/reports/2026-07-10-hertz-session/01-pty-freeze-rca.md",".claude/reports/2026-07-17-registry-stall-rca/README.md"],"fileMatches":[{"path":".claude/reports/2026-07-10-brain-self-hash-cpu/README.md","count":6},{"path":".claude/reports/2026-07-10-hertz-session/01-pty-freeze-rca.md","count":1},{"path":".claude/reports/2026-07-17-registry-stall-rca/README.md","count":20}],"truncated":true,"perFileLimitReached":20,"displayContent":"# .claude/reports/\n\n## 2026-07-10-brain-self-hash-cpu/\n### README.md\n  10│\n *11│On an otherwise idle four-vCPU Linux VPS, `spt daemon brain` continuously consumes approximately 40–55% of one CPU. `perf` attributes roughly 73–76% of samples to `sha2::sha256::compress256`. File tracing repeatedly observes:\n  12│\n  13│1. `readlink(\"/proc/self/exe\", ...)`;\n  14│2. opening and reading `/usr/local/bin/spt`;\n    │...\n  17│\n *18│The issue's five-second sample averaged 45.2% of one CPU. No daemon or endpoint lifecycle operation was performed during the original or source-level diagnosis.\n  19│\n  20│## Pinned call chain\n  21│\n    │...\n  71│\n *72│### Atomic JSON publication is the dominant CPU source\n  73│\n *74│It causes avoidable disk churn but does not match the profile: approximately three quarters of CPU samples are in SHA-256, and source reads/hashes the entire binary before writing a small JSON record.\n  75│\n  76│### Repeated hashing is required to detect executable replacement\n  77│\n    │...\n  99│\n*100│After digest caching, the remaining two small atomic writes per second may still be worth reducing, but it is not necessary to close the reported SHA-256 CPU regression and should not be bundled without evidence.\n 101│\n 102│## Deterministic regression seam\n 103│\n    │...\n 119│\n*120│Avoid a flaky wall-clock CPU assertion as the primary CI gate. Use digest-call counters for deterministic behavior; keep a bounded Linux profiling/smoke acceptance to confirm idle CPU returns near sleep baseline.\n 121│\n 122│## Operational expectation after fix\n 123│\n\n## 2026-07-10-hertz-session/\n### 01-pty-freeze-rca.md\n 64│- whether a parallel `spt rc --view <endpoint>` also froze;\n*65│- daemon CPU;\n 66│- whether recovery followed reattach, update, restart, or no action.\n 67│\n 68│## Agreed milestone disposition\n\n## 2026-07-17-registry-stall-rca/\n### README.md\n  *1│# REGISTRY-STALL — v0.36 post-close CPU + Registry redispatch RCA (hertz, 2026-07-17)\n   2│\n   3│**Status: doyle gate verdict ACCEPTED IN FULL 2026-07-17 — every source claim code-verified same day.**\n   4│Canonical RCA for the REGISTRY-STALL milestone candidate (ranked FIRST in the findings backlog,\n    │...\n  10│- **Defect A is a DROPPED RIDER**: identical defect was ruled 2026-07-15 as a THE-FORKENING W4\n *11│  rider (see `.claude/reports/2026-07-10-brain-self-hash-cpu/README.md` — OnceLock once-per-process\n  12│  digest, doc-comment fix same commit, injected digest-counter==1 gate, D7 process-replacement\n  13│  truthfulness leg). W4 closed without landing it. The prior ruling's stronger angle stands: the\n  14│  per-tick re-hash reads the current exe PATH, so a post-swap resident-old-bytes brain publishes\n    │...\n  25│  live until a conn-close sweep that never comes on the long-lived pump conn → ~500 parked\n *26│  writers of 589 broker threads. Doyle rider: name all spawned daemon threads (sub-writer\n  27│  minimum) so future censuses aren't blind.\n  28│- **Attribution correction (hertz final cross-check 2026-07-17, doyle-verified)**: the ~500\n  29│  retained writers are NOT Registry-only. The retention mechanism is FAMILY-AGNOSTIC: the broker\n    │...\n  53│- Final corrected RCA artifact (adds the resident-old/path-new hash truthfulness defect):\n *54│  `C:\\Users\\decid\\.omp\\state\\spt-endpoint\\hertz-v036-cpu-registry-rca.txt`.\n  55│\n  56│---\n  57│\n    │...\n  60│```\n *61│HERTZ -> DOYLE: v0.36 CPU + REGISTRY REDISPATCH RCA\n  62│Date: 2026-07-16/17 UTC\n  63│Node: HFENDULEAM\n  64│Severity: HIGH performance regression plus post-close REDISPATCH recurrence\n    │...\n  67│=================\n *68│The two hot spt.exe processes are the broker and brain, but their observed CPU is NOT normal\n  69│4-5-session streaming overhead. Two source defects are independently proven:\n  70│\n  71│A. Brain hashes the entire 30.64 MiB spt.exe every 500ms heartbeat, despite the source comment\n    │...\n  85│  command: spt daemon brain --generation 1 --start-reason update\n *86│  20-second mean CPU: 15.5% of one logical core\n *87│  p95 CPU: 29.2% of one logical core\n  88│  read throughput mean: 63.91 MiB/s\n *89│  threads: 18-24\n *90│  active CPU threads over 5s: 5\n  91│\n  92│PID 72488:\n  93│  command: spt daemon run --detached\n *94│  20-second mean CPU: 11.4% of one logical core\n *95│  p95 CPU: 23.4% of one logical core\n  96│  write throughput mean: 3.74 MiB/s\n *97│  threads: 532-541 during the first sample; approximately 547-552 over a later 30-second census\n *98│  active CPU threads over 5s: only 4\n  99│\n*100│Host: 16 logical CPUs. Task Manager's 0.8-2% whole-machine reading corresponds to approximately\n 101│12.8-32% of one logical core, consistent with the psutil process measurements.\n 102│\n 103│This is sustained: 20 consecutive one-second samples reproduced it. It is not a momentary update\n    │...\n 131│\n*132│This explains the brain's constant CPU and read-I/O nearly exactly. It has existed since commit\n 133│a52f8c63 introduced exe_hash into write_ready; the heartbeat callsite predates it.\n 134│\n 135│Recommended fix A:\n    │...\n 203│  CONN_WRITE_POISONED: conn=1243 ... stream=524 ... write exceeded its 15000ms bound\n*204│  event=stream-sub-writer-poison replay write failed\n 205│  event=transport-close poisoned=true timed_out=true\n 206│  DISPATCH_EV: gen=1784265298871 stream=524 family=Registry attempt=0 conn=12\n 207│  event=worker-outcome detail=Failed(\"failed to fill whole buffer\") elapsed_ms=15800 endpoint=-\n    │...\n 266│\n*267│The source names conn-watchdog and network runtime threads; Broker accept handlers and\n 268│SubscriberSeat writers are unnamed. Whole-log lifecycle accounting found only 30 currently open\n 269│BrokerConn handlers, 13 of them stream subscribers, and zero poisoned connections still open.\n 270│The dispatcher worker pool is capped at 8. Therefore the roughly 500 excess unnamed sleeping\n*271│threads fit retained SubscriberSeat writers attached to completed Registry StreamEntries on\n 272│long-lived QUIC connections. This is stronger than the earlier short-term \"stable thread count\"\n 273│observation: the count grows by periodic feed history, then plateaus only between pump\n 274│rounds/connection changes.\n    │...\n 280│   entries/history accumulate per pump round and drive O(history) enumeration/replay. Hundreds\n*281│   of sleeping broker threads are not explained by the 8-worker dispatcher pool alone.\n 282│2. PTY output replay: FALSIFIED as primary cause. The high brain read rate matches executable\n 283│   hashing, not daemon-log or PTY-file growth."},"isError":false,"timestamp":1784293117806}}
{"type":"message","id":"58f5ac67","parentId":"7325c762","timestamp":"2026-07-17T12:58:37.939Z","message":{"role":"toolResult","toolCallId":"call_3j7k8dTvxdeoA37piSbk9Q9d|fc_0148993141920bab016a5a26fdabcc8195b184979c0132482f","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/.omp/state/spt-endpoint/\n## hertz.events.log\n 138|<EVENT-PART seq=\"3/3\" id=\"f15c571c\"> #321E wording noted as authoritative artifact text. Good catch pre-wave ΓÇö this widens B5's regression seam (physical-count plateau must be asserted across families, not just Registry).</EVENT-PART>\n*139|<EVENT-PART seq=\"1/3\" id=\"e6c09834\" type=\"msg\" from=\"doyle\">doyle FYI: operator fired the milestone ΓÇö REGISTRY-STALL + DAEMON-LIFECYCLE rolled into ONE: REGISTRY-LIFECYCLE, target v0.37.0 counter 64. Triage landed main @1b54e50 (ADR-0040/0041, KH 7.44/7.45, 14 REQs, docs/REGISTRY-LIFECYCLE-TRIAGE.md). todlando building W1 now (your fix set B1-B5 + the self-hash rider + thread </EVENT-PART>\n 140|<EVENT-PART seq=\"2/3\" id=\"e6c09834\">naming, accepted as filed; your regression seam = the W1 conformance test verbatim, cross-family per your correction). TWO things your side: (1) NEW STANDING ROLE, operator ruling ΓÇö you RCA every new roadblock that arises during this milestone (unexplained build/gate reds, wedges, anomalies; nobody fixes an ungrounded red ΓÇö expect loops fr</EVENT-PART>\n 141|<EVENT-PART seq=\"3/3\" id=\"e6c09834\">om todlando or me). (2) At release you field-verify against your preserved baseline: poison count freezes, brain CPU to noise, thread census bounded AND NAMED, zero WAKE_RESUME loops (W2). Keep the log snapshot + live log until then.</EVENT-PART>\n*142|<EVENT-PART seq=\"1/2\" id=\"2c9171e8\" type=\"msg\" from=\"deployah\">hertz ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves). Live on BigscreenVR/spt-bs-releases, update-set LIVE counter 64 / product 0.37.0 / channel stable, latest -&gt; v0.37.0. Ready for your field-verify against the preserved v0.36 baseline: poison-count freeze, CPU to noise (daemon self-verify 2x/</EVENT-PART>\n*143|<EVENT-PART seq=\"2/2\" id=\"2c9171e8\">sec -&gt; once-at-start), bounded+named thread census, zero WAKE_RESUME. Your GO closes the milestone. URL: https://github.com/BigscreenVR/spt-bs-releases/releases/tag/v0.37.0</EVENT-PART>\n*144|<EVENT-PART seq=\"1/3\" id=\"b1b672d0\" type=\"msg\" from=\"doyle\">doyle -&gt; hertz: FIELD-VERIFY GO ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves; tag v0.37.0 @9b910e0, releases/latest live). Your locked gate, against the preserved v0.36 baseline: (1) poison count FREEZES ΓÇö snapshot had 15, live log must not grow past its final v0.36 count after upgrade; (2) bra</EVENT-PART>\n 145|<EVENT-PART seq=\"2/3\" id=\"b1b672d0\">in CPU/read-I/O to noise (was 15.5%/core, 63.91 MiB/s self-hash reads) + broker CPU down (was 11.4%/core); (3) thread census bounded AND NAMED ΓÇö expect sub-writer-s&lt;id&gt;/sub-writer-presence/broker-conn labels, unnamed population collapses from ~546, total plateaus O(active); net-status now carries streams_held/stream_seats gauges for th</EVENT-PART>\n 146|<EVENT-PART seq=\"3/3\" id=\"b1b672d0\">e plateau check; (4) zero WAKE_RESUME loops post-upgrade + no resurrection of dead endpoints; bonus discriminators if cheap: stale ONLINE hybrid rows self-heal within one reconcile, raw rc-window close frees CONTROLLED. Upgrade at your pace, sample past a full pump cadence + at least one daemon refresh. Your PASS closes the milestone.</EVENT-PART>"}],"details":{"scopePath":"C:/Users/decid/.omp/state/spt-endpoint","searchPath":"C:/Users/decid/.omp/state/spt-endpoint","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":4,"fileCount":1,"files":["C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log"],"fileMatches":[{"path":"C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log","count":4}],"truncated":false,"displayContent":"# C:/Users/decid/.omp/state/spt-endpoint/\n## hertz.events.log\n 138│<EVENT-PART seq=\"3/3\" id=\"f15c571c\"> #321E wording noted as authoritative artifact text. Good catch pre-wave ΓÇö this widens B5's regression seam (physical-count plateau must be asserted across families, not just Registry).</EVENT-PART>\n*139│<EVENT-PART seq=\"1/3\" id=\"e6c09834\" type=\"msg\" from=\"doyle\">doyle FYI: operator fired the milestone ΓÇö REGISTRY-STALL + DAEMON-LIFECYCLE rolled into ONE: REGISTRY-LIFECYCLE, target v0.37.0 counter 64. Triage landed main @1b54e50 (ADR-0040/0041, KH 7.44/7.45, 14 REQs, docs/REGISTRY-LIFECYCLE-TRIAGE.md). todlando building W1 now (your fix set B1-B5 + the self-hash rider + thread </EVENT-PART>\n 140│<EVENT-PART seq=\"2/3\" id=\"e6c09834\">naming, accepted as filed; your regression seam = the W1 conformance test verbatim, cross-family per your correction). TWO things your side: (1) NEW STANDING ROLE, operator ruling ΓÇö you RCA every new roadblock that arises during this milestone (unexplained build/gate reds, wedges, anomalies; nobody fixes an ungrounded red ΓÇö expect loops fr</EVENT-PART>\n 141│<EVENT-PART seq=\"3/3\" id=\"e6c09834\">om todlando or me). (2) At release you field-verify against your preserved baseline: poison count freezes, brain CPU to noise, thread census bounded AND NAMED, zero WAKE_RESUME loops (W2). Keep the log snapshot + live log until then.</EVENT-PART>\n*142│<EVENT-PART seq=\"1/2\" id=\"2c9171e8\" type=\"msg\" from=\"deployah\">hertz ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves). Live on BigscreenVR/spt-bs-releases, update-set LIVE counter 64 / product 0.37.0 / channel stable, latest -&gt; v0.37.0. Ready for your field-verify against the preserved v0.36 baseline: poison-count freeze, CPU to noise (daemon self-verify 2x/</EVENT-PART>\n*143│<EVENT-PART seq=\"2/2\" id=\"2c9171e8\">sec -&gt; once-at-start), bounded+named thread census, zero WAKE_RESUME. Your GO closes the milestone. URL: https://github.com/BigscreenVR/spt-bs-releases/releases/tag/v0.37.0</EVENT-PART>\n*144│<EVENT-PART seq=\"1/3\" id=\"b1b672d0\" type=\"msg\" from=\"doyle\">doyle -&gt; hertz: FIELD-VERIFY GO ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves; tag v0.37.0 @9b910e0, releases/latest live). Your locked gate, against the preserved v0.36 baseline: (1) poison count FREEZES ΓÇö snapshot had 15, live log must not grow past its final v0.36 count after upgrade; (2) bra</EVENT-PART>\n 145│<EVENT-PART seq=\"2/3\" id=\"b1b672d0\">in CPU/read-I/O to noise (was 15.5%/core, 63.91 MiB/s self-hash reads) + broker CPU down (was 11.4%/core); (3) thread census bounded AND NAMED ΓÇö expect sub-writer-s&lt;id&gt;/sub-writer-presence/broker-conn labels, unnamed population collapses from ~546, total plateaus O(active); net-status now carries streams_held/stream_seats gauges for th</EVENT-PART>\n 146│<EVENT-PART seq=\"3/3\" id=\"b1b672d0\">e plateau check; (4) zero WAKE_RESUME loops post-upgrade + no resurrection of dead endpoints; bonus discriminators if cheap: stale ONLINE hybrid rows self-heal within one reconcile, raw rc-window close frees CONTROLLED. Upgrade at your pace, sample past a full pump cadence + at least one daemon refresh. Your PASS closes the milestone.</EVENT-PART>"},"isError":false,"timestamp":1784293117939}}
{"type":"message","id":"af2f0955","parentId":"58f5ac67","timestamp":"2026-07-17T12:58:42.768Z","message":{"role":"toolResult","toolCallId":"call_SpNS8MowIR4FrHPDKfJP14zt|fc_0148993141920bab016a5a26fdabc08195b93babfddf97634e","toolName":"glob","content":[{"type":"text","text":"No files found matching pattern\nglob timed out after 5s; returning 0 partial matches — narrow the pattern instead of retrying blindly"}],"details":{"scopePath":"C:/Users/decid/Documents/**/*.csv, C:/Users/decid/Documents/**/*.json, C:/Users/decid/Documents/**/*.txt","fileCount":0,"files":[],"truncated":true,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"useless":true,"timestamp":1784293122768}}
{"type":"message","id":"9cb0ef4f","parentId":"af2f0955","timestamp":"2026-07-17T12:58:50.320Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Reviewing hertz events log details**"},{"type":"toolCall","id":"call_URcyWgDGbQM7aai3BryLBcHQ|fc_0148993141920bab016a5a270a3f1c8195bbfca8c7f3159e92","name":"read","arguments":{"i":"Reading current Hertz events","path":"C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log","selector":"138-220"}},{"type":"toolCall","id":"call_LZGhwaKaqoFpETkD6r0lfF3A|fc_0148993141920bab016a5a270a3f308195959cb00e6d59c27a","name":"read","arguments":{"i":"Reading Hertz current state files","path":"C:/Users/decid/.omp/state/spt-endpoint","selector":null}},{"type":"toolCall","id":"call_M1gpDj5Wd82ELBswZjW8wsou|fc_0148993141920bab016a5a270a3f38819595aa6d03c342915a","name":"read","arguments":{"i":"Reading verification cursor","path":"C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.log","selector":"1-220"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":233700,"output":167,"cacheRead":0,"cacheWrite":0,"totalTokens":233867,"reasoningTokens":23,"cost":{"input":1.1685,"output":0.00501,"cacheRead":0,"cacheWrite":0,"total":1.17351}},"stopReason":"toolUse","timestamp":1784293122814,"responseId":"resp_0148993141920bab016a5a2703282481958a9333d6989e8fa8","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0148993141920bab016a5a2707cc308195a922da0ca73539bb","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWicKo2r__VWqEs7L2U-cjQ40_qsJ4BdHPGgIp97tGdOBaruK8DE-00uNGYiqihOqsoTUJoW7uz_PqQbe9JO7Mt-xpRtlVhlo0fQgs7aYaKXuJB2kdUtgiBadGSw_ptzIOy4XZx6buCtzoviiBILUwA8J4sdXML44ZbISCxomdLHdbGTsKe3CZ_LRcxZm4s_yqXuZywLbj5HlF5UXS6WWpwlAnOCUN-6F_SNKBbii7s3XErgVS_D0E5VH7uVBu0eWlLGjmgUxS7EvChyAg04QwaFK1AQMZGFe9JFh4Jx61Mc628mJh5pS0uYEMEu685lRDoqbwZttq2ssaC4xn-1FFPcoY9rIvL5al_FAqp_8JEmv7bWl87E_TUV4wUOGsIEh-vRtJWpc_Yhlhcp1QsA1jR6hcAQmKQFRt3xBxfgHMjroRTZlmjdVi993zDKxSIn1gkat8O5K7yaUwPcRQC5t89N1aJD_9uLS47ALiRrYBvXf0YCJx9RK69c0T94rcHP3O24gWrchC19nCRN1BBtyIyUws7XXNTDvpkosX0y3yvov1bAUbebRt1xV9CH7xKFPYeFmPFnIYavGNS1Htv3oGFrd_EPTd5kBIV2hSaGdZevfV_6fLScqxPY7UGtrlBkCtezAo-ukuO-u5lpm_IGbGqSEhhq6_aDUyNG8j0M1wLxRQU2xPD4m7WkdIIZyGTZGjms4PBIDzALupatRfJHVZIGPXvJDfq_NmaqPEVad-U-e5DSw-uK2sPKAdN0JsqquGc7LXD2psVRvQanx5aSuvDZAPgeXEiiuOmj3A9CJEw15T2brjn2gg9bV8NSUQMsbVa0Sk8Emew13omvfFMuDsESmarK1Z4NDH3c8LuNT5GcabqZknWohDiofvxG2sG55vCBvc-ro0Jjz4cI511PEbmO7P-BdXzYpZyKPQz9XEQEsV5YT0eIJqIy35mwGAnWM9FmzaIov5YUAnCbPJmRvx-VW_OumTSaqn4xVol5XcyrpzppfsKhIMUZU4VPMw26_KFVhFvG8NzlnGkiCpFGNZv2UweO3EzhNOlhd-jFh_jYqEUE=","summary":[{"type":"summary_text","text":"**Reviewing hertz events log details**"}]},{"id":"fc_0148993141920bab016a5a270a3f1c8195bbfca8c7f3159e92","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading current Hertz events\",\"path\":\"C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log\",\"selector\":\"138-220\"}","call_id":"call_URcyWgDGbQM7aai3BryLBcHQ","name":"read"},{"id":"fc_0148993141920bab016a5a270a3f308195959cb00e6d59c27a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading Hertz current state files\",\"path\":\"C:/Users/decid/.omp/state/spt-endpoint\",\"selector\":null}","call_id":"call_LZGhwaKaqoFpETkD6r0lfF3A","name":"read"},{"id":"fc_0148993141920bab016a5a270a3f38819595aa6d03c342915a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading verification cursor\",\"path\":\"C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.log\",\"selector\":\"1-220\"}","call_id":"call_M1gpDj5Wd82ELBswZjW8wsou","name":"read"}]},"duration":7504.199000000954,"ttft":4997.858199998736,"contextSnapshot":{"promptTokens":233700,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_URcyWgDGbQM7aai3BryLBcHQ|fc_0148993141920bab016a5a270a3f1c8195bbfca8c7f3159e92","toolName":"read","startedAt":"2026-07-17T12:58:50.320Z","args":{"path":"C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log"},"intent":"Reading current Hertz events"},"id":"d8cbc879","parentId":"9cb0ef4f","timestamp":"2026-07-17T12:58:50.320Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_LZGhwaKaqoFpETkD6r0lfF3A|fc_0148993141920bab016a5a270a3f308195959cb00e6d59c27a","toolName":"read","startedAt":"2026-07-17T12:58:50.320Z","args":{"path":"C:/Users/decid/.omp/state/spt-endpoint"},"intent":"Reading Hertz current state files"},"id":"fb5ee63e","parentId":"d8cbc879","timestamp":"2026-07-17T12:58:50.320Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_M1gpDj5Wd82ELBswZjW8wsou|fc_0148993141920bab016a5a270a3f38819595aa6d03c342915a","toolName":"read","startedAt":"2026-07-17T12:58:50.320Z","args":{"path":"C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.log"},"intent":"Reading verification cursor"},"id":"0bb5944e","parentId":"fb5ee63e","timestamp":"2026-07-17T12:58:50.320Z"}
{"type":"message","id":"829c6a9b","parentId":"0bb5944e","timestamp":"2026-07-17T12:58:50.322Z","message":{"role":"toolResult","toolCallId":"call_LZGhwaKaqoFpETkD6r0lfF3A|fc_0148993141920bab016a5a270a3f308195959cb00e6d59c27a","toolName":"read","content":[{"type":"text","text":".\n  - hertz.events.cursor                                5B        13m ago\n  - hertz.events.log                                   50.6KB    13m ago\n  - hertz-v036-cpu-registry-rca.txt                    13.3KB    5h ago\n  - v036-registry-stall-daemon.stderr.log.snapshot     5.5MB     5h ago\n  - hertz-v036-redispatch-field-verdict.txt            5.7KB     7h ago\n  - v036-webbie-rc-refresh.typescript                  18.3KB    7h ago\n  - hertz-v035-mesh-triple-verdict.txt                 4.6KB     11h ago\n  - mesh-v035-trap-recovery.log                        8.5KB     11h ago\n  - mesh-trap-orchestrator.sh                          521B      11h ago\n  - drop-hf-peer-row.py                                514B      11h ago\n  - mesh-v035-human-health-outage.log                  3.5KB     11h ago\n  - mesh-human-health-sampler.sh                       312B      11h ago\n  - mesh-v035-health-suspend.log                       102.4KB   11h ago\n  - mesh-v035-health-outage-sustained.log              101.6KB   11h ago\n  - mesh-health-sampler.sh                             313B      11h ago\n  - mesh-v035-health-outage.log                        45.1KB    11h ago\n  - mesh-v035-kitsubito-peer-addrs.post.json           1.8KB     11h ago\n  - mesh-v035-hfenduleam-peer-addrs.post.json          4.7KB     11h ago\n  - mesh-v035-kitsubito-peer-addrs.pre.json            570B      11h ago\n  - mesh-v035-hfenduleam-peer-addrs.pre.json           3.0KB     11h ago\n  - webbie-v034-live-stall-daemon.stderr.log.snapshot  6.6MB     12h ago\n  - hertz-v034-pty-stall-rca.txt                       14.7KB    12h ago\n  - hertz-elevated-endpoint-rca.txt                    9.8KB     13h ago\n  - hertz-perri-lifecycle-triage.txt                   7.3KB     13h ago\n  - hertz-v034-redispatch-verdict.txt                  3.3KB     22h ago\n  - gaki-remote-probes.txt                             2.9KB     1d ago\n  - gaki-uac-repro.ps1                                 4.7KB     1d ago\n  - hertz-gaki-correction.txt                          6.9KB     1d ago\n  - hertz-refresh-rca.txt                              6.3KB     1d ago\n  - hertz-v033-verdict.txt                             2.6KB     1d ago\n  - hertz-verify.events.log                            23B       1d ago\n  - hertz-verify.events.cursor                         1B        1d ago"}],"details":{"isDirectory":true,"resolvedPath":"C:\\Users\\decid\\.omp\\state\\spt-endpoint","meta":{"source":{"type":"path","value":"C:\\Users\\decid\\.omp\\state\\spt-endpoint"}}},"isError":false,"timestamp":1784293130322}}
{"type":"message","id":"9965b8a0","parentId":"829c6a9b","timestamp":"2026-07-17T12:58:50.324Z","message":{"role":"toolResult","toolCallId":"call_M1gpDj5Wd82ELBswZjW8wsou|fc_0148993141920bab016a5a270a3f38819595aa6d03c342915a","toolName":"read","content":[{"type":"text","text":"﻿READY:hertz-verify\n"}],"details":{"displayContent":{"text":"﻿READY:hertz-verify\r\n","startLine":1,"lineNumbers":[1,2]},"meta":{"source":{"type":"path","value":"C:/Users/decid/.omp/state/spt-endpoint/hertz-verify.events.log"}}},"isError":false,"timestamp":1784293130324}}
{"type":"message","id":"1c99545a","parentId":"9965b8a0","timestamp":"2026-07-17T12:58:50.328Z","message":{"role":"toolResult","toolCallId":"call_URcyWgDGbQM7aai3BryLBcHQ|fc_0148993141920bab016a5a270a3f1c8195bbfca8c7f3159e92","toolName":"read","content":[{"type":"text","text":"<EVENT-PART seq=\"2/3\" id=\"f15c571c\">c/update seats on the pump carrier retain too. Canonical report + backlog updated: B5 re-scoped to CROSS-FAMILY bounded seat lifetime (unsubscribe verb or seat-scoped EOF release) rather than a Registry-scoped patch, with Registry rows kept as the independent driver of the O(history) enumeration + snapshot amplification (B1-B3 unchanged). Your</EVENT-PART>\n<EVENT-PART seq=\"3/3\" id=\"f15c571c\"> #321E wording noted as authoritative artifact text. Good catch pre-wave ΓÇö this widens B5's regression seam (physical-count plateau must be asserted across families, not just Registry).</EVENT-PART>\n<EVENT-PART seq=\"1/3\" id=\"e6c09834\" type=\"msg\" from=\"doyle\">doyle FYI: operator fired the milestone ΓÇö REGISTRY-STALL + DAEMON-LIFECYCLE rolled into ONE: REGISTRY-LIFECYCLE, target v0.37.0 counter 64. Triage landed main @1b54e50 (ADR-0040/0041, KH 7.44/7.45, 14 REQs, docs/REGISTRY-LIFECYCLE-TRIAGE.md). todlando building W1 now (your fix set B1-B5 + the self-hash rider + thread </EVENT-PART>\n<EVENT-PART seq=\"2/3\" id=\"e6c09834\">naming, accepted as filed; your regression seam = the W1 conformance test verbatim, cross-family per your correction). TWO things your side: (1) NEW STANDING ROLE, operator ruling ΓÇö you RCA every new roadblock that arises during this milestone (unexplained build/gate reds, wedges, anomalies; nobody fixes an ungrounded red ΓÇö expect loops fr</EVENT-PART>\n<EVENT-PART seq=\"3/3\" id=\"e6c09834\">om todlando or me). (2) At release you field-verify against your preserved baseline: poison count freezes, brain CPU to noise, thread census bounded AND NAMED, zero WAKE_RESUME loops (W2). Keep the log snapshot + live log until then.</EVENT-PART>\n<EVENT-PART seq=\"1/2\" id=\"2c9171e8\" type=\"msg\" from=\"deployah\">hertz ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves). Live on BigscreenVR/spt-bs-releases, update-set LIVE counter 64 / product 0.37.0 / channel stable, latest -&gt; v0.37.0. Ready for your field-verify against the preserved v0.36 baseline: poison-count freeze, CPU to noise (daemon self-verify 2x/</EVENT-PART>\n<EVENT-PART seq=\"2/2\" id=\"2c9171e8\">sec -&gt; once-at-start), bounded+named thread census, zero WAKE_RESUME. Your GO closes the milestone. URL: https://github.com/BigscreenVR/spt-bs-releases/releases/tag/v0.37.0</EVENT-PART>\n<EVENT-PART seq=\"1/3\" id=\"b1b672d0\" type=\"msg\" from=\"doyle\">doyle -&gt; hertz: FIELD-VERIFY GO ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves; tag v0.37.0 @9b910e0, releases/latest live). Your locked gate, against the preserved v0.36 baseline: (1) poison count FREEZES ΓÇö snapshot had 15, live log must not grow past its final v0.36 count after upgrade; (2) bra</EVENT-PART>\n<EVENT-PART seq=\"2/3\" id=\"b1b672d0\">in CPU/read-I/O to noise (was 15.5%/core, 63.91 MiB/s self-hash reads) + broker CPU down (was 11.4%/core); (3) thread census bounded AND NAMED ΓÇö expect sub-writer-s&lt;id&gt;/sub-writer-presence/broker-conn labels, unnamed population collapses from ~546, total plateaus O(active); net-status now carries streams_held/stream_seats gauges for th</EVENT-PART>\n<EVENT-PART seq=\"3/3\" id=\"b1b672d0\">e plateau check; (4) zero WAKE_RESUME loops post-upgrade + no resurrection of dead endpoints; bonus discriminators if cheap: stale ONLINE hybrid rows self-heal within one reconcile, raw rc-window close frees CONTROLLED. Upgrade at your pace, sample past a full pump cadence + at least one daemon refresh. Your PASS closes the milestone.</EVENT-PART>\n"}],"details":{"displayContent":{"text":"<EVENT-PART seq=\"2/3\" id=\"f15c571c\">c/update seats on the pump carrier retain too. Canonical report + backlog updated: B5 re-scoped to CROSS-FAMILY bounded seat lifetime (unsubscribe verb or seat-scoped EOF release) rather than a Registry-scoped patch, with Registry rows kept as the independent driver of the O(history) enumeration + snapshot amplification (B1-B3 unchanged). Your</EVENT-PART>\r\n<EVENT-PART seq=\"3/3\" id=\"f15c571c\"> #321E wording noted as authoritative artifact text. Good catch pre-wave ΓÇö this widens B5's regression seam (physical-count plateau must be asserted across families, not just Registry).</EVENT-PART>\r\n<EVENT-PART seq=\"1/3\" id=\"e6c09834\" type=\"msg\" from=\"doyle\">doyle FYI: operator fired the milestone ΓÇö REGISTRY-STALL + DAEMON-LIFECYCLE rolled into ONE: REGISTRY-LIFECYCLE, target v0.37.0 counter 64. Triage landed main @1b54e50 (ADR-0040/0041, KH 7.44/7.45, 14 REQs, docs/REGISTRY-LIFECYCLE-TRIAGE.md). todlando building W1 now (your fix set B1-B5 + the self-hash rider + thread </EVENT-PART>\r\n<EVENT-PART seq=\"2/3\" id=\"e6c09834\">naming, accepted as filed; your regression seam = the W1 conformance test verbatim, cross-family per your correction). TWO things your side: (1) NEW STANDING ROLE, operator ruling ΓÇö you RCA every new roadblock that arises during this milestone (unexplained build/gate reds, wedges, anomalies; nobody fixes an ungrounded red ΓÇö expect loops fr</EVENT-PART>\r\n<EVENT-PART seq=\"3/3\" id=\"e6c09834\">om todlando or me). (2) At release you field-verify against your preserved baseline: poison count freezes, brain CPU to noise, thread census bounded AND NAMED, zero WAKE_RESUME loops (W2). Keep the log snapshot + live log until then.</EVENT-PART>\r\n<EVENT-PART seq=\"1/2\" id=\"2c9171e8\" type=\"msg\" from=\"deployah\">hertz ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves). Live on BigscreenVR/spt-bs-releases, update-set LIVE counter 64 / product 0.37.0 / channel stable, latest -&gt; v0.37.0. Ready for your field-verify against the preserved v0.36 baseline: poison-count freeze, CPU to noise (daemon self-verify 2x/</EVENT-PART>\r\n<EVENT-PART seq=\"2/2\" id=\"2c9171e8\">sec -&gt; once-at-start), bounded+named thread census, zero WAKE_RESUME. Your GO closes the milestone. URL: https://github.com/BigscreenVR/spt-bs-releases/releases/tag/v0.37.0</EVENT-PART>\r\n<EVENT-PART seq=\"1/3\" id=\"b1b672d0\" type=\"msg\" from=\"doyle\">doyle -&gt; hertz: FIELD-VERIFY GO ΓÇö v0.37.0 counter 64 PUBLISHED (REGISTRY-LIFECYCLE, all 3 waves; tag v0.37.0 @9b910e0, releases/latest live). Your locked gate, against the preserved v0.36 baseline: (1) poison count FREEZES ΓÇö snapshot had 15, live log must not grow past its final v0.36 count after upgrade; (2) bra</EVENT-PART>\r\n<EVENT-PART seq=\"2/3\" id=\"b1b672d0\">in CPU/read-I/O to noise (was 15.5%/core, 63.91 MiB/s self-hash reads) + broker CPU down (was 11.4%/core); (3) thread census bounded AND NAMED ΓÇö expect sub-writer-s&lt;id&gt;/sub-writer-presence/broker-conn labels, unnamed population collapses from ~546, total plateaus O(active); net-status now carries streams_held/stream_seats gauges for th</EVENT-PART>\r\n<EVENT-PART seq=\"3/3\" id=\"b1b672d0\">e plateau check; (4) zero WAKE_RESUME loops post-upgrade + no resurrection of dead endpoints; bonus discriminators if cheap: stale ONLINE hybrid rows self-heal within one reconcile, raw rc-window close frees CONTROLLED. Upgrade at your pace, sample past a full pump cadence + at least one daemon refresh. Your PASS closes the milestone.</EVENT-PART>\r\n","startLine":137,"lineNumbers":[137,138,139,140,141,142,143,144,145,146,147]},"meta":{"source":{"type":"path","value":"C:/Users/decid/.omp/state/spt-endpoint/hertz.events.log"}}},"isError":false,"timestamp":1784293130328}}
{"type":"compaction","id":"f94c5ef7","parentId":"1c99545a","timestamp":"2026-07-17T12:58:50.416Z","summary":"[Superseded compaction summary elided after a newer compaction]","shortSummary":"Superseded compaction elided","firstKeptEntryId":"2039e78e","tokensBefore":233867,"details":{"readFiles":[".","C:/Users/decid/AppData/Local/spt-core","C:/Users/decid/AppData/Local/spt-core/daemon.json","C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json","C:/Users/decid/AppData/Local/spt-core/identity/registry","C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/pump/registry.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/shellwake.rs","crates/spt-daemon/src/stderrlog.rs"],"modifiedFiles":[]},"fromExtension":false}
{"type":"message","id":"b3655e07","parentId":"f94c5ef7","timestamp":"2026-07-17T12:59:13.302Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing process cadence and load patterns**\n\n**Identifying burst timing and loop frequencies**"},{"type":"toolCall","id":"call_j9cBfBaaXRjyNg2IMyfyY9qn|fc_034a6be5a6696b6c016a5a2720ea7481918e3dfdf3adc2152b","name":"read","arguments":{"i":"Reading brain main loop","path":"crates/spt-daemon/src/brainproc.rs","selector":"130-390"}},{"type":"toolCall","id":"call_drskCdsyvEBDue5WsU0DzxA8|fc_034a6be5a6696b6c016a5a2720ea9081919617c22d1d33474e","name":"grep","arguments":{"i":"Locating brain worker spawns","pattern":"thread::spawn|Builder::new|spawn_|run_.*loop|PERIOD|INTERVAL|sleep\\(","path":"crates/spt-daemon/src/brainproc.rs","selector":"130-500","case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_KEUHLq5CKGbacLLg6s83Ilsd|fc_034a6be5a6696b6c016a5a2720ea9c8191adab77a5aa8a436e","name":"grep","arguments":{"i":"Locating daemon periodic loops","pattern":"pub const .*PERIOD|const .*PERIOD|const .*INTERVAL|thread::sleep|recv_timeout|DEFAULT_.*POLL","path":"crates/spt-daemon/src","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_aznyWpe3oWArDm100zWIbmUC|fc_034a6be5a6696b6c016a5a2720eaa48191ba985f27238a833c","name":"grep","arguments":{"i":"Locating consumer gates","pattern":"spawn_net_consumers|spawn_live|spawn_wake|spawn_proj|spawn_digest|spawn_psyche|spawn_peer|spawn_dispatch","path":"crates/spt-daemon/src/brainproc.rs","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":51149,"output":717,"cacheRead":0,"cacheWrite":0,"totalTokens":51866,"reasoningTokens":426,"cost":{"input":0.255745,"output":0.02151,"cacheRead":0,"cacheWrite":0,"total":0.27725500000000003}},"stopReason":"toolUse","timestamp":1784293130483,"responseId":"resp_034a6be5a6696b6c016a5a270dcf58819191dafeb683eb5291","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a2713cbe88191b7613a81dac43716","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWicgYnBMTZsVZqux3w-q4ZCj7tzQz8XaSAwvlLqEPiVv4K_7rOMwjeha6rhac8ZXV_uqjZeW5DvTfFGfkd65rk_GECv1eoI_DJ_OMpe8ogrzmKvKb0AofoeLwesZoaaA6MAhmP00OK6MOkKIHJclggT9HiTPrUkc-f577VwuTffxj40wgD3BC7n9UDF8sJNdZRLpg71x8FXtspDajQw8sNYgndrnasHB2Mje8Topi_VIO-w_7fDvl_UmEDzG2oEjUWymH03vAKBo3yruGhJ08asaHm7_4vKachzX3_uikGaX1lg2mabnpN4Z37Whr9OfhPA997n418ZRzQQ_rC3nbWa9bDqsvg7hWShno1XsFDfXzMfUFsZJvfuI32o38KSuEme9rSg1cz1Bwx6HNjDSv5tyJOk_LxW7rRZ07MxogZlTgJKJgNFkn3RjD2XKz4nPdWhMt3Pf9XEK-UACU62cyrIeEdrumJ1C40uc4MAwOhRXqr8RrsXtQqrMMH66ZPrRIjD5ta5pwfk2_biNZhU6bFw_rwTjRMys_hABWggQvRVinnYk2Oo-TKFPYLqtMUgaOYuRKuzzGNtdnFID4b5Xsxw1OiaN27-TQkSc7zkBYQxQ8jboTiWEhzvr9Olzbb4mU4hm4THI_zxt2XJvKHr1lFf_fZn0QQ5-fhzNXXEfr4tWLMHrME5EjsTC7VxuCDPZKghDV-ArZuzweMPT8ME0-l6fZjzyXWuLtx3Dv_WEnYMQeSakfEq3szhfKIJDDiMWwrQ9ZOcnmQFvqwR8ysvrlo88VwM5og0xjWgl8pcHb3D1uzZZnB6YrqKEX9jqMtiIA1BEk-Ua1CBbWn9RKtt2KDJ5CczNUdhNG_UdBjojgWe56RHllJlQ6X21K-qO9oGDP-AbfNzx0RnAA9W8tdlqa5by8q1KryuL0hIehqQfVxTUfnJVsqnBLUJ88tMRvbJxEllAAbUYAdnibC93eM1qILmT3sEKBtuyJH26TgS3I_n2CoTurPew7nCG6Q3OX8hbdvQ5EAxLBJYpJeP2iwPkvxjJrtB1MdsrC2ipK-D5oWTpU7Q5t_EbCSMu9YD2S69M2y_FrhilIdiNOtRoxK0B2hvkW2vPkcLJJQrZ1nr10lDwJAKid6e0njm4WYnA-DkXBl9vxSp06elkOw2E44XKBrzlrKy3_M6BJxsUmduaNugq4WThDMnLKMsFrfShqf_4gS9sZ93P4tFhDlChPFztBD1rB7YIAZutlM9CDA9OuCZsGeziit7nGrWdy7BH3un35cbdPzP5VOqqlI2-PF4q9T2grxoy3BSNdQC4diNyEuiFnDXFWcnklmZ9VXTK7c9gut_ZQ09zw7EpOFmzhqmOdI3vxZdMAhkIehfuueeaQsslRts-uPJVv79GR3TZIJRhU167qoYpwGl1WfHN08srtckUoCJNCk2lWUOhDTOV3fO7i9bPaTkFtCRiEm15FV1j3uMM4KF9AAWdzfP6hHmEUdlgJMzYSn5pJwSCy162A_ScuEbAJXPtTI7-oxlTMmg0dxvqowxajZd8pZPpG8StFVqtb30d_NNwrMzX9vkl-6VHTlqGpUBZr3bTfNtlns5aM5TFlhn1bRjeSgllJYfQWSSfE5Ul-vcNACglUPJJW8UmbudRxRttdcG6Yd2G0IjHW2RFuz0ktWTTZHGy6a4G4jS2L2wkmTWZMFIo2pkAqGjBFftCUidthlQk8yGB0MEJxuSqC8QyyKSd7Zgq9SRzj-NVHtQj-hG3oopI7t4jZFZ01STXDWZMqJ0WbcBVaW2du_yiuLy0olJ2z6FEN-WV_Zv5tbALilNqQsdt5hBUXxff5Nn_gxIABMAc3YlApltA3bCnbYDgCYNqlPOQE0HLil7IdaVlKQ39iVeOrs2u77Ax6tXdBtd8DWHtep1dEhE6htSoUq2eo_E79PVmdVLYqa8lr4Kwad5R0yo-qP-vlqT8PlLKz4hN89p91OxCEk1oIlGejADVoiZhrSBxoDclB3ucdfSdtbywrM168Tkhdkr6kiQP2MQ50Ry6WQxsYmTtN93EqvB3zyysneQ9nBCGAmOF5kYA0ZQyqTS2Vs-zgQNul3egdruu_ipVDDVd-Q9UGTTwoEKGvOjRz2oN2UAXO_APA6djt2USAabCMtj9I8jC-Tg_cViW0MtY8XTQ1HmM5D6dzzO83KM96nu-a0CR2pm1LbWZ6F8LHsNRKhkRzc4iAOa3b2Q06epCC_dCShxwhBjs00tTUDl00_QyQon3wlcc4y0fa_thpcxDL-OgxilqTDkmTn9wnNIRDgDiQpA7pOWSo6btmw2twkst16LPU-Cv_SAKK307NpkMNyhtKQKCRzAqMUihXDS3zEvjEB-4DDIFYYQMNsIiH-CfRo_RyWQHAsOkia7gZdzlUpSy4H3F8wODYbIPkOs-6qFWbq3dIMrqK3hmZhnXfqm6oufjvZlZvdJ_pA-tje2i8H_k7P9utjp59quISHtcI7_iy5YbYKFvDopXmjywtf3fJQ7lZ6HPL_UdxvpP_OodWtt63i9XwytqxwJzkVjdnhU7AZnxeZEIklp7rpSLM-NzopsbgbEO10t5rfeM72VGNdbXuTWFp1NXzYyOaNbuSydDZYLhF6Kd0ds47J4pElZopfR_5ybJrgU6teBFLpwphu9bUy3JkQjEzvpI2ux_IrM2_ruPh1F7ohYg9fa33LbRzhj7LkpLMwVReuMqu_7ITruoaB6uUAMiYRKGE4MlhWm45CYqQ0Y4fHLigwKqow5Ngl2-8KsdFeC7fGsGqjY0drNGObfSn-7GPO9g8F7GfVb5lhcjbLX9NDAquNIC4yxzCO5HPQAynumwUmpmawPcOc5bMfe8hEn0xurYNL9d7MooLnfLrcd1uwnrinv0mvoTE90Yx85aknzXnJhvcvCM5HlF0JvWV72dKISBbgChlJurkPzaxhq5RLsBanwlHLS3oOUHsozyNPez8a73Q7UG9_SNK5BqgUBdAzkT8bZ56Um1ZN4U5uSUvv-p_tYEjjRkpbVRtX7wRg7Z5SROnSU5pXVQBRFmfN3vC-1ldlXpadmrHFt0fm8bt_QZAn5uHhW_m7CptjoWfStNWlyqODJhcQnMiCW4fNTBSICgm0HtHLONzc-PGuifWIsRpjOWDrTSrl9QO2Z8iLFdj8Wdy9LX2n_q9CX8N81xXYjz10YbQEu2Y86DOcHu86DcFQcM8ttZVlJm65uff22bpk0NFj0ZtkJdRPkn8ByhTNKXdU_N_znZBPXaiR6V","summary":[{"type":"summary_text","text":"**Analyzing process cadence and load patterns**"},{"type":"summary_text","text":"**Identifying burst timing and loop frequencies**"}]},{"id":"fc_034a6be5a6696b6c016a5a2720ea7481918e3dfdf3adc2152b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading brain main loop\",\"path\":\"crates/spt-daemon/src/brainproc.rs\",\"selector\":\"130-390\"}","call_id":"call_j9cBfBaaXRjyNg2IMyfyY9qn","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a2720ea9081919617c22d1d33474e","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating brain worker spawns\",\"pattern\":\"thread::spawn|Builder::new|spawn_|run_.*loop|PERIOD|INTERVAL|sleep\\\\(\",\"path\":\"crates/spt-daemon/src/brainproc.rs\",\"selector\":\"130-500\",\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_drskCdsyvEBDue5WsU0DzxA8","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a2720ea9c8191adab77a5aa8a436e","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating daemon periodic loops\",\"pattern\":\"pub const .*PERIOD|const .*PERIOD|const .*INTERVAL|thread::sleep|recv_timeout|DEFAULT_.*POLL\",\"path\":\"crates/spt-daemon/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_KEUHLq5CKGbacLLg6s83Ilsd","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a2720eaa48191ba985f27238a833c","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating consumer gates\",\"pattern\":\"spawn_net_consumers|spawn_live|spawn_wake|spawn_proj|spawn_digest|spawn_psyche|spawn_peer|spawn_dispatch\",\"path\":\"crates/spt-daemon/src/brainproc.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_aznyWpe3oWArDm100zWIbmUC","name":"grep"}]},"duration":22809.456200003624,"ttft":9393.574900001287,"contextSnapshot":{"promptTokens":51149,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_j9cBfBaaXRjyNg2IMyfyY9qn|fc_034a6be5a6696b6c016a5a2720ea7481918e3dfdf3adc2152b","toolName":"read","startedAt":"2026-07-17T12:59:13.303Z","args":{"path":"crates/spt-daemon/src/brainproc.rs"},"intent":"Reading brain main loop"},"id":"e774a5cb","parentId":"b3655e07","timestamp":"2026-07-17T12:59:13.303Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_drskCdsyvEBDue5WsU0DzxA8|fc_034a6be5a6696b6c016a5a2720ea9081919617c22d1d33474e","toolName":"grep","startedAt":"2026-07-17T12:59:13.303Z","args":{"path":"crates/spt-daemon/src/brainproc.rs"},"intent":"Locating brain worker spawns"},"id":"ff925156","parentId":"e774a5cb","timestamp":"2026-07-17T12:59:13.303Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KEUHLq5CKGbacLLg6s83Ilsd|fc_034a6be5a6696b6c016a5a2720ea9c8191adab77a5aa8a436e","toolName":"grep","startedAt":"2026-07-17T12:59:13.303Z","args":{"path":"crates/spt-daemon/src"},"intent":"Locating daemon periodic loops"},"id":"2123c9ab","parentId":"ff925156","timestamp":"2026-07-17T12:59:13.303Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_aznyWpe3oWArDm100zWIbmUC|fc_034a6be5a6696b6c016a5a2720eaa48191ba985f27238a833c","toolName":"grep","startedAt":"2026-07-17T12:59:13.303Z","args":{"path":"crates/spt-daemon/src/brainproc.rs"},"intent":"Locating consumer gates"},"id":"50a041ee","parentId":"2123c9ab","timestamp":"2026-07-17T12:59:13.303Z"}
{"type":"message","id":"c8ed84dd","parentId":"50a041ee","timestamp":"2026-07-17T12:59:13.313Z","message":{"role":"toolResult","toolCallId":"call_aznyWpe3oWArDm100zWIbmUC|fc_034a6be5a6696b6c016a5a2720eaa48191ba985f27238a833c","toolName":"grep","content":[{"type":"text","text":" 189|    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n*190|    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n 191|    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n 192|    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n 193|    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n...\n 234|    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*235|    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n 236|\n 237|    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n 238|    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n...\n 245|    // [impl->REQ-DAEMON-1]\n*246|    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n 247|\n 248|    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n 249|    // brain hosts the SOLE single-flight writer — load persisted index, boot\n...\n 272|            let hex = status.node_id_hex.clone().unwrap_or_default();\n*273|            spawn_net_consumers(&hex);\n 274|            consumers_started = true;\n 275|            eprintln!(\n 276|                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n...\n 320|// [impl->REQ-DAEMON-9]\n*321|fn spawn_net_consumers(node_hex: &str) {\n 322|    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323|    let stop = Arc::new(AtomicBool::new(false));\n*324|    let _ = crate::dispatch::spawn_dispatcher(\n 325|        broker_socket_name(),\n 326|        Arc::clone(&registry),\n 327|        Arc::clone(&stop),\n...\n 330|    if cfg.peer_pump {\n*331|        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332|    }\n 333|}\n 334|"}],"details":{"scopePath":"crates/spt-daemon/src/brainproc.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brainproc.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":7,"fileCount":1,"files":["crates/spt-daemon/src/brainproc.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brainproc.rs","count":7}],"truncated":false,"displayContent":" 189│    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n*190│    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n 191│    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n 192│    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n 193│    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n    │...\n 234│    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*235│    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n 236│\n 237│    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n 238│    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n    │...\n 245│    // [impl->REQ-DAEMON-1]\n*246│    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n 247│\n 248│    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n 249│    // brain hosts the SOLE single-flight writer — load persisted index, boot\n    │...\n 272│            let hex = status.node_id_hex.clone().unwrap_or_default();\n*273│            spawn_net_consumers(&hex);\n 274│            consumers_started = true;\n 275│            eprintln!(\n 276│                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n    │...\n 320│// [impl->REQ-DAEMON-9]\n*321│fn spawn_net_consumers(node_hex: &str) {\n 322│    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323│    let stop = Arc::new(AtomicBool::new(false));\n*324│    let _ = crate::dispatch::spawn_dispatcher(\n 325│        broker_socket_name(),\n 326│        Arc::clone(&registry),\n 327│        Arc::clone(&stop),\n    │...\n 330│    if cfg.peer_pump {\n*331│        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332│    }\n 333│}\n 334│"},"isError":false,"timestamp":1784293153312}}
{"type":"message","id":"5c01243d","parentId":"c8ed84dd","timestamp":"2026-07-17T12:59:13.313Z","message":{"role":"toolResult","toolCallId":"call_drskCdsyvEBDue5WsU0DzxA8|fc_034a6be5a6696b6c016a5a2720ea9081919617c22d1d33474e","toolName":"grep","content":[{"type":"text","text":" 189|    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n*190|    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n 191|    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n 192|    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n 193|    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n...\n 234|    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*235|    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n 236|\n 237|    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n*238|    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n 239|    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240|    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241|    // shell waker). Online-only is staged behind the interim `api listen`\n...\n 245|    // [impl->REQ-DAEMON-1]\n*246|    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n 247|\n 248|    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n 249|    // brain hosts the SOLE single-flight writer — load persisted index, boot\n...\n 255|    // [impl->REQ-PROJECT-INDEX-WRITER]\n*256|    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\n 257|\n 258|    let mut consumers_started = false;\n 259|    loop {\n*260|        thread::sleep(BRAIN_HEARTBEAT);\n 261|        // `net-status` is both the net-capability probe and the broker-liveness\n 262|        // probe: an `Err` is the broker gone (or a future planned\n 263|        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n...\n 272|            let hex = status.node_id_hex.clone().unwrap_or_default();\n*273|            spawn_net_consumers(&hex);\n 274|            consumers_started = true;\n 275|            eprintln!(\n 276|                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n...\n 320|// [impl->REQ-DAEMON-9]\n*321|fn spawn_net_consumers(node_hex: &str) {\n 322|    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323|    let stop = Arc::new(AtomicBool::new(false));\n*324|    let _ = crate::dispatch::spawn_dispatcher(\n 325|        broker_socket_name(),\n 326|        Arc::clone(&registry),\n 327|        Arc::clone(&stop),\n...\n 330|    if cfg.peer_pump {\n*331|        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332|    }\n 333|}\n 334|\n...\n 342|                last = Some(e);\n*343|                thread::sleep(Duration::from_millis(10));\n 344|            }\n 345|        }\n 346|    }\n...\n 454|/// durable two-phase applied record, the generation-stamped readiness probe,\n*455|/// and the promote/rollback effects — all **injected** (exactly as `spawn_child`\n 456|/// is) so the unit harness drives the readiness-gated state machine\n 457|/// deterministically with a scripted ready/no-ready + a capturing notif sink,\n 458|/// while production binds the real `spt_home` + relcache + notif sender"}],"details":{"scopePath":"crates/spt-daemon/src/brainproc.rs","searchPath":"C:/Users/decid/Documents/projects/spt-core/crates/spt-daemon/src/brainproc.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":12,"fileCount":1,"files":["crates/spt-daemon/src/brainproc.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/brainproc.rs","count":12}],"truncated":false,"displayContent":" 189│    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n*190│    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n 191│    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n 192│    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n 193│    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n    │...\n 234│    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n*235│    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n 236│\n 237│    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n*238│    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n 239│    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240│    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241│    // shell waker). Online-only is staged behind the interim `api listen`\n    │...\n 245│    // [impl->REQ-DAEMON-1]\n*246│    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n 247│\n 248│    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n 249│    // brain hosts the SOLE single-flight writer — load persisted index, boot\n    │...\n 255│    // [impl->REQ-PROJECT-INDEX-WRITER]\n*256│    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\n 257│\n 258│    let mut consumers_started = false;\n 259│    loop {\n*260│        thread::sleep(BRAIN_HEARTBEAT);\n 261│        // `net-status` is both the net-capability probe and the broker-liveness\n 262│        // probe: an `Err` is the broker gone (or a future planned\n 263│        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n    │...\n 272│            let hex = status.node_id_hex.clone().unwrap_or_default();\n*273│            spawn_net_consumers(&hex);\n 274│            consumers_started = true;\n 275│            eprintln!(\n 276│                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n    │...\n 320│// [impl->REQ-DAEMON-9]\n*321│fn spawn_net_consumers(node_hex: &str) {\n 322│    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n 323│    let stop = Arc::new(AtomicBool::new(false));\n*324│    let _ = crate::dispatch::spawn_dispatcher(\n 325│        broker_socket_name(),\n 326│        Arc::clone(&registry),\n 327│        Arc::clone(&stop),\n    │...\n 330│    if cfg.peer_pump {\n*331│        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n 332│    }\n 333│}\n 334│\n    │...\n 342│                last = Some(e);\n*343│                thread::sleep(Duration::from_millis(10));\n 344│            }\n 345│        }\n 346│    }\n    │...\n 454│/// durable two-phase applied record, the generation-stamped readiness probe,\n*455│/// and the promote/rollback effects — all **injected** (exactly as `spawn_child`\n 456│/// is) so the unit harness drives the readiness-gated state machine\n 457│/// deterministically with a scripted ready/no-ready + a capturing notif sink,\n 458│/// while production binds the real `spt_home` + relcache + notif sender"},"isError":false,"timestamp":1784293153313}}
{"type":"message","id":"f761e9cc","parentId":"5c01243d","timestamp":"2026-07-17T12:59:13.326Z","message":{"role":"toolResult","toolCallId":"call_j9cBfBaaXRjyNg2IMyfyY9qn|fc_034a6be5a6696b6c016a5a2720ea7481918e3dfdf3adc2152b","toolName":"read","content":[{"type":"text","text":"impl BrainRestart {\n…\n    pub fn request(&self) {\n…\n    }\n\n    /// Consume a pending request (supervisor side): true at most once per\n    /// `request`, clearing it so the next cycle starts fresh.\n    pub fn take(&self) -> bool {\n        self.requested.swap(false, Ordering::SeqCst)\n    }\n}\n\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\n/// holding the connection and probing broker liveness each heartbeat. A dropped\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\n/// from the (possibly swapped) binary.\n///\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\n/// and start them exactly once, on the first `enabled` reply. That single gate\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\n/// NetHost bind in the background and `net-status` flips `enabled` when it\n/// attaches, at which point the brain starts the consumers — no extra signal.\n///\n/// It inherits the broker's already-unelevated token as a plain child, so it\n/// runs no de-elevation guard of its own.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\n    let _ = crate::stderrlog::install(\"brain\", generation);\n    let name = broker_socket_name();\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\n    // *counter* is rehydrated, never the wall-clock stamp.\n    eprintln!(\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\n        std::process::id(),\n        reason.as_arg(),\n    );\n\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\n    // from its delivered cursor, the production replacement for the retired\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\n    match brain.resume_session_cursors() {\n        Ok(ids) if !ids.is_empty() => {\n            eprintln!(\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\n                ids.len()\n            )\n        }\n        Ok(_) => {}\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\n    }\n\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\n    // breadcrumb would accept a brain that connected but never rebuilt\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\n    // this is forward-correct: the gate is defined on the real readiness\n    // semantic the live-agent adapter inherits.\n    write_ready(generation);\n\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\n    // online/offline exclusivity — a reconcile loop that runs each offline\n    // instance's `wake_command` as a supervised watcher child. Relocated from\n    // the broker process to the brain child: shellwake is brain-owned logic\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\n    // posture. The stop flag is held for symmetry, never raised (the watchers\n    // die with the brain process and the next brain re-sweeps them).\n    // [impl->REQ-SHELL-2]\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\n\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n    // shell waker). Online-only is staged behind the interim `api listen`\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\n    // brain the first-host. The stop flag is held for symmetry; the threads die\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\n    // [impl->REQ-DAEMON-1]\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\n\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\n    // reconcile in the background (ready-without-warm is preserved because\n    // write_ready already fired above), then drain/debounce/coalesce the\n    // invalidation queue. Same posture as the hosts above: the stop flag is\n    // held for symmetry, the thread dies with the brain, and the next brain\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\n    // [impl->REQ-PROJECT-INDEX-WRITER]\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\n\n    let mut consumers_started = false;\n    loop {\n        thread::sleep(BRAIN_HEARTBEAT);\n        // `net-status` is both the net-capability probe and the broker-liveness\n        // probe: an `Err` is the broker gone (or a future planned\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n        let status = match brain.net_status() {\n            Ok(s) => s,\n            Err(e) => {\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\n                return Err(e);\n            }\n        };\n        if consumer_gate(status.enabled, consumers_started) {\n            let hex = status.node_id_hex.clone().unwrap_or_default();\n            spawn_net_consumers(&hex);\n            consumers_started = true;\n            eprintln!(\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\n            );\n        }\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\n        // window, so without this the wedge never drains: the promotion DRAINED gate\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\n        // best-effort — a transient sessions error must never fell the heartbeat (the\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\n        // its own trial against a live older broker — no coordinated broker restart.\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\n        let _ = brain.sessions();\n        write_ready(generation);\n    }\n}\n\n/// Whether to spawn the net consumers this heartbeat: only once the broker\n/// reports a net endpoint up (`net_enabled`) AND we have not already started\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\n/// semantics that keep a single dispatcher/peer-pump set running.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\n    net_enabled && !already_started\n}\n\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\n/// the brain child (restoration D2-1):** both are standalone IPC clients\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\n/// restartable brain. Each mints its own registry + stop flag and connects\n/// independently; when the brain process exits these in-process threads die with\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\n/// `net-status` reply rather than the broker's identity load.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n// [impl->REQ-DAEMON-9]\nfn spawn_net_consumers(node_hex: &str) {\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\n    let stop = Arc::new(AtomicBool::new(false));\n    let _ = crate::dispatch::spawn_dispatcher(\n        broker_socket_name(),\n        Arc::clone(&registry),\n        Arc::clone(&stop),\n    );\n    let cfg = crate::config::DaemonConfig::load();\n    if cfg.peer_pump {\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\n    }\n}\n\n/// Connect to the broker, retrying briefly while it finishes binding.\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\n    let mut last: Option<io::Error> = None;\n    for _ in 0..tries {\n        match Brain::cold_start(name, now_ms()) {\n            Ok(b) => return Ok(b),\n            Err(e) => {\n                last = Some(e);\n                thread::sleep(Duration::from_millis(10));\n            }\n        }\n    }\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\n}\n\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\n/// flips across a swap; the D7-4 field run asserts it matches the released\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\nfn write_ready(generation: u64) {\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\n    if let Some(hash) = current_exe_hash() {\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\n    }\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\n}\n\n/// Lowercase-hex SHA-256 of the running process's own executable file,\n/// captured **exactly once per brain process** (best-effort; a failed\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\n/// running. The once-per-process capture is load-bearing TWICE\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\n/// published the NEW file's hash: the breadcrumb lied in the exact enlyzeam\n/// class it exists to catch. Once-at-start capture IS the resident-bytes\n/// truthfulness contract (a respawned brain is a new process and computes the\n/// swapped binary's hash independently — the D7 process-replacement e2e).\n// [impl->REQ-BRAIN-HASH-ONCE]\nfn current_exe_hash() -> Option<String> {\n    static EXE_HASH: OnceLock<Option<String>> = OnceLock::new();\n    EXE_HASH\n        .get_or_init(|| {\n            EXE_HASH_COMPUTES.fetch_add(1, Ordering::Relaxed);\n…\n        })\n        .clone()\n}\n\n[Showing lines 129-393 of 2165. Use :394 to continue]"}],"details":{"truncation":{"content":"    }\r\n\r\n    /// Consume a pending request (supervisor side): true at most once per\r\n    /// `request`, clearing it so the next cycle starts fresh.\r\n    pub fn take(&self) -> bool {\r\n        self.requested.swap(false, Ordering::SeqCst)\r\n    }\r\n}\r\n\r\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\r\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\r\n/// holding the connection and probing broker liveness each heartbeat. A dropped\r\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\r\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\r\n/// from the (possibly swapped) binary.\r\n///\r\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\r\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\r\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\r\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\r\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\r\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\r\n/// and start them exactly once, on the first `enabled` reply. That single gate\r\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\r\n/// NetHost bind in the background and `net-status` flips `enabled` when it\r\n/// attaches, at which point the brain starts the consumers — no extra signal.\r\n///\r\n/// It inherits the broker's already-unelevated token as a plain child, so it\r\n/// runs no de-elevation guard of its own.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\r\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\r\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\r\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\r\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\r\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\r\n    let _ = crate::stderrlog::install(\"brain\", generation);\r\n    let name = broker_socket_name();\r\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\r\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\r\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\r\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\r\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\r\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\r\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\r\n    // *counter* is rehydrated, never the wall-clock stamp.\r\n    eprintln!(\r\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\r\n        std::process::id(),\r\n        reason.as_arg(),\r\n    );\r\n\r\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\r\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\r\n    // from its delivered cursor, the production replacement for the retired\r\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\r\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\r\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\r\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\r\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\r\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\r\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\r\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\r\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\r\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\r\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\r\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\r\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\r\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\r\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\r\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\r\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\r\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\r\n    match brain.resume_session_cursors() {\r\n        Ok(ids) if !ids.is_empty() => {\r\n            eprintln!(\r\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\r\n                ids.len()\r\n            )\r\n        }\r\n        Ok(_) => {}\r\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\r\n    }\r\n\r\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\r\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\r\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\r\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\r\n    // breadcrumb would accept a brain that connected but never rebuilt\r\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\r\n    // this is forward-correct: the gate is defined on the real readiness\r\n    // semantic the live-agent adapter inherits.\r\n    write_ready(generation);\r\n\r\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\r\n    // online/offline exclusivity — a reconcile loop that runs each offline\r\n    // instance's `wake_command` as a supervised watcher child. Relocated from\r\n    // the broker process to the brain child: shellwake is brain-owned logic\r\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\r\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\r\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\r\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\r\n    // posture. The stop flag is held for symmetry, never raised (the watchers\r\n    // die with the brain process and the next brain re-sweeps them).\r\n    // [impl->REQ-SHELL-2]\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\r\n\r\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\r\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\r\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\r\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\r\n    // shell waker). Online-only is staged behind the interim `api listen`\r\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\r\n    // brain the first-host. The stop flag is held for symmetry; the threads die\r\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\r\n    // [impl->REQ-DAEMON-1]\r\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\r\n\r\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\r\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\r\n    // reconcile in the background (ready-without-warm is preserved because\r\n    // write_ready already fired above), then drain/debounce/coalesce the\r\n    // invalidation queue. Same posture as the hosts above: the stop flag is\r\n    // held for symmetry, the thread dies with the brain, and the next brain\r\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\r\n\r\n    let mut consumers_started = false;\r\n    loop {\r\n        thread::sleep(BRAIN_HEARTBEAT);\r\n        // `net-status` is both the net-capability probe and the broker-liveness\r\n        // probe: an `Err` is the broker gone (or a future planned\r\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\r\n        let status = match brain.net_status() {\r\n            Ok(s) => s,\r\n            Err(e) => {\r\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\r\n                return Err(e);\r\n            }\r\n        };\r\n        if consumer_gate(status.enabled, consumers_started) {\r\n            let hex = status.node_id_hex.clone().unwrap_or_default();\r\n            spawn_net_consumers(&hex);\r\n            consumers_started = true;\r\n            eprintln!(\r\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\r\n            );\r\n        }\r\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\r\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\r\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\r\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\r\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\r\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\r\n        // window, so without this the wedge never drains: the promotion DRAINED gate\r\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\r\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\r\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\r\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\r\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\r\n        // best-effort — a transient sessions error must never fell the heartbeat (the\r\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\r\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\r\n        // its own trial against a live older broker — no coordinated broker restart.\r\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n        let _ = brain.sessions();\r\n        write_ready(generation);\r\n    }\r\n}\r\n\r\n/// Whether to spawn the net consumers this heartbeat: only once the broker\r\n/// reports a net endpoint up (`net_enabled`) AND we have not already started\r\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\r\n/// semantics that keep a single dispatcher/peer-pump set running.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\r\n    net_enabled && !already_started\r\n}\r\n\r\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\r\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\r\n/// the brain child (restoration D2-1):** both are standalone IPC clients\r\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\r\n/// restartable brain. Each mints its own registry + stop flag and connects\r\n/// independently; when the brain process exits these in-process threads die with\r\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\r\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\r\n/// `net-status` reply rather than the broker's identity load.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n// [impl->REQ-DAEMON-9]\r\nfn spawn_net_consumers(node_hex: &str) {\r\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\r\n    let stop = Arc::new(AtomicBool::new(false));\r\n    let _ = crate::dispatch::spawn_dispatcher(\r\n        broker_socket_name(),\r\n        Arc::clone(&registry),\r\n        Arc::clone(&stop),\r\n    );\r\n    let cfg = crate::config::DaemonConfig::load();\r\n    if cfg.peer_pump {\r\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\r\n    }\r\n}\r\n\r\n/// Connect to the broker, retrying briefly while it finishes binding.\r\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\r\n    let mut last: Option<io::Error> = None;\r\n    for _ in 0..tries {\r\n        match Brain::cold_start(name, now_ms()) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => {\r\n                last = Some(e);\r\n                thread::sleep(Duration::from_millis(10));\r\n            }\r\n        }\r\n    }\r\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\r\n}\r\n\r\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\r\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\r\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\r\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\r\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\r\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\r\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\r\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\r\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\r\n/// flips across a swap; the D7-4 field run asserts it matches the released\r\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\r\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\r\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\r\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn write_ready(generation: u64) {\r\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\r\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\r\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\r\n    if let Some(hash) = current_exe_hash() {\r\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\r\n    }\r\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\r\n}\r\n\r\n/// Lowercase-hex SHA-256 of the running process's own executable file,\r\n/// captured **exactly once per brain process** (best-effort; a failed\r\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\r\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\r\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\r\n/// running. The once-per-process capture is load-bearing TWICE\r\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\r\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\r\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\r\n/// published the NEW file's hash: the breadcrumb lied in the exact enlyzeam\r\n/// class it exists to catch. Once-at-start capture IS the resident-bytes\r\n/// truthfulness contract (a respawned brain is a new process and computes the\r\n/// swapped binary's hash independently — the D7 process-replacement e2e).\r\n// [impl->REQ-BRAIN-HASH-ONCE]\r\nfn current_exe_hash() -> Option<String> {\r\n    static EXE_HASH: OnceLock<Option<String>> = OnceLock::new();\r\n    EXE_HASH\r\n        .get_or_init(|| {\r\n            EXE_HASH_COMPUTES.fetch_add(1, Ordering::Relaxed);\r","truncated":true,"truncatedBy":"lines","totalLines":2037,"totalBytes":15874,"outputLines":265,"outputBytes":15874,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl BrainRestart {\n…\n    pub fn request(&self) {\n…\n    }\r\n\r\n    /// Consume a pending request (supervisor side): true at most once per\r\n    /// `request`, clearing it so the next cycle starts fresh.\r\n    pub fn take(&self) -> bool {\r\n        self.requested.swap(false, Ordering::SeqCst)\r\n    }\r\n}\r\n\r\n/// The `spt daemon brain` child entry. Connect to the broker over the existing\r\n/// socket IPC, signal readiness, host the brain-side logic loops, and idle —\r\n/// holding the connection and probing broker liveness each heartbeat. A dropped\r\n/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)\r\n/// returns `Err`, exiting the process so the broker-side supervisor respawns it\r\n/// from the (possibly swapped) binary.\r\n///\r\n/// **D2-1 — net consumers run here.** The inbound dispatcher + outbound peer\r\n/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no\r\n/// shared `Arc<Broker>`), so they belong with the restartable brain, not the\r\n/// broker — a brain respawn re-spawns them from the swapped binary. They are\r\n/// meaningful only once the broker-owned NetHost is up, so we gate on the\r\n/// existing `net-status` verb (which also serves as the broker-liveness probe)\r\n/// and start them exactly once, on the first `enabled` reply. That single gate\r\n/// also covers the boot-race self-heal (REQ-DAEMON-9): the broker retries the\r\n/// NetHost bind in the background and `net-status` flips `enabled` when it\r\n/// attaches, at which point the brain starts the consumers — no extra signal.\r\n///\r\n/// It inherits the broker's already-unelevated token as a plain child, so it\r\n/// runs no de-elevation guard of its own.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\npub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {\r\n    // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink\r\n    // (REQ-DAEMON-STDERR-PERSIST) — a detached brain's stdio is /dev/null, so every\r\n    // diagnostic below would otherwise vanish (the incident-night RCA-blind gap). Runs\r\n    // FIRST so even the BRAIN_UP line and a connect failure are captured. Best-effort.\r\n    // [impl->REQ-DAEMON-STDERR-PERSIST]\r\n    let _ = crate::stderrlog::install(\"brain\", generation);\r\n    let name = broker_socket_name();\r\n    let mut brain = connect_retry(&name, BRAIN_CONNECT_TRIES)?;\r\n    // The broker hands {generation, start-reason} at spawn (ADR-0018 V2): the\r\n    // generation is broker-owned custody of the KH-2.4 counter (no longer the\r\n    // brain→brain BrainState.generation, which retires in D4), and the reason is\r\n    // Q4's update-vs-crash discriminator that D5 will use to decide whether to\r\n    // preserve or reset phase-significant loop timing. D3-2 surfaces them; D5\r\n    // consumes the reason. `gen_start` stays fresh-now per KH-2.4 — only the\r\n    // *counter* is rehydrated, never the wall-clock stamp.\r\n    eprintln!(\r\n        \"BRAIN_UP: connected to broker {name} (pid {}, generation {generation}, start-reason {})\",\r\n        std::process::id(),\r\n        reason.as_arg(),\r\n    );\r\n\r\n    // Multi-session cold-start resume (restoration D4-2, ADR-0018 Q6): rebuild\r\n    // continuity from the broker — re-attach EVERY hosted session in resume mode\r\n    // from its delivered cursor, the production replacement for the retired\r\n    // brain→brain `BrainState` handoff. Today the supervised daemon brain hosts no\r\n    // PTY sessions (net-consumers + shellwake re-derive from disk / `net-status`),\r\n    // so this is a no-op now and forward-correct when daemon-hosted sessions land\r\n    // (the live-agent adapter). A failure here is non-fatal — the brain still\r\n    // serves; the next heartbeat probes broker liveness. NOTE: this is the PTY\r\n    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\r\n    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\r\n    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\r\n    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\r\n    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\r\n    // this conn (the heartbeat below reads it only in net_status()/sessions()\r\n    // drain-and-discard loops), so it MUST NOT subscribe — an undrained subscription on\r\n    // this request/reply conn is the SharedSend self-deadlock that re-wedged v0.30.4\r\n    // (brain.rs resume_sessions deadlock warning). `resume_session_cursors` re-establishes\r\n    // the per-session dedup cursors + returns the ids WITHOUT subscribing; the subscribing\r\n    // `resume_sessions` stays for DRAINING callers (the resume int tests / the forward\r\n    // live-agent-adapter drained carrier). Empty today (the daemon hosts no PTY sessions).\r\n    // [impl->REQ-BRAIN-RESUME-NO-CONN-DEADLOCK]\r\n    match brain.resume_session_cursors() {\r\n        Ok(ids) if !ids.is_empty() => {\r\n            eprintln!(\r\n                \"BRAIN_RESUMED: re-established {} session cursor(s): {ids:?}\",\r\n                ids.len()\r\n            )\r\n        }\r\n        Ok(_) => {}\r\n        Err(e) => eprintln!(\"BRAIN_RESUME_NONFATAL: {e} — no sessions resumed, continuing\"),\r\n    }\r\n\r\n    // Signal READY only now — AFTER session resume (restoration D6-1b, ADR-0018\r\n    // Q7): \"ready\" is the design's \"re-attached all sessions + resumed loops\",\r\n    // not merely \"socket connected\". The supervisor's readiness gate (D6-2)\r\n    // promotes the trial binary on this stamp; promoting on a bare post-connect\r\n    // breadcrumb would accept a brain that connected but never rebuilt\r\n    // continuity. Today resume is a near-noop (no daemon-hosted sessions), so\r\n    // this is forward-correct: the gate is defined on the real readiness\r\n    // semantic the live-agent adapter inherits.\r\n    write_ready(generation);\r\n\r\n    // Shell wake-watchers (restoration D2-2): the offline half of the shell\r\n    // online/offline exclusivity — a reconcile loop that runs each offline\r\n    // instance's `wake_command` as a supervised watcher child. Relocated from\r\n    // the broker process to the brain child: shellwake is brain-owned logic\r\n    // (ADR-0018 Q5 exception), a pure disk-reconciler that only reaches the\r\n    // broker over the same socket IPC for the remote-wake dial. Its boot sweep\r\n    // doubles as orphan cleanup, so a brain respawn re-reconciles the watcher\r\n    // children from disk — exactly the Q5 \"re-reconciled on brain start\"\r\n    // posture. The stop flag is held for symmetry, never raised (the watchers\r\n    // die with the brain process and the next brain re-sweeps them).\r\n    // [impl->REQ-SHELL-2]\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));\r\n\r\n    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\r\n    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\r\n    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\r\n    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\r\n    // shell waker). Online-only is staged behind the interim `api listen`\r\n    // (status-absent perches are skipped — no double-host) until W0.2 makes the\r\n    // brain the first-host. The stop flag is held for symmetry; the threads die\r\n    // with the brain and the next brain rehydrates from disk (CONTEXT:194).\r\n    // [impl->REQ-DAEMON-1]\r\n    let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);\r\n\r\n    // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the\r\n    // brain hosts the SOLE single-flight writer — load persisted index, boot\r\n    // reconcile in the background (ready-without-warm is preserved because\r\n    // write_ready already fired above), then drain/debounce/coalesce the\r\n    // invalidation queue. Same posture as the hosts above: the stop flag is\r\n    // held for symmetry, the thread dies with the brain, and the next brain\r\n    // rehydrates from the persisted index (warm start, fingerprint-gated).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    let _ = crate::projwriter::spawn_index_writer(Arc::new(AtomicBool::new(false)));\r\n\r\n    let mut consumers_started = false;\r\n    loop {\r\n        thread::sleep(BRAIN_HEARTBEAT);\r\n        // `net-status` is both the net-capability probe and the broker-liveness\r\n        // probe: an `Err` is the broker gone (or a future planned\r\n        // snapshot+self-exit, Q3) — exit for a supervised respawn.\r\n        let status = match brain.net_status() {\r\n            Ok(s) => s,\r\n            Err(e) => {\r\n                eprintln!(\"BRAIN_BROKER_LOST: {e} — exiting for supervised respawn\");\r\n                return Err(e);\r\n            }\r\n        };\r\n        if consumer_gate(status.enabled, consumers_started) {\r\n            let hex = status.node_id_hex.clone().unwrap_or_default();\r\n            spawn_net_consumers(&hex);\r\n            consumers_started = true;\r\n            eprintln!(\r\n                \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) — dispatcher + peer pump started\"\r\n            );\r\n        }\r\n        // DRIVE the broker's controller-liveness reap every heartbeat (UPDATE-WEDGE\r\n        // fix, counter-54). A `KIND_SESSIONS` poll is what runs the broker's\r\n        // `reap_dead_controller` sweep (broker.rs), which stall-evicts a black-holed\r\n        // LOCAL controller conn a HARD-KILLED prior brain generation left behind (its\r\n        // hosted PTYs keep writing to a dead pipe → the broker-side writer BLOCKS, never\r\n        // EOFs). Nothing else polls `KIND_SESSIONS` during an isolated brain-trial\r\n        // window, so without this the wedge never drains: the promotion DRAINED gate\r\n        // (`old_gen_drained()` = `!any_local_controller_wedged()`, a PURE READ that never\r\n        // drives the evict) stays false for the full trial → \"alive but never ready\"\r\n        // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery\r\n        // (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on\r\n        // BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);\r\n        // best-effort — a transient sessions error must never fell the heartbeat (the\r\n        // net_status probe above already owns broker-liveness). Self-applies: it drives\r\n        // the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands\r\n        // its own trial against a live older broker — no coordinated broker restart.\r\n        // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n        let _ = brain.sessions();\r\n        write_ready(generation);\r\n    }\r\n}\r\n\r\n/// Whether to spawn the net consumers this heartbeat: only once the broker\r\n/// reports a net endpoint up (`net_enabled`) AND we have not already started\r\n/// them. Pure for the unit table — the spawn-exactly-once + net-gating\r\n/// semantics that keep a single dispatcher/peer-pump set running.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn consumer_gate(net_enabled: bool, already_started: bool) -> bool {\r\n    net_enabled && !already_started\r\n}\r\n\r\n/// Spawn the net consumers — the inbound dispatcher + the outbound peer pump\r\n/// (D9-1) — against the broker's socket. **Relocated from the broker process to\r\n/// the brain child (restoration D2-1):** both are standalone IPC clients\r\n/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the\r\n/// restartable brain. Each mints its own registry + stop flag and connects\r\n/// independently; when the brain process exits these in-process threads die with\r\n/// it, and the respawned brain re-spawns them from the current binary. Mirrors\r\n/// the wiring the broker boot used to do, `node_hex` now sourced from the\r\n/// `net-status` reply rather than the broker's identity load.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n// [impl->REQ-DAEMON-9]\r\nfn spawn_net_consumers(node_hex: &str) {\r\n    let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));\r\n    let stop = Arc::new(AtomicBool::new(false));\r\n    let _ = crate::dispatch::spawn_dispatcher(\r\n        broker_socket_name(),\r\n        Arc::clone(&registry),\r\n        Arc::clone(&stop),\r\n    );\r\n    let cfg = crate::config::DaemonConfig::load();\r\n    if cfg.peer_pump {\r\n        let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);\r\n    }\r\n}\r\n\r\n/// Connect to the broker, retrying briefly while it finishes binding.\r\nfn connect_retry(name: &str, tries: u32) -> io::Result<Brain> {\r\n    let mut last: Option<io::Error> = None;\r\n    for _ in 0..tries {\r\n        match Brain::cold_start(name, now_ms()) {\r\n            Ok(b) => return Ok(b),\r\n            Err(e) => {\r\n                last = Some(e);\r\n                thread::sleep(Duration::from_millis(10));\r\n            }\r\n        }\r\n    }\r\n    Err(last.unwrap_or_else(|| io::Error::other(\"brain could not connect to broker\")))\r\n}\r\n\r\n/// Write the readiness breadcrumb (best-effort), restoration D6-1b + D7-1: a\r\n/// self-describing JSON `{pid, generation, exe_hash}`. A supervisor/test reads\r\n/// the `pid` to confirm the brain is up and (on a change) that it respawned; the\r\n/// `generation` is the **readiness gate's** key (ADR-0018 Q7, D6-2) — the\r\n/// supervisor that spawned generation N promotes only on a ready stamp **== N**,\r\n/// so a stale stamp from a prior generation cannot falsely promote a brain that\r\n/// never booted. **`exe_hash` (D7-1)** is the lowercase-hex SHA-256 of *this\r\n/// brain's own executable* — the \"which bytes are resident\" diagnostic: it proves\r\n/// a respawn landed on the **swapped** binary (the D7-1 survival E2E asserts it\r\n/// flips across a swap; the D7-4 field run asserts it matches the released\r\n/// artifact's hash — the fact the v0.3.2/enlyzeam incident lacked). It is an\r\n/// **additive / N-1-readable** field (an N-1 brain ignores it; absence parses to\r\n/// `None`) registered in the D6-3 [`crate::rollback_compat::PRE_READY_DURABLE_FILES`]\r\n/// tripwire. Liveness of the *daemon* stays the seed-control ping, never this file.\r\n// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\nfn write_ready(generation: u64) {\r\n    let mut obj = serde_json::json!({ \"pid\": std::process::id(), \"generation\": generation });\r\n    // Best-effort: omit `exe_hash` if the self-read fails (additive — a reader\r\n    // tolerates its absence). Never fail the ready write over a diagnostic field.\r\n    if let Some(hash) = current_exe_hash() {\r\n        obj[\"exe_hash\"] = serde_json::Value::String(hash);\r\n    }\r\n    let _ = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());\r\n}\r\n\r\n/// Lowercase-hex SHA-256 of the running process's own executable file,\r\n/// captured **exactly once per brain process** (best-effort; a failed\r\n/// `current_exe`/read stays `None` for the process lifetime — no per-tick\r\n/// retry, the breadcrumb simply omits the field). Restoration D7-1: the\r\n/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is\r\n/// running. The once-per-process capture is load-bearing TWICE\r\n/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every\r\n/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and — worse\r\n/// — it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain\r\n/// published the NEW file's hash: the breadcrumb lied in the exact enlyzeam\r\n/// class it exists to catch. Once-at-start capture IS the resident-bytes\r\n/// truthfulness contract (a respawned brain is a new process and computes the\r\n/// swapped binary's hash independently — the D7 process-replacement e2e).\r\n// [impl->REQ-BRAIN-HASH-ONCE]\r\nfn current_exe_hash() -> Option<String> {\r\n    static EXE_HASH: OnceLock<Option<String>> = OnceLock::new();\r\n    EXE_HASH\r\n        .get_or_init(|| {\r\n            EXE_HASH_COMPUTES.fetch_add(1, Ordering::Relaxed);\r\n…\n        })\n        .clone()\n}","startLine":119,"lineNumbers":[119,null,127,null,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,null,397,398,399]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\brainproc.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2165,"totalBytes":15874,"outputLines":265,"outputBytes":15874,"shownRange":{"start":129,"end":393},"nextOffset":394}}},"isError":false,"timestamp":1784293153326}}
{"type":"message","id":"68fa78ba","parentId":"f761e9cc","timestamp":"2026-07-17T12:59:13.330Z","message":{"role":"toolResult","toolCallId":"call_KEUHLq5CKGbacLLg6s83Ilsd|fc_034a6be5a6696b6c016a5a2720ea9c8191adab77a5aa8a436e","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## applyhost.rs\n 461|        }\n*462|        std::thread::sleep(Duration::from_millis(10));\n 463|    }\n 464|    Err(last)\n 465|}\n...\n 560|            }\n*561|            std::thread::sleep(Duration::from_millis(10));\n 562|        }\n 563|        panic!(\"brain cold-start could not connect\");\n 564|    }\n## attach.rs\n 101|/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.\n*102|const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);\n 103|\n 104|/// The CONTROLLER fell behind the live ring further than the ring holds — the\n 105|/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an\n...\n 572|                    if since < RESUBSCRIBE_INTERVAL {\n*573|                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n 574|                    }\n 575|                }\n 576|                brain.attach_skip_to_live(sid, Some(origin_node))?;\n## autostart.rs\n 104|                    if attempt < LAUNCH_ATTEMPTS {\n*105|                        std::thread::sleep(LAUNCH_RETRY_DELAY);\n 106|                    }\n 107|                }\n 108|            }\n...\n 137|        });\n*138|        rx.recv_timeout(budget).expect(\n 139|            \"replay_startup_endpoints must return promptly on the pre-launch paths \\\n 140|             (empty list / unresolved adapter loud-skip), never hang the boot thread\",\n 141|        );\n## brain.rs\n 215|/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n*216|/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n 217|/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n 218|/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n 219|/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n 220|/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n*221|/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n 222|/// channel supplies the deadline. On a timeout the pump bubbles out to a\n 223|/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n 224|/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n...\n 313|    /// into the reader-thread form so the deadline can be honored over a channel\n*314|    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n 315|    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n 316|    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n 317|    /// (KNOWN-HAZARDS — a blocked brain-IPC read must never wedge the pump). The\n...\n 1872|    /// - [`BrainConn::Split`] — the pump carrier: the reader thread already owns\n*1873|    ///   the blocking read, so a bounded read is just [`Receiver::recv_timeout`]\n 1874|    ///   on the remaining budget. A `Timeout` surfaces [`io::ErrorKind::TimedOut`]\n 1875|    ///   — the poison signal the pump escalates to a supervised restart (NEVER a\n 1876|    ///   per-peer retry). A `Disconnected` channel means the reader thread exited\n...\n 1886|                    // cannot reset it (the per-read-timeout wedge the ruling\n*1887|                    // forbids). A non-positive remaining → recv_timeout(ZERO),\n 1888|                    // which still drains an already-queued frame before timing out.\n 1889|                    let remaining = dl.saturating_duration_since(Instant::now());\n*1890|                    match frames.recv_timeout(remaining) {\n 1891|                        Ok(framed) => framed,\n 1892|                        Err(RecvTimeoutError::Timeout) => Err(io::Error::new(\n 1893|                            io::ErrorKind::TimedOut,\n## brainproc.rs\n 259|    loop {\n*260|        thread::sleep(BRAIN_HEARTBEAT);\n 261|        // `net-status` is both the net-capability probe and the broker-liveness\n 262|        // probe: an `Err` is the broker gone (or a future planned\n 263|        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n...\n 342|                last = Some(e);\n*343|                thread::sleep(Duration::from_millis(10));\n 344|            }\n 345|        }\n 346|    }\n...\n 648|    while slept < backoff && !stop.load(Ordering::Relaxed) {\n*649|        thread::sleep(TICK.min(backoff.saturating_sub(slept)));\n 650|        slept += TICK;\n 651|    }\n 652|}\n...\n 737|        }\n*738|        thread::sleep(TICK);\n 739|    }\n 740|}\n 741|\n...\n 917|                            }\n*918|                            Ok(None) => thread::sleep(TICK),\n 919|                            Err(e) => {\n 920|                                eprintln!(\"BRAIN_WAIT_FAIL: {e}\");\n 921|                                break;\n## broker.rs\n 2211|        input.enqueue(INJECT_SETTLE_PROBE.to_vec());\n*2212|        thread::sleep(INJECT_SETTLE_POLL);\n 2213|        if recover_log(log).high_water() > baseline {\n 2214|            return true; // output produced since baseline → the input reader is live\n 2215|        }\n...\n 2274|        }\n*2275|        thread::sleep(INJECT_SETTLE_POLL);\n 2276|    }\n 2277|}\n 2278|\n...\n 2347|        }\n*2348|        match cmd_rx.recv_timeout(remaining) {\n 2349|            Ok(KeyCmd::Key { key }) => {\n 2350|                if let Some(bytes) = key_to_bytes(&key) {\n 2351|                    input.enqueue(bytes);\n...\n 2362|                let cap = deadline.saturating_duration_since(Instant::now());\n*2363|                thread::sleep(want.min(cap));\n 2364|            }\n 2365|            Ok(KeyCmd::Commit { .. }) => {\n 2366|                committed = true;\n...\n 3648|                                }\n*3649|                                thread::sleep(WAKE_DEDUP_POLL);\n 3650|                            }\n 3651|                            continue; // re-evaluate the gate against the reaped truth\n 3652|                        }\n...\n 3687|                    }\n*3688|                    Gate::Racing => thread::sleep(WAKE_DEDUP_POLL),\n 3689|                }\n 3690|            }\n 3691|        };\n...\n 5217|    /// (the writer dropped its send half with nothing further) or the timeout. A\n*5218|    /// dedicated reader thread + a channel `recv_timeout` so we never block the test\n 5219|    /// forever (Windows named pipes reject native read deadlines — see\n 5220|    /// `drain_output_seqs`'s note). Used to PROVE the absence of a trailing marker on\n 5221|    /// a normal teardown: a normal `viewer_writer` exit drops its send-half clone, the\n...\n 5229|        });\n*5230|        rx.recv_timeout(wait).ok().flatten()\n 5231|    }\n 5232|\n 5233|    /// (1) EVICTED rx-close → the writer emits the KIND_VIEWER_EVICTED marker as its\n...\n 5954|                }\n*5955|                thread::sleep(Duration::from_millis(20));\n 5956|            }\n 5957|        };\n 5958|        // Safety net so a red run never leaks the child on the shared runner.\n...\n 6161|        // its (empty) live channel. A bounded read returns None (not a stale frame).\n*6162|        // The safe recv_timeout pattern — never a blocking read that can hang on a\n 6163|        // Windows named pipe while a writer still holds its send-half clone.\n 6164|        let leaked = try_read_frame(client, Duration::from_millis(400));\n 6165|        assert!(\n...\n 6428|            }\n*6429|            thread::sleep(Duration::from_millis(1));\n 6430|        }\n 6431|        assert!(writer.is_finished(), \"precondition: the writer thread has exited\");\n 6432|        log.controller = Some(ControllerSink {\n## config.rs\n 21|/// override it per machine.\n*22|pub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\n 23|\n 24|/// Default drop-file precedence protection window (epoch-ms), mirroring the\n 25|/// interim `spt_live` guard. Surfaced here so the one config source owns it.\n...\n 38|/// driver, so a missed tick costs only latency, never correctness.\n*39|pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n*40|pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n*41|pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n*42|pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n 43|\n 44|/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n 45|/// authored by a node not heard within this window are evicted on the next\n## crc_swap.rs\n 566|        // Give the OS a beat to map the image.\n*567|        std::thread::sleep(std::time::Duration::from_millis(150));\n 568|\n 569|        let plan = plan_crc_swap(s, i).unwrap();\n 570|        let result = apply_crc_swap(&plan);\n## daemon.rs\n 442|    loop {\n*443|        thread::sleep(backoff);\n 444|        if let Some(host) = try_start_net() {\n 445|            if broker.attach_net(host) {\n 446|                eprintln!(\"NET_ATTACHED: net endpoint bound on retry — brain starts the consumers\");\n...\n 486|        }\n*487|        thread::sleep(START_POLL);\n 488|        waited += START_POLL;\n 489|    }\n 490|    Err(io::Error::new(\n...\n 1533|            std::fs::write(&pidfile, gc.to_string()).expect(\"launcher: write gc pid\");\n*1534|            std::thread::sleep(Duration::from_secs(300));\n 1535|            std::process::exit(0);\n 1536|        }\n 1537|\n...\n 1614|                }\n*1615|                std::thread::sleep(Duration::from_millis(20));\n 1616|            }\n 1617|            found.expect(\"launcher reports its grandchild pid\")\n 1618|        };\n...\n 1625|        for _ in 0..25 {\n*1626|            std::thread::sleep(Duration::from_millis(40));\n 1627|            if !is_process_alive(gc) {\n 1628|                still_alive = false;\n 1629|                break;\n...\n 1711|                }\n*1712|                thread::sleep(Duration::from_millis(5));\n 1713|            }\n 1714|            assert!(is_running(), \"the seed channel answers → daemon is up\");\n 1715|            // ensure_running short-circuits (no real process spawn).\n## dispatch.rs\n 86|/// workers block on their stream's event feed).\n*87|pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n 88|\n 89|/// What protocol a peer-initiated stream speaks, by its first record's shape.\n 90|#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n...\n 532|            // with fresh replay subscribers (Amendment fix 5).\n*533|            thread::sleep(poll);\n 534|            continue;\n 535|        }\n 536|        let reply = brain.net_streams()?;\n...\n 678|        }\n*679|        thread::sleep(poll);\n 680|    }\n 681|    Ok(())\n 682|}\n...\n 704|        }\n*705|        thread::sleep(Duration::from_millis(10));\n 706|    }\n 707|    Err(last)\n 708|}\n...\n 1422|        if let Err(e) =\n*1423|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1424|        {\n 1425|            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1426|        }\n## effect.rs\n 849|        entered_rx\n*850|            .recv_timeout(Duration::from_secs(2))\n 851|            .expect(\"blocked effect should enter its closure\");\n 852|\n 853|        // Thread 2: a DIFFERENT key. Under a correct (lock-released-across-effect)\n...\n 865|        // Watchdog: a wedge surfaces as a timeout (failure), not a hang.\n*866|        let progressed = done_rx.recv_timeout(Duration::from_secs(2)).is_ok();\n 867|\n 868|        // Let thread 1 finish regardless, so we never leak a blocked thread.\n 869|        let _ = release_tx.send(());\n## lifecycle.rs\n 1386|        let nap = left.min(SLICE);\n*1387|        std::thread::sleep(nap);\n 1388|        left = left.saturating_sub(nap);\n 1389|    }\n 1390|}\n...\n 2398|            // A crash restart re-bases the anchor to a fresh instant.\n*2399|            std::thread::sleep(Duration::from_millis(5));\n 2400|            run(StartReason::Crash);\n 2401|            assert_ne!(anchor_of(), cold_phase, \"Crash must re-base the grid phase\");\n 2402|        });\n## livehost.rs\n 49|/// (mirrors [`crate::shellwake::RECONCILE_INTERVAL_MS`]).\n*50|pub const LIVE_RECONCILE_INTERVAL_MS: u64 = 5_000;\n 51|\n 52|/// One brain-hosted live lifecycle: its config-paced pulse-driver thread and the\n 53|/// held stop flag (tripped to un-host on an offline-transition). F-030 W3: the\n...\n 1078|            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1079|                std::thread::sleep(Duration::from_millis(100));\n 1080|                continue;\n 1081|            }\n 1082|            let owlery = perch::owlery_dir();\n...\n 1109|                let step = left.min(100);\n*1110|                std::thread::sleep(Duration::from_millis(step));\n 1111|                left -= step;\n 1112|            }\n 1113|        }\n...\n 1175|            }\n*1176|            std::thread::sleep(Duration::from_millis(20));\n 1177|        }\n 1178|        pred()\n 1179|    }\n...\n 1667|                    }\n*1668|                    std::thread::sleep(Duration::from_millis(10));\n 1669|                }\n 1670|                b.expect(\"connect to test broker\")\n 1671|            };\n...\n 1957|                }\n*1958|                std::thread::sleep(std::time::Duration::from_millis(20));\n 1959|            }\n 1960|            assert!(removed, \"could not remove the perch dir for the torn-down case\");\n 1961|            run();\n## nethost.rs\n 2298|            }\n*2299|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2300|        }\n 2301|        assert_eq!(b.conn_count(), 1, \"accept loop registered the inbound conn\");\n 2302|        assert_eq!(\n...\n 2364|            }\n*2365|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2366|        }\n 2367|        assert!(\n 2368|            crossed,\n...\n 2488|            }\n*2489|            std::thread::sleep(std::time::Duration::from_millis(5));\n 2490|            if sent.load(AtOrd::Relaxed) >= N {\n 2491|                break; // (shouldn't reach N while we never drain — backpressure)\n 2492|            }\n...\n 2514|            }\n*2515|            std::thread::sleep(std::time::Duration::from_millis(2));\n 2516|        }\n 2517|        writer.join().expect(\"writer joins\");\n 2518|        assert!(finished, \"the tunnel saw EOF after the owner finished\");\n...\n 2620|            }\n*2621|            std::thread::sleep(Duration::from_millis(5));\n 2622|        }\n 2623|        assert_eq!(\n 2624|            pinned.as_deref(),\n...\n 2676|            }\n*2677|            std::thread::sleep(Duration::from_millis(5));\n 2678|        }\n 2679|        assert!(\n 2680|            String::from_utf8_lossy(&got).contains(\"\\\"outcome\\\":\\\"edge\\\"\"),\n...\n 2703|            }\n*2704|            std::thread::sleep(Duration::from_millis(5));\n 2705|        }\n 2706|        assert!(saw, \"the peer stream row registered on b\");\n 2707|\n...\n 2715|            }\n*2716|            std::thread::sleep(Duration::from_millis(10));\n 2717|        }\n 2718|        assert!(swept, \"the closed-watcher swept the dead conn's stream rows\");\n 2719|    }\n...\n 2763|            }\n*2764|            std::thread::sleep(Duration::from_millis(5));\n 2765|        }\n 2766|        panic!(\"seat never poisoned — the dead conn's write should have failed\");\n 2767|    }\n...\n 3004|            }\n*3005|            std::thread::sleep(Duration::from_millis(5));\n 3006|        }\n 3007|        assert!(\n 3008|            lease_a.is_canceled(),\n## notif.rs\n 1179|                );\n*1180|                std::thread::sleep(std::time::Duration::from_millis(50));\n 1181|            };\n 1182|            assert_eq!(\n 1183|                content.trim(),\n## projwriter.rs\n 56|/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\n*57|const PERIODIC_MS: u64 = 300_000;\n 58|\n 59|/// The complexity counters — the deterministic CI gate surface (gate ruling:\n 60|/// counters gate, wall-clock is manual acceptance only).\n...\n 650|                let step = left.min(100);\n*651|                std::thread::sleep(Duration::from_millis(step));\n 652|                left -= step;\n 653|            }\n 654|            if stop.load(Ordering::SeqCst) {\n...\n 668|                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n*669|                std::thread::sleep(debounce);\n 670|                engine.stats.pending_refresh = true;\n 671|                engine.write_stats();\n 672|            }\n...\n 1004|        // and the attribution follows the new identity.\n*1005|        std::thread::sleep(Duration::from_millis(30)); // distinct mtime/len either way\n 1006|        spt_store::gitrun::run_git_ok(\n 1007|            &[\n 1008|                \"-C\",\n...\n 1082|                assert!(Instant::now() < deadline, \"boot cycle never settled\");\n*1083|                std::thread::sleep(Duration::from_millis(25));\n 1084|            }\n 1085|            let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;\n 1086|\n...\n 1098|                assert!(Instant::now() < consumed, \"burst never consumed\");\n*1099|                std::thread::sleep(Duration::from_millis(25));\n 1100|            }\n 1101|            let s = stats().unwrap();\n 1102|            stop.store(true, Ordering::SeqCst);\n## reap.rs\n 231|            }\n*232|            std::thread::sleep(Duration::from_millis(20));\n 233|        }\n 234|        false\n 235|    }\n...\n 245|            }\n*246|            std::thread::sleep(Duration::from_millis(20));\n 247|        }\n 248|        false\n 249|    }\n...\n 265|            }\n*266|            std::thread::sleep(Duration::from_millis(20));\n 267|        }\n 268|        None\n 269|    }\n## registryhost.rs\n 1179|            Err(_) if attempt < 4 => {\n*1180|                std::thread::sleep(std::time::Duration::from_millis(20 << attempt));\n 1181|            }\n 1182|            Err(e) => return Err(e),\n 1183|        }\n...\n 2210|        // A Stale verdict still refreshes the stamp (the sender is alive).\n*2211|        std::thread::sleep(std::time::Duration::from_millis(15));\n 2212|        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2213|        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 2214|        let heard: BTreeMap<String, u64> =\n## relay.rs\n 25|/// stays responsive to a stop signal (mirrors the interim listener cadence).\n*26|pub const DEFAULT_RELAY_POLL: Duration = Duration::from_millis(200);\n 27|\n 28|/// A stateless message relay for one perch: a poll listener bound to the id plus\n 29|/// the perch path it drains. It carries no message buffer — every byte it\n...\n 39|    pub fn bind(id: &str, perch_path: &Path) -> std::io::Result<Self> {\n*40|        Self::bind_with(id, perch_path, DEFAULT_RELAY_POLL)\n 41|    }\n 42|\n 43|    /// Bind a relay with an explicit poll window.\n\n## pump/\n### mod.rs\n 101|/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\n*102|const HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\n 103|\n 104|/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\n 105|/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\n...\n 611|        if !any_due {\n*612|            thread::sleep(TICK);\n 613|            continue;\n 614|        }\n 615|\n...\n 1147|        }\n*1148|        thread::sleep(Duration::from_millis(10));\n 1149|    }\n 1150|    Err(last)\n 1151|}\n...\n 1244|        while slept < backoff && !stop.load(Ordering::Relaxed) {\n*1245|            thread::sleep(TICK.min(backoff - slept));\n 1246|            slept += TICK;\n 1247|        }\n 1248|    }\n...\n 1826|        assert!(first > 0, \"a real wall-clock stamp\");\n*1827|        thread::sleep(Duration::from_millis(15));\n 1828|        write_heartbeat(&path);\n 1829|        let second: u64 = std::fs::read_to_string(&path)\n 1830|            .unwrap()\n\nShowing files 1-20 of 24. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"crates/spt-daemon/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":84,"fileCount":20,"files":["crates/spt-daemon/src/applyhost.rs","crates/spt-daemon/src/attach.rs","crates/spt-daemon/src/autostart.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/crc_swap.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/reap.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/relay.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/applyhost.rs","count":2},{"path":"crates/spt-daemon/src/attach.rs","count":2},{"path":"crates/spt-daemon/src/autostart.rs","count":2},{"path":"crates/spt-daemon/src/brain.rs","count":6},{"path":"crates/spt-daemon/src/brainproc.rs","count":5},{"path":"crates/spt-daemon/src/broker.rs","count":11},{"path":"crates/spt-daemon/src/config.rs","count":5},{"path":"crates/spt-daemon/src/crc_swap.rs","count":1},{"path":"crates/spt-daemon/src/daemon.rs","count":6},{"path":"crates/spt-daemon/src/dispatch.rs","count":5},{"path":"crates/spt-daemon/src/effect.rs","count":2},{"path":"crates/spt-daemon/src/lifecycle.rs","count":2},{"path":"crates/spt-daemon/src/livehost.rs","count":6},{"path":"crates/spt-daemon/src/nethost.rs","count":10},{"path":"crates/spt-daemon/src/notif.rs","count":1},{"path":"crates/spt-daemon/src/projwriter.rs","count":6},{"path":"crates/spt-daemon/src/pump/mod.rs","count":5},{"path":"crates/spt-daemon/src/reap.rs","count":3},{"path":"crates/spt-daemon/src/registryhost.rs","count":2},{"path":"crates/spt-daemon/src/relay.rs","count":2}],"truncated":true,"fileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## applyhost.rs\n 461│        }\n*462│        std::thread::sleep(Duration::from_millis(10));\n 463│    }\n 464│    Err(last)\n 465│}\n    │...\n 560│            }\n*561│            std::thread::sleep(Duration::from_millis(10));\n 562│        }\n 563│        panic!(\"brain cold-start could not connect\");\n 564│    }\n## attach.rs\n 101│/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.\n*102│const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);\n 103│\n 104│/// The CONTROLLER fell behind the live ring further than the ring holds — the\n 105│/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an\n    │...\n 572│                    if since < RESUBSCRIBE_INTERVAL {\n*573│                        std::thread::sleep(RESUBSCRIBE_INTERVAL - since);\n 574│                    }\n 575│                }\n 576│                brain.attach_skip_to_live(sid, Some(origin_node))?;\n## autostart.rs\n 104│                    if attempt < LAUNCH_ATTEMPTS {\n*105│                        std::thread::sleep(LAUNCH_RETRY_DELAY);\n 106│                    }\n 107│                }\n 108│            }\n    │...\n 137│        });\n*138│        rx.recv_timeout(budget).expect(\n 139│            \"replay_startup_endpoints must return promptly on the pre-launch paths \\\n 140│             (empty list / unresolved adapter loud-skip), never hang the boot thread\",\n 141│        );\n## brain.rs\n  215│/// cross-platform, and on Windows named pipes interprocess 2.4.2 offers NEITHER\n *216│/// portable read timeout (`set_recv_timeout` → `no_timeouts()`; `set_nonblocking`\n  217│/// → deprecated `PIPE_NOWAIT`, which corrupts mid-stream — proven by the mesh\n  218│/// E2E). So the pump carrier instead **splits** the stream: a dedicated reader\n  219│/// thread does blocking [`read_frame`] on the [`RecvHalf`] and forwards each\n  220│/// framed result down a channel; the main thread writes on the [`SendHalf`] and\n *221│/// reads with [`Receiver::recv_timeout`]. Blocking reads work on both OSes; the\n  222│/// channel supplies the deadline. On a timeout the pump bubbles out to a\n  223│/// supervised restart (a fresh [`Brain`] → fresh split → fresh reader thread);\n  224│/// the old reader, parked in `read_frame`, is abandoned (KH 7.6 leak watch — the\n     │...\n  313│    /// into the reader-thread form so the deadline can be honored over a channel\n *314│    /// (`recv_timeout`). `None` (default) = the ordinary blocking client — a\n  315│    /// brain-IPC read waits forever, which is correct everywhere EXCEPT the\n  316│    /// single-threaded pump, where a black-holed peer would wedge the whole loop\n  317│    /// (KNOWN-HAZARDS — a blocked brain-IPC read must never wedge the pump). The\n     │...\n 1872│    /// - [`BrainConn::Split`] — the pump carrier: the reader thread already owns\n*1873│    ///   the blocking read, so a bounded read is just [`Receiver::recv_timeout`]\n 1874│    ///   on the remaining budget. A `Timeout` surfaces [`io::ErrorKind::TimedOut`]\n 1875│    ///   — the poison signal the pump escalates to a supervised restart (NEVER a\n 1876│    ///   per-peer retry). A `Disconnected` channel means the reader thread exited\n     │...\n 1886│                    // cannot reset it (the per-read-timeout wedge the ruling\n*1887│                    // forbids). A non-positive remaining → recv_timeout(ZERO),\n 1888│                    // which still drains an already-queued frame before timing out.\n 1889│                    let remaining = dl.saturating_duration_since(Instant::now());\n*1890│                    match frames.recv_timeout(remaining) {\n 1891│                        Ok(framed) => framed,\n 1892│                        Err(RecvTimeoutError::Timeout) => Err(io::Error::new(\n 1893│                            io::ErrorKind::TimedOut,\n## brainproc.rs\n 259│    loop {\n*260│        thread::sleep(BRAIN_HEARTBEAT);\n 261│        // `net-status` is both the net-capability probe and the broker-liveness\n 262│        // probe: an `Err` is the broker gone (or a future planned\n 263│        // snapshot+self-exit, Q3) — exit for a supervised respawn.\n    │...\n 342│                last = Some(e);\n*343│                thread::sleep(Duration::from_millis(10));\n 344│            }\n 345│        }\n 346│    }\n    │...\n 648│    while slept < backoff && !stop.load(Ordering::Relaxed) {\n*649│        thread::sleep(TICK.min(backoff.saturating_sub(slept)));\n 650│        slept += TICK;\n 651│    }\n 652│}\n    │...\n 737│        }\n*738│        thread::sleep(TICK);\n 739│    }\n 740│}\n 741│\n    │...\n 917│                            }\n*918│                            Ok(None) => thread::sleep(TICK),\n 919│                            Err(e) => {\n 920│                                eprintln!(\"BRAIN_WAIT_FAIL: {e}\");\n 921│                                break;\n## broker.rs\n 2211│        input.enqueue(INJECT_SETTLE_PROBE.to_vec());\n*2212│        thread::sleep(INJECT_SETTLE_POLL);\n 2213│        if recover_log(log).high_water() > baseline {\n 2214│            return true; // output produced since baseline → the input reader is live\n 2215│        }\n     │...\n 2274│        }\n*2275│        thread::sleep(INJECT_SETTLE_POLL);\n 2276│    }\n 2277│}\n 2278│\n     │...\n 2347│        }\n*2348│        match cmd_rx.recv_timeout(remaining) {\n 2349│            Ok(KeyCmd::Key { key }) => {\n 2350│                if let Some(bytes) = key_to_bytes(&key) {\n 2351│                    input.enqueue(bytes);\n     │...\n 2362│                let cap = deadline.saturating_duration_since(Instant::now());\n*2363│                thread::sleep(want.min(cap));\n 2364│            }\n 2365│            Ok(KeyCmd::Commit { .. }) => {\n 2366│                committed = true;\n     │...\n 3648│                                }\n*3649│                                thread::sleep(WAKE_DEDUP_POLL);\n 3650│                            }\n 3651│                            continue; // re-evaluate the gate against the reaped truth\n 3652│                        }\n     │...\n 3687│                    }\n*3688│                    Gate::Racing => thread::sleep(WAKE_DEDUP_POLL),\n 3689│                }\n 3690│            }\n 3691│        };\n     │...\n 5217│    /// (the writer dropped its send half with nothing further) or the timeout. A\n*5218│    /// dedicated reader thread + a channel `recv_timeout` so we never block the test\n 5219│    /// forever (Windows named pipes reject native read deadlines — see\n 5220│    /// `drain_output_seqs`'s note). Used to PROVE the absence of a trailing marker on\n 5221│    /// a normal teardown: a normal `viewer_writer` exit drops its send-half clone, the\n     │...\n 5229│        });\n*5230│        rx.recv_timeout(wait).ok().flatten()\n 5231│    }\n 5232│\n 5233│    /// (1) EVICTED rx-close → the writer emits the KIND_VIEWER_EVICTED marker as its\n     │...\n 5954│                }\n*5955│                thread::sleep(Duration::from_millis(20));\n 5956│            }\n 5957│        };\n 5958│        // Safety net so a red run never leaks the child on the shared runner.\n     │...\n 6161│        // its (empty) live channel. A bounded read returns None (not a stale frame).\n*6162│        // The safe recv_timeout pattern — never a blocking read that can hang on a\n 6163│        // Windows named pipe while a writer still holds its send-half clone.\n 6164│        let leaked = try_read_frame(client, Duration::from_millis(400));\n 6165│        assert!(\n     │...\n 6428│            }\n*6429│            thread::sleep(Duration::from_millis(1));\n 6430│        }\n 6431│        assert!(writer.is_finished(), \"precondition: the writer thread has exited\");\n 6432│        log.controller = Some(ControllerSink {\n## config.rs\n 21│/// override it per machine.\n*22│pub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\n 23│\n 24│/// Default drop-file precedence protection window (epoch-ms), mirroring the\n 25│/// interim `spt_live` guard. Surfaced here so the one config source owns it.\n   │...\n 38│/// driver, so a missed tick costs only latency, never correctness.\n*39│pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\n*40│pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\n*41│pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\n*42│pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n 43│\n 44│/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n 45│/// authored by a node not heard within this window are evicted on the next\n## crc_swap.rs\n 566│        // Give the OS a beat to map the image.\n*567│        std::thread::sleep(std::time::Duration::from_millis(150));\n 568│\n 569│        let plan = plan_crc_swap(s, i).unwrap();\n 570│        let result = apply_crc_swap(&plan);\n## daemon.rs\n  442│    loop {\n *443│        thread::sleep(backoff);\n  444│        if let Some(host) = try_start_net() {\n  445│            if broker.attach_net(host) {\n  446│                eprintln!(\"NET_ATTACHED: net endpoint bound on retry — brain starts the consumers\");\n     │...\n  486│        }\n *487│        thread::sleep(START_POLL);\n  488│        waited += START_POLL;\n  489│    }\n  490│    Err(io::Error::new(\n     │...\n 1533│            std::fs::write(&pidfile, gc.to_string()).expect(\"launcher: write gc pid\");\n*1534│            std::thread::sleep(Duration::from_secs(300));\n 1535│            std::process::exit(0);\n 1536│        }\n 1537│\n     │...\n 1614│                }\n*1615│                std::thread::sleep(Duration::from_millis(20));\n 1616│            }\n 1617│            found.expect(\"launcher reports its grandchild pid\")\n 1618│        };\n     │...\n 1625│        for _ in 0..25 {\n*1626│            std::thread::sleep(Duration::from_millis(40));\n 1627│            if !is_process_alive(gc) {\n 1628│                still_alive = false;\n 1629│                break;\n     │...\n 1711│                }\n*1712│                thread::sleep(Duration::from_millis(5));\n 1713│            }\n 1714│            assert!(is_running(), \"the seed channel answers → daemon is up\");\n 1715│            // ensure_running short-circuits (no real process spawn).\n## dispatch.rs\n   86│/// workers block on their stream's event feed).\n  *87│pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);\n   88│\n   89│/// What protocol a peer-initiated stream speaks, by its first record's shape.\n   90│#[derive(Debug, Clone, Copy, PartialEq, Eq)]\n     │...\n  532│            // with fresh replay subscribers (Amendment fix 5).\n *533│            thread::sleep(poll);\n  534│            continue;\n  535│        }\n  536│        let reply = brain.net_streams()?;\n     │...\n  678│        }\n *679│        thread::sleep(poll);\n  680│    }\n  681│    Ok(())\n  682│}\n     │...\n  704│        }\n *705│        thread::sleep(Duration::from_millis(10));\n  706│    }\n  707│    Err(last)\n  708│}\n     │...\n 1422│        if let Err(e) =\n*1423│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n 1424│        {\n 1425│            eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");\n 1426│        }\n## effect.rs\n 849│        entered_rx\n*850│            .recv_timeout(Duration::from_secs(2))\n 851│            .expect(\"blocked effect should enter its closure\");\n 852│\n 853│        // Thread 2: a DIFFERENT key. Under a correct (lock-released-across-effect)\n    │...\n 865│        // Watchdog: a wedge surfaces as a timeout (failure), not a hang.\n*866│        let progressed = done_rx.recv_timeout(Duration::from_secs(2)).is_ok();\n 867│\n 868│        // Let thread 1 finish regardless, so we never leak a blocked thread.\n 869│        let _ = release_tx.send(());\n## lifecycle.rs\n 1386│        let nap = left.min(SLICE);\n*1387│        std::thread::sleep(nap);\n 1388│        left = left.saturating_sub(nap);\n 1389│    }\n 1390│}\n     │...\n 2398│            // A crash restart re-bases the anchor to a fresh instant.\n*2399│            std::thread::sleep(Duration::from_millis(5));\n 2400│            run(StartReason::Crash);\n 2401│            assert_ne!(anchor_of(), cold_phase, \"Crash must re-base the grid phase\");\n 2402│        });\n## livehost.rs\n   49│/// (mirrors [`crate::shellwake::RECONCILE_INTERVAL_MS`]).\n  *50│pub const LIVE_RECONCILE_INTERVAL_MS: u64 = 5_000;\n   51│\n   52│/// One brain-hosted live lifecycle: its config-paced pulse-driver thread and the\n   53│/// held stop flag (tripped to un-host on an offline-transition). F-030 W3: the\n     │...\n 1078│            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n*1079│                std::thread::sleep(Duration::from_millis(100));\n 1080│                continue;\n 1081│            }\n 1082│            let owlery = perch::owlery_dir();\n     │...\n 1109│                let step = left.min(100);\n*1110│                std::thread::sleep(Duration::from_millis(step));\n 1111│                left -= step;\n 1112│            }\n 1113│        }\n     │...\n 1175│            }\n*1176│            std::thread::sleep(Duration::from_millis(20));\n 1177│        }\n 1178│        pred()\n 1179│    }\n     │...\n 1667│                    }\n*1668│                    std::thread::sleep(Duration::from_millis(10));\n 1669│                }\n 1670│                b.expect(\"connect to test broker\")\n 1671│            };\n     │...\n 1957│                }\n*1958│                std::thread::sleep(std::time::Duration::from_millis(20));\n 1959│            }\n 1960│            assert!(removed, \"could not remove the perch dir for the torn-down case\");\n 1961│            run();\n## nethost.rs\n 2298│            }\n*2299│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2300│        }\n 2301│        assert_eq!(b.conn_count(), 1, \"accept loop registered the inbound conn\");\n 2302│        assert_eq!(\n     │...\n 2364│            }\n*2365│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2366│        }\n 2367│        assert!(\n 2368│            crossed,\n     │...\n 2488│            }\n*2489│            std::thread::sleep(std::time::Duration::from_millis(5));\n 2490│            if sent.load(AtOrd::Relaxed) >= N {\n 2491│                break; // (shouldn't reach N while we never drain — backpressure)\n 2492│            }\n     │...\n 2514│            }\n*2515│            std::thread::sleep(std::time::Duration::from_millis(2));\n 2516│        }\n 2517│        writer.join().expect(\"writer joins\");\n 2518│        assert!(finished, \"the tunnel saw EOF after the owner finished\");\n     │...\n 2620│            }\n*2621│            std::thread::sleep(Duration::from_millis(5));\n 2622│        }\n 2623│        assert_eq!(\n 2624│            pinned.as_deref(),\n     │...\n 2676│            }\n*2677│            std::thread::sleep(Duration::from_millis(5));\n 2678│        }\n 2679│        assert!(\n 2680│            String::from_utf8_lossy(&got).contains(\"\\\"outcome\\\":\\\"edge\\\"\"),\n     │...\n 2703│            }\n*2704│            std::thread::sleep(Duration::from_millis(5));\n 2705│        }\n 2706│        assert!(saw, \"the peer stream row registered on b\");\n 2707│\n     │...\n 2715│            }\n*2716│            std::thread::sleep(Duration::from_millis(10));\n 2717│        }\n 2718│        assert!(swept, \"the closed-watcher swept the dead conn's stream rows\");\n 2719│    }\n     │...\n 2763│            }\n*2764│            std::thread::sleep(Duration::from_millis(5));\n 2765│        }\n 2766│        panic!(\"seat never poisoned — the dead conn's write should have failed\");\n 2767│    }\n     │...\n 3004│            }\n*3005│            std::thread::sleep(Duration::from_millis(5));\n 3006│        }\n 3007│        assert!(\n 3008│            lease_a.is_canceled(),\n## notif.rs\n 1179│                );\n*1180│                std::thread::sleep(std::time::Duration::from_millis(50));\n 1181│            };\n 1182│            assert_eq!(\n 1183│                content.trim(),\n## projwriter.rs\n   56│/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).\n  *57│const PERIODIC_MS: u64 = 300_000;\n   58│\n   59│/// The complexity counters — the deterministic CI gate surface (gate ruling:\n   60│/// counters gate, wall-clock is manual acceptance only).\n     │...\n  650│                let step = left.min(100);\n *651│                std::thread::sleep(Duration::from_millis(step));\n  652│                left -= step;\n  653│            }\n  654│            if stop.load(Ordering::SeqCst) {\n     │...\n  668│                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n *669│                std::thread::sleep(debounce);\n  670│                engine.stats.pending_refresh = true;\n  671│                engine.write_stats();\n  672│            }\n     │...\n 1004│        // and the attribution follows the new identity.\n*1005│        std::thread::sleep(Duration::from_millis(30)); // distinct mtime/len either way\n 1006│        spt_store::gitrun::run_git_ok(\n 1007│            &[\n 1008│                \"-C\",\n     │...\n 1082│                assert!(Instant::now() < deadline, \"boot cycle never settled\");\n*1083│                std::thread::sleep(Duration::from_millis(25));\n 1084│            }\n 1085│            let enums_after_boot = stats().unwrap().cumulative.branch_enumerations;\n 1086│\n     │...\n 1098│                assert!(Instant::now() < consumed, \"burst never consumed\");\n*1099│                std::thread::sleep(Duration::from_millis(25));\n 1100│            }\n 1101│            let s = stats().unwrap();\n 1102│            stop.store(true, Ordering::SeqCst);\n## reap.rs\n 231│            }\n*232│            std::thread::sleep(Duration::from_millis(20));\n 233│        }\n 234│        false\n 235│    }\n    │...\n 245│            }\n*246│            std::thread::sleep(Duration::from_millis(20));\n 247│        }\n 248│        false\n 249│    }\n    │...\n 265│            }\n*266│            std::thread::sleep(Duration::from_millis(20));\n 267│        }\n 268│        None\n 269│    }\n## registryhost.rs\n 1179│            Err(_) if attempt < 4 => {\n*1180│                std::thread::sleep(std::time::Duration::from_millis(20 << attempt));\n 1181│            }\n 1182│            Err(e) => return Err(e),\n 1183│        }\n     │...\n 2210│        // A Stale verdict still refreshes the stamp (the sender is alive).\n*2211│        std::thread::sleep(std::time::Duration::from_millis(15));\n 2212│        let v = h.apply_feed(\"bb22\", &[upd(\"home\", \"ling\", \"bb22\", 5)], &p);\n 2213│        assert_eq!(v, vec![RegistryApplyVerdict::Merged(MergeOutcome::Stale)]);\n 2214│        let heard: BTreeMap<String, u64> =\n## relay.rs\n 25│/// stays responsive to a stop signal (mirrors the interim listener cadence).\n*26│pub const DEFAULT_RELAY_POLL: Duration = Duration::from_millis(200);\n 27│\n 28│/// A stateless message relay for one perch: a poll listener bound to the id plus\n 29│/// the perch path it drains. It carries no message buffer — every byte it\n   │...\n 39│    pub fn bind(id: &str, perch_path: &Path) -> std::io::Result<Self> {\n*40│        Self::bind_with(id, perch_path, DEFAULT_RELAY_POLL)\n 41│    }\n 42│\n 43│    /// Bind a relay with an explicit poll window.\n\n## pump/\n### mod.rs\n  101│/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\n *102│const HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\n  103│\n  104│/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\n  105│/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\n     │...\n  611│        if !any_due {\n *612│            thread::sleep(TICK);\n  613│            continue;\n  614│        }\n  615│\n     │...\n 1147│        }\n*1148│        thread::sleep(Duration::from_millis(10));\n 1149│    }\n 1150│    Err(last)\n 1151│}\n     │...\n 1244│        while slept < backoff && !stop.load(Ordering::Relaxed) {\n*1245│            thread::sleep(TICK.min(backoff - slept));\n 1246│            slept += TICK;\n 1247│        }\n 1248│    }\n     │...\n 1826│        assert!(first > 0, \"a real wall-clock stamp\");\n*1827│        thread::sleep(Duration::from_millis(15));\n 1828│        write_heartbeat(&path);\n 1829│        let second: u64 = std::fs::read_to_string(&path)\n 1830│            .unwrap()"},"isError":false,"timestamp":1784293153329}}
{"type":"message","id":"ee32d059","parentId":"68fa78ba","timestamp":"2026-07-17T12:59:23.152Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Inspecting shellwake and livehost workloads**"},{"type":"toolCall","id":"call_HWTRUuzi6nGp0XxiMkmSZecI|fc_034a6be5a6696b6c016a5a272ab9b48191ae8c4632acf4c350","name":"read","arguments":{"i":"Reading shell wake reconciliation","path":"crates/spt-daemon/src/shellwake.rs","selector":"480-690"}},{"type":"toolCall","id":"call_q4a95XXJcvsCs7AeTpOYQFHR|fc_034a6be5a6696b6c016a5a272ab9c88191939b4fd34f4ea5cc","name":"read","arguments":{"i":"Reading live host reconciliation","path":"crates/spt-daemon/src/livehost.rs","selector":"1000-1120"}},{"type":"toolCall","id":"call_Sx2yUh7Gb87tkFuCMq8Tfr52|fc_034a6be5a6696b6c016a5a272ab9d081919087700eefc9676f","name":"read","arguments":{"i":"Reading dispatch enumeration loop","path":"crates/spt-daemon/src/dispatch.rs","selector":"500-690"}},{"type":"toolCall","id":"call_pfFQxUytie2NTJFNEJPsTJr0|fc_034a6be5a6696b6c016a5a272ab9d88191a00090805d7e3410","name":"read","arguments":{"i":"Reading pump scheduling loop","path":"crates/spt-daemon/src/pump/mod.rs","selector":"500-850"}},{"type":"toolCall","id":"call_EWLBhmbuKkVibXepoIXo5vpI|fc_034a6be5a6696b6c016a5a272ab9dc81918f9670db3ab34c4a","name":"read","arguments":{"i":"Reading registry pump worker","path":"crates/spt-daemon/src/pump/registry.rs","selector":"1-270"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":14103,"output":236,"cacheRead":48640,"cacheWrite":0,"totalTokens":62979,"reasoningTokens":33,"cost":{"input":0.07051500000000001,"output":0.00708,"cacheRead":0.024319999999999998,"cacheWrite":0,"total":0.101915}},"stopReason":"toolUse","timestamp":1784293153336,"responseId":"resp_034a6be5a6696b6c016a5a2722197c8191ba3ca518a360aa65","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27265f708191b4fc7e2374125686","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWicqzjh8VpRyCZNqfnSPUPbFFS7ME-Tbz7BdMNtti7NVpCojavpHyTV8Pnxcm7AFzbxEI-Fogn2w2GKWsWegu5RhjN5AMOQLuptCq1h2gP-gPu2OAxbz4LWPQsCnWVoH97dyBFMvO4Ja6Wu3gQ5o_T8Qwd5aKG13UrVqGKKMEnBU2hlADcLIyzsCF55EOQlZeVs6hjM3Qg-F-V8X5UFfYeoQo-T3xUcmIres4W1X-LsdBSboAKo4KfWY3RmXoHA5Zc9_0LR4zFxYHrdvfclbWe4GlkdmkWqAmXkXnypXf3ghPwNiGkfwwkoFYZ6qxudv8QWY9eH8ujOq76Obq57Vr4DGGgP4Q5vqu5OouqUlQWfptEjrIvRME7QPB2j1uXv9BeB6IcUB4JPyyZUhe_Quy2AL97ImRSKxcOq9olnZU-8cByS83KIm1Z5hfwNAtIGHm464M76eryNQnBopJYUDaBBwzwN4zMsjRzx0-XnaKAAYtuorRULbPdkdQU1KuKcI1q_nw25nRD4FwTiss7tK3_QoERaH-KUgCztLnQrrpgHrqzu2W_EEvHK-HjL9qODYO8ISpaZWI84xP5_xuGD1CqKHZXovfR24SV6_1MlSLgzBtDZFhji3ATJSYUSBi1sXM73XceqpzVjObFZQH8-MhSBS_FK-xTQbxZUUFZQZ_lUKz-KwohP-KY8tTYcM7gOvRL-Vm7P___3XgmR3846C9H3KmlUb_Ej4UmCHZbAmQJvxggOwqQmVZt3qZv4TjEWEjbTayRSQ_YDHoYyDEs6DbhdH4ekGt4CLEIQP9-9zqEEcWvtd_4stjMgdFweyuM_XJjbU-lYilNe8MkH_gYDHJo4juWXBsHkL9PVDyRzYS3bnyP01-Xdi0EXax4g7sU99HR9FIDWOqnyJflRcHr0JcVd0ZIIWJ7WiI1_WQSZADFhnVJklwttt5gFnsmZiaDuNTLajx4E_9h4DU9bcSEaEeRqxcJqFG34jy3oAJceuYBUGr1IJ0AnNfqKXlX9jR16fteW0pMtHT6XeVZzEP99gFN-z3LQi5f00flknvQCM-C76m-WwpFG4TAjyCnmWUGesIHmPRhY_Nbe3oN5mqKk8ZIXwfYU0efZ6M0r_U2XpGe3bKow=","summary":[{"type":"summary_text","text":"**Inspecting shellwake and livehost workloads**"}]},{"id":"fc_034a6be5a6696b6c016a5a272ab9b48191ae8c4632acf4c350","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading shell wake reconciliation\",\"path\":\"crates/spt-daemon/src/shellwake.rs\",\"selector\":\"480-690\"}","call_id":"call_HWTRUuzi6nGp0XxiMkmSZecI","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a272ab9c88191939b4fd34f4ea5cc","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading live host reconciliation\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":\"1000-1120\"}","call_id":"call_q4a95XXJcvsCs7AeTpOYQFHR","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a272ab9d081919087700eefc9676f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatch enumeration loop\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"500-690\"}","call_id":"call_Sx2yUh7Gb87tkFuCMq8Tfr52","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a272ab9d88191a00090805d7e3410","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump scheduling loop\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"500-850\"}","call_id":"call_pfFQxUytie2NTJFNEJPsTJr0","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a272ab9dc81918f9670db3ab34c4a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry pump worker\",\"path\":\"crates/spt-daemon/src/pump/registry.rs\",\"selector\":\"1-270\"}","call_id":"call_EWLBhmbuKkVibXepoIXo5vpI","name":"read"}]},"duration":9801.045700013638,"ttft":5118.262200012803,"contextSnapshot":{"promptTokens":62743,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_HWTRUuzi6nGp0XxiMkmSZecI|fc_034a6be5a6696b6c016a5a272ab9b48191ae8c4632acf4c350","toolName":"read","startedAt":"2026-07-17T12:59:23.153Z","args":{"path":"crates/spt-daemon/src/shellwake.rs"},"intent":"Reading shell wake reconciliation"},"id":"b72975b8","parentId":"ee32d059","timestamp":"2026-07-17T12:59:23.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_q4a95XXJcvsCs7AeTpOYQFHR|fc_034a6be5a6696b6c016a5a272ab9c88191939b4fd34f4ea5cc","toolName":"read","startedAt":"2026-07-17T12:59:23.153Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Reading live host reconciliation"},"id":"0d8962cc","parentId":"b72975b8","timestamp":"2026-07-17T12:59:23.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Sx2yUh7Gb87tkFuCMq8Tfr52|fc_034a6be5a6696b6c016a5a272ab9d081919087700eefc9676f","toolName":"read","startedAt":"2026-07-17T12:59:23.153Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatch enumeration loop"},"id":"57998c2b","parentId":"0d8962cc","timestamp":"2026-07-17T12:59:23.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pfFQxUytie2NTJFNEJPsTJr0|fc_034a6be5a6696b6c016a5a272ab9d88191a00090805d7e3410","toolName":"read","startedAt":"2026-07-17T12:59:23.153Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump scheduling loop"},"id":"e1831144","parentId":"57998c2b","timestamp":"2026-07-17T12:59:23.153Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_EWLBhmbuKkVibXepoIXo5vpI|fc_034a6be5a6696b6c016a5a272ab9dc81918f9670db3ab34c4a","toolName":"read","startedAt":"2026-07-17T12:59:23.153Z","args":{"path":"crates/spt-daemon/src/pump/registry.rs"},"intent":"Reading registry pump worker"},"id":"5cc1bf1e","parentId":"e1831144","timestamp":"2026-07-17T12:59:23.153Z"}
{"type":"message","id":"a1bcc5bf","parentId":"5cc1bf1e","timestamp":"2026-07-17T12:59:23.168Z","message":{"role":"toolResult","toolCallId":"call_EWLBhmbuKkVibXepoIXo5vpI|fc_034a6be5a6696b6c016a5a272ab9dc81918f9670db3ab34c4a","toolName":"read","content":[{"type":"text","text":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\n//! [`super::PumpWorker`] seam.\n//!\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\n//! as worker state; `peer_step` pushes this node's own rows for the given\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\n//! two registry cadence knobs.\n\nuse std::io;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nuse spt_net::net::replicate::RegistryFeedRecord;\nuse spt_store::subnet::SubnetStore;\n\nuse crate::registryhost::RegistryHost;\n\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\n\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\n/// The new seed reaches benign offliners over the member control stream's\n/// re-seed leg on their next connect — never over gossip; the revokee's\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\n/// takes effect without a restart.\n// [impl->REQ-MESH-4]\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\n    let due = pending.due_subnets(now_ms);\n    if due.is_empty() {\n        return;\n    }\n    let mut subnets = SubnetStore::load_from(subnets_path);\n    let mut rotated = false;\n    for sub in &due {\n        match subnets.rotate_seed(sub) {\n            Ok(rec) => {\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\n                rotated = true;\n            }\n            // The subnet may have been left/renamed since the revoke — drop the\n            // stale entry rather than retrying it forever.\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\n        }\n        pending.clear(sub);\n    }\n    if rotated {\n        if let Err(e) = subnets.save_to(subnets_path) {\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\n            return; // keep the pending entry — retry next tick rather than lose it\n        }\n    }\n    let _ = pending.save_to(rotations_path);\n}\n\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\n/// re-advertises its own rows; peers reconverge within one cadence\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\npub(super) struct RegistryWorker {\n    /// The shared registry host (sweep + advertise + the canonical epoch).\n    registry: Arc<RegistryHost>,\n    /// The perch tree scanned for advertisable rows.\n    owlery: PathBuf,\n    /// `subnet.json` — read by the due-rotation leg.\n    subnets: PathBuf,\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\n    rotations: PathBuf,\n    /// The event-driven advertisement marker (`poll_wake`).\n    advertise_marker: PathBuf,\n    /// This worker's scheduling period (`cadence.registry`).\n    cadence: Duration,\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\n    evict_after: Duration,\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\n    adverts: Vec<RegistryFeedRecord>,\n}\n\nimpl RegistryWorker {\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\n    pub(super) fn new(\n        registry: Arc<RegistryHost>,\n        paths: &PumpPaths,\n        cadence: &PumpCadence,\n    ) -> RegistryWorker {\n        RegistryWorker {\n            registry,\n            owlery: paths.owlery.clone(),\n            subnets: paths.subnets.clone(),\n            rotations: paths.rotations.clone(),\n            advertise_marker: paths.advertise_marker.clone(),\n            cadence: cadence.registry,\n            evict_after: cadence.registry_evict_after,\n            adverts: Vec::new(),\n        }\n    }\n}\n\nimpl PumpWorker for RegistryWorker {\n    fn cadence(&self) -> Duration {\n        self.cadence\n    }\n\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\n    /// online/offline transition dropped the marker — consume it and run the\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\n    /// path: the forced round is the same advertise_local + push code, so the\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\n    /// so one wake claims exactly one forced round.\n    // [impl->REQ-CONV-2]\n    fn poll_wake(&mut self) -> bool {\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\n    }\n\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\n    /// (§Frozen-7, order preserved verbatim):\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\n        // eviction.\n        // [impl->REQ-SUBNET-7]\n        self.registry.consume_repair_evictions();\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\n        // resolution forever; a live peer re-stamps its heard entry with every\n        // admitted feed and is never touched.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_silent_peers(self.evict_after);\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\n        // evicts rows that have been non-routable (Offline) beyond the grace even\n        // while their author node is alive (a purge/erase Offline ghost that\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\n        // registry_evict_after grace; own rows never decay; the receiver-observed\n        // offline_since is self-pruning so a whole-node eviction above drops its\n        // stamps for free.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_aged_offline_rows(self.evict_after);\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\n        // closed — after the eviction sweep, before re-advertising. The\n        // re-minted seed rides the member control stream on the next connect;\n        // the revokee's tombstone (already propagated) keeps it locked out.\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\n        // Re-advertise this node's own rows; held as worker state for the\n        // per-subnet `peer_step` filter below.\n        self.adverts = self.registry.advertise_local(&self.owlery);\n    }\n\n    /// Push this node's own rows for `subnet` over the peer's feed stream\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\n    /// stream per feed.\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        _peer_hex: &str,\n        _ctx: &RoundCtx,\n    ) -> io::Result<()> {\n        let lines: Vec<u8> = self\n            .adverts\n            .iter()\n            .filter(|u| u.subnet() == subnet)\n            .flat_map(|u| u.encode_line())\n            .collect();\n        if !lines.is_empty() {\n            io.push_feed(&lines)?;\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n    use spt_store::epoch::EpochSource;\n\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\n    // scheduled. This is the daemon-side half of the coalescing window.\n    #[test]\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\n        let dir = tempfile::tempdir().unwrap();\n        let subnets_path = dir.path().join(\"subnet.json\");\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\n\n        let mut subnets = SubnetStore::default();\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\n        subnets.create_subnet(\"work\").unwrap();\n        subnets.save_to(&subnets_path).unwrap();\n\n        let mut pending = spt_store::rotation::RotationPending::default();\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\n        pending.save_to(&rotations_path).unwrap();\n\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\n\n        let after = SubnetStore::load_from(&subnets_path);\n        let home = after.find(\"home\").unwrap();\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\n        assert_eq!(\n            home.prev_seed_hex.as_deref(),\n            Some(before_home.seed_hex.as_str()),\n            \"prior seed retained for the grace\"\n        );\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\n\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\n    }\n\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\n    // marker exactly once — one online/offline transition forces exactly one\n    // registry round, and an absent marker forces nothing.\n    #[test]\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\n        let dir = tempfile::tempdir().unwrap();\n        let marker = dir.path().join(\"advertise-now\");\n        let mut w = RegistryWorker {\n            registry: Arc::new(RegistryHost::new_at(\n                \"aa11\",\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\n                dir.path().join(\"registry\"),\n            )),\n            owlery: dir.path().join(\"owlery\"),\n            subnets: dir.path().join(\"subnet.json\"),\n            rotations: dir.path().join(\"rotation-pending.json\"),\n            advertise_marker: marker.clone(),\n            cadence: Duration::from_secs(30),\n            evict_after: Duration::from_secs(600),\n            adverts: Vec::new(),\n        };\n        assert!(!w.poll_wake(), \"nothing to take yet\");\n        std::fs::write(&marker, b\"\").unwrap();\n        assert!(w.poll_wake(), \"first take claims the transition\");\n        assert!(!w.poll_wake(), \"second take gets nothing\");\n    }\n\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\n    // verbatim from the pre-seam inline loop; each step keeps its own\n    // registryhost-side unit coverage.\n    #[test]\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\n        with_home(|home| {\n            // A served subnet plus one advertisable Self perch.\n            let owlery = home.join(\"owlery\");\n            let id = \"adv-ag\";\n            let p = spt_store::perch::resolve_perch_path_in(\n                &owlery,\n                id,\n                spt_store::perch::ParentHint::Infer,\n            );\n            std::fs::create_dir_all(&p).unwrap();\n            let rec = spt_store::info::InfoJson::new(\n                id,\n                \"now\",\n                std::process::id(),\n                \"s\",\n…\n            );\n…\n        });\n    }\n}\n\n[Showing lines 1-273 of 334. Use :274 to continue]"}],"details":{"truncation":{"content":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\r\n//! [`super::PumpWorker`] seam.\r\n//!\r\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\r\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\r\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\r\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\r\n//! as worker state; `peer_step` pushes this node's own rows for the given\r\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\r\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\r\n//! two registry cadence knobs.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::sync::Arc;\r\nuse std::time::Duration;\r\n\r\nuse spt_net::net::replicate::RegistryFeedRecord;\r\nuse spt_store::subnet::SubnetStore;\r\n\r\nuse crate::registryhost::RegistryHost;\r\n\r\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\r\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\r\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\r\n/// The new seed reaches benign offliners over the member control stream's\r\n/// re-seed leg on their next connect — never over gossip; the revokee's\r\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\r\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\r\n/// takes effect without a restart.\r\n// [impl->REQ-MESH-4]\r\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\r\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\r\n    let due = pending.due_subnets(now_ms);\r\n    if due.is_empty() {\r\n        return;\r\n    }\r\n    let mut subnets = SubnetStore::load_from(subnets_path);\r\n    let mut rotated = false;\r\n    for sub in &due {\r\n        match subnets.rotate_seed(sub) {\r\n            Ok(rec) => {\r\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\r\n                rotated = true;\r\n            }\r\n            // The subnet may have been left/renamed since the revoke — drop the\r\n            // stale entry rather than retrying it forever.\r\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\r\n        }\r\n        pending.clear(sub);\r\n    }\r\n    if rotated {\r\n        if let Err(e) = subnets.save_to(subnets_path) {\r\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\r\n            return; // keep the pending entry — retry next tick rather than lose it\r\n        }\r\n    }\r\n    let _ = pending.save_to(rotations_path);\r\n}\r\n\r\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\r\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\r\n/// re-advertises its own rows; peers reconverge within one cadence\r\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\r\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\r\npub(super) struct RegistryWorker {\r\n    /// The shared registry host (sweep + advertise + the canonical epoch).\r\n    registry: Arc<RegistryHost>,\r\n    /// The perch tree scanned for advertisable rows.\r\n    owlery: PathBuf,\r\n    /// `subnet.json` — read by the due-rotation leg.\r\n    subnets: PathBuf,\r\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\r\n    rotations: PathBuf,\r\n    /// The event-driven advertisement marker (`poll_wake`).\r\n    advertise_marker: PathBuf,\r\n    /// This worker's scheduling period (`cadence.registry`).\r\n    cadence: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\r\n    evict_after: Duration,\r\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\r\n    adverts: Vec<RegistryFeedRecord>,\r\n}\r\n\r\nimpl RegistryWorker {\r\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\r\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\r\n    pub(super) fn new(\r\n        registry: Arc<RegistryHost>,\r\n        paths: &PumpPaths,\r\n        cadence: &PumpCadence,\r\n    ) -> RegistryWorker {\r\n        RegistryWorker {\r\n            registry,\r\n            owlery: paths.owlery.clone(),\r\n            subnets: paths.subnets.clone(),\r\n            rotations: paths.rotations.clone(),\r\n            advertise_marker: paths.advertise_marker.clone(),\r\n            cadence: cadence.registry,\r\n            evict_after: cadence.registry_evict_after,\r\n            adverts: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for RegistryWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\r\n    /// online/offline transition dropped the marker — consume it and run the\r\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\r\n    /// path: the forced round is the same advertise_local + push code, so the\r\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\r\n    /// so one wake claims exactly one forced round.\r\n    // [impl->REQ-CONV-2]\r\n    fn poll_wake(&mut self) -> bool {\r\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\r\n    }\r\n\r\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\r\n    /// (§Frozen-7, order preserved verbatim):\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\r\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\r\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\r\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::epoch::EpochSource;\r\n\r\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\r\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\r\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\r\n    // scheduled. This is the daemon-side half of the coalescing window.\r\n    #[test]\r\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let subnets_path = dir.path().join(\"subnet.json\");\r\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\r\n\r\n        let mut subnets = SubnetStore::default();\r\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\r\n        subnets.create_subnet(\"work\").unwrap();\r\n        subnets.save_to(&subnets_path).unwrap();\r\n\r\n        let mut pending = spt_store::rotation::RotationPending::default();\r\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\r\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\r\n        pending.save_to(&rotations_path).unwrap();\r\n\r\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\r\n\r\n        let after = SubnetStore::load_from(&subnets_path);\r\n        let home = after.find(\"home\").unwrap();\r\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\r\n        assert_eq!(\r\n            home.prev_seed_hex.as_deref(),\r\n            Some(before_home.seed_hex.as_str()),\r\n            \"prior seed retained for the grace\"\r\n        );\r\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\r\n\r\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\r\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\r\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\r\n    }\r\n\r\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\r\n    // marker exactly once — one online/offline transition forces exactly one\r\n    // registry round, and an absent marker forces nothing.\r\n    #[test]\r\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let marker = dir.path().join(\"advertise-now\");\r\n        let mut w = RegistryWorker {\r\n            registry: Arc::new(RegistryHost::new_at(\r\n                \"aa11\",\r\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\r\n                dir.path().join(\"registry\"),\r\n            )),\r\n            owlery: dir.path().join(\"owlery\"),\r\n            subnets: dir.path().join(\"subnet.json\"),\r\n            rotations: dir.path().join(\"rotation-pending.json\"),\r\n            advertise_marker: marker.clone(),\r\n            cadence: Duration::from_secs(30),\r\n            evict_after: Duration::from_secs(600),\r\n            adverts: Vec::new(),\r\n        };\r\n        assert!(!w.poll_wake(), \"nothing to take yet\");\r\n        std::fs::write(&marker, b\"\").unwrap();\r\n        assert!(w.poll_wake(), \"first take claims the transition\");\r\n        assert!(!w.poll_wake(), \"second take gets nothing\");\r\n    }\r\n\r\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\r\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\r\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\r\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\r\n    // verbatim from the pre-seam inline loop; each step keeps its own\r\n    // registryhost-side unit coverage.\r\n    #[test]\r\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\r\n        with_home(|home| {\r\n            // A served subnet plus one advertisable Self perch.\r\n            let owlery = home.join(\"owlery\");\r\n            let id = \"adv-ag\";\r\n            let p = spt_store::perch::resolve_perch_path_in(\r\n                &owlery,\r\n                id,\r\n                spt_store::perch::ParentHint::Infer,\r\n            );\r\n            std::fs::create_dir_all(&p).unwrap();\r\n            let rec = spt_store::info::InfoJson::new(\r\n                id,\r\n                \"now\",\r\n                std::process::id(),\r\n                \"s\",\r","truncated":true,"truncatedBy":"lines","totalLines":334,"totalBytes":12485,"outputLines":273,"outputBytes":12485,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! The registry pump worker (pump-seam P2) — the first leg cut behind the\r\n//! [`super::PumpWorker`] seam.\r\n//!\r\n//! `poll_wake` consumes the event-driven advertisement marker (force a round\r\n//! NOW on an endpoint online/offline transition); `pre_round` runs the\r\n//! node-local sweep (repair-evictions → silent-peer eviction → due seed\r\n//! rotations → re-advertise) ONCE per due round and holds the produced adverts\r\n//! as worker state; `peer_step` pushes this node's own rows for the given\r\n//! subnet over the peer's feed stream. Construction-captured deps: the shared\r\n//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the\r\n//! two registry cadence knobs.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::sync::Arc;\r\nuse std::time::Duration;\r\n\r\nuse spt_net::net::replicate::RegistryFeedRecord;\r\nuse spt_store::subnet::SubnetStore;\r\n\r\nuse crate::registryhost::RegistryHost;\r\n\r\nuse super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,\r\n/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the\r\n/// prior generation one-deep for the re-seed grace) and clear its pending entry.\r\n/// The new seed reaches benign offliners over the member control stream's\r\n/// re-seed leg on their next connect — never over gossip; the revokee's\r\n/// already-propagated tombstone denies it the grace. Pure-store work (no conn\r\n/// handle needed): the daemon re-reads `subnet.json` per connect, so the bump\r\n/// takes effect without a restart.\r\n// [impl->REQ-MESH-4]\r\nfn fire_due_rotations(subnets_path: &std::path::Path, rotations_path: &std::path::Path, now_ms: u64) {\r\n    let mut pending = spt_store::rotation::RotationPending::load_from(rotations_path);\r\n    let due = pending.due_subnets(now_ms);\r\n    if due.is_empty() {\r\n        return;\r\n    }\r\n    let mut subnets = SubnetStore::load_from(subnets_path);\r\n    let mut rotated = false;\r\n    for sub in &due {\r\n        match subnets.rotate_seed(sub) {\r\n            Ok(rec) => {\r\n                eprintln!(\"SEED_ROTATED:{sub}:epoch={} (revoke window closed)\", rec.epoch);\r\n                rotated = true;\r\n            }\r\n            // The subnet may have been left/renamed since the revoke — drop the\r\n            // stale entry rather than retrying it forever.\r\n            Err(e) => eprintln!(\"SEED_ROTATE_SKIP:{sub}: {e}\"),\r\n        }\r\n        pending.clear(sub);\r\n    }\r\n    if rotated {\r\n        if let Err(e) = subnets.save_to(subnets_path) {\r\n            eprintln!(\"SEED_ROTATE_FAIL: {e}\");\r\n            return; // keep the pending entry — retry next tick rather than lose it\r\n        }\r\n    }\r\n    let _ = pending.save_to(rotations_path);\r\n}\r\n\r\n/// The registry leg as a [`PumpWorker`]: own-row re-advertisement\r\n/// ([`RegistryHost::advertise_local`] → one feed stream per peer). The node\r\n/// re-advertises its own rows; peers reconverge within one cadence\r\n/// (replay-is-recovery). Own rows only — a relayed third-party row would carry\r\n/// an origin the receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10).\r\npub(super) struct RegistryWorker {\r\n    /// The shared registry host (sweep + advertise + the canonical epoch).\r\n    registry: Arc<RegistryHost>,\r\n    /// The perch tree scanned for advertisable rows.\r\n    owlery: PathBuf,\r\n    /// `subnet.json` — read by the due-rotation leg.\r\n    subnets: PathBuf,\r\n    /// `rotation-pending.json` — the timeboxed seed-rotation schedule.\r\n    rotations: PathBuf,\r\n    /// The event-driven advertisement marker (`poll_wake`).\r\n    advertise_marker: PathBuf,\r\n    /// This worker's scheduling period (`cadence.registry`).\r\n    cadence: Duration,\r\n    /// Silent-peer registry eviction window (KNOWN-HAZARDS 4.10).\r\n    evict_after: Duration,\r\n    /// Adverts computed in `pre_round`, consumed per-subnet in `peer_step`.\r\n    adverts: Vec<RegistryFeedRecord>,\r\n}\r\n\r\nimpl RegistryWorker {\r\n    /// Construction capture (§Frozen-4): the shared registry plus this worker's\r\n    /// `PathBuf` slices and cadence knobs out of the pump's wiring.\r\n    pub(super) fn new(\r\n        registry: Arc<RegistryHost>,\r\n        paths: &PumpPaths,\r\n        cadence: &PumpCadence,\r\n    ) -> RegistryWorker {\r\n        RegistryWorker {\r\n            registry,\r\n            owlery: paths.owlery.clone(),\r\n            subnets: paths.subnets.clone(),\r\n            rotations: paths.rotations.clone(),\r\n            advertise_marker: paths.advertise_marker.clone(),\r\n            cadence: cadence.registry,\r\n            evict_after: cadence.registry_evict_after,\r\n            adverts: Vec::new(),\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for RegistryWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// Event-driven advertisement (M8 decision 15, REQ-CONV-2): an endpoint\r\n    /// online/offline transition dropped the marker — consume it and run the\r\n    /// registry leg NOW. A wake of the pump loop, not a second advertisement\r\n    /// path: the forced round is the same advertise_local + push code, so the\r\n    /// epoch lease and visibility gates ride unchanged. The take IS the remove,\r\n    /// so one wake claims exactly one forced round.\r\n    // [impl->REQ-CONV-2]\r\n    fn poll_wake(&mut self) -> bool {\r\n        crate::registryhost::take_advertise_now(&self.advertise_marker)\r\n    }\r\n\r\n    /// The node-local sweep, run ONCE per due round before any `peer_step`\r\n    /// (§Frozen-7, order preserved verbatim):\r\n    fn pre_round(&mut self, _ctx: &RoundCtx) {\r\n        // Consume the re-pair eviction marker FIRST (M8 decision 13,\r\n        // REQ-SUBNET-7): a superseded identity's in-memory rows go before this\r\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::epoch::EpochSource;\r\n\r\n    // [unit->REQ-MESH-4] the pump fires a seed rotation only once its window has\r\n    // closed: a due subnet rotates (epoch bumps, prior seed retained one-deep)\r\n    // and its pending entry clears; a not-yet-due subnet is untouched and stays\r\n    // scheduled. This is the daemon-side half of the coalescing window.\r\n    #[test]\r\n    fn fire_due_rotations_rotates_due_and_leaves_pending() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let subnets_path = dir.path().join(\"subnet.json\");\r\n        let rotations_path = dir.path().join(\"rotation-pending.json\");\r\n\r\n        let mut subnets = SubnetStore::default();\r\n        let before_home = subnets.create_subnet(\"home\").unwrap().clone();\r\n        subnets.create_subnet(\"work\").unwrap();\r\n        subnets.save_to(&subnets_path).unwrap();\r\n\r\n        let mut pending = spt_store::rotation::RotationPending::default();\r\n        pending.coalesce(\"home\", &[\"aa\".to_string()], 1_000); // due at now=1_000\r\n        pending.coalesce(\"work\", &[\"bb\".to_string()], 5_000); // not yet due\r\n        pending.save_to(&rotations_path).unwrap();\r\n\r\n        fire_due_rotations(&subnets_path, &rotations_path, 1_000);\r\n\r\n        let after = SubnetStore::load_from(&subnets_path);\r\n        let home = after.find(\"home\").unwrap();\r\n        assert_eq!(home.epoch, before_home.epoch + 1, \"due subnet rotated\");\r\n        assert_eq!(\r\n            home.prev_seed_hex.as_deref(),\r\n            Some(before_home.seed_hex.as_str()),\r\n            \"prior seed retained for the grace\"\r\n        );\r\n        assert_eq!(after.find(\"work\").unwrap().epoch, 1, \"not-due subnet untouched\");\r\n\r\n        let pend = spt_store::rotation::RotationPending::load_from(&rotations_path);\r\n        assert!(!pend.subnets.contains_key(\"home\"), \"fired entry cleared\");\r\n        assert!(pend.subnets.contains_key(\"work\"), \"pending entry kept\");\r\n    }\r\n\r\n    // [unit->REQ-CONV-2] the worker's `poll_wake` consumes the advertise-now\r\n    // marker exactly once — one online/offline transition forces exactly one\r\n    // registry round, and an absent marker forces nothing.\r\n    #[test]\r\n    fn poll_wake_takes_the_advertise_marker_exactly_once() {\r\n        let dir = tempfile::tempdir().unwrap();\r\n        let marker = dir.path().join(\"advertise-now\");\r\n        let mut w = RegistryWorker {\r\n            registry: Arc::new(RegistryHost::new_at(\r\n                \"aa11\",\r\n                EpochSource::load_from(&dir.path().join(\"epoch.json\")),\r\n                dir.path().join(\"registry\"),\r\n            )),\r\n            owlery: dir.path().join(\"owlery\"),\r\n            subnets: dir.path().join(\"subnet.json\"),\r\n            rotations: dir.path().join(\"rotation-pending.json\"),\r\n            advertise_marker: marker.clone(),\r\n            cadence: Duration::from_secs(30),\r\n            evict_after: Duration::from_secs(600),\r\n            adverts: Vec::new(),\r\n        };\r\n        assert!(!w.poll_wake(), \"nothing to take yet\");\r\n        std::fs::write(&marker, b\"\").unwrap();\r\n        assert!(w.poll_wake(), \"first take claims the transition\");\r\n        assert!(!w.poll_wake(), \"second take gets nothing\");\r\n    }\r\n\r\n    // [unit->REQ-MESH-4] `pre_round` runs the full node-local sweep once per due\r\n    // round: a scheduled seed rotation fires (epoch bumps) and adverts are\r\n    // recomputed each call (a fresh epoch per advertisement — the once-per-round\r\n    // re-stamp). The per-step ORDER (evict → rotate → advertise) is preserved\r\n    // verbatim from the pre-seam inline loop; each step keeps its own\r\n    // registryhost-side unit coverage.\r\n    #[test]\r\n    fn pre_round_sweeps_and_refreshes_adverts_each_round() {\r\n        with_home(|home| {\r\n            // A served subnet plus one advertisable Self perch.\r\n            let owlery = home.join(\"owlery\");\r\n            let id = \"adv-ag\";\r\n            let p = spt_store::perch::resolve_perch_path_in(\r\n                &owlery,\r\n                id,\r\n                spt_store::perch::ParentHint::Infer,\r\n            );\r\n            std::fs::create_dir_all(&p).unwrap();\r\n            let rec = spt_store::info::InfoJson::new(\r\n                id,\r\n                \"now\",\r\n                std::process::id(),\r\n                \"s\",\r\n…\n            );\n…\n        });\n    }\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,null,275,null,331,332,333]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\registry.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":334,"totalBytes":12485,"outputLines":273,"outputBytes":12485,"shownRange":{"start":1,"end":273},"nextOffset":274}}},"isError":false,"timestamp":1784293163168}}
{"type":"message","id":"59b1e748","parentId":"a1bcc5bf","timestamp":"2026-07-17T12:59:23.178Z","message":{"role":"toolResult","toolCallId":"call_HWTRUuzi6nGp0XxiMkmSZecI|fc_034a6be5a6696b6c016a5a272ab9b48191ae8c4632acf4c350","toolName":"read","content":[{"type":"text","text":"pub fn reconcile_once(\n…\n) {\n…\n    let live: Vec<(String, String)> = {\n        let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());\n        map.retain(|_, h| !h.thread.is_finished());\n        map.keys().cloned().collect()\n    };\n    for (owner, shell_id) in live {\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n        let still_eligible = shellinfo::read_shell_info(&perch)\n            .map(|i| i.status == SHELL_STATUS_OFFLINE)\n            .unwrap_or(false);\n        if !still_eligible {\n            set.stop_watcher(owlery, &owner, &shell_id);\n        }\n    }\n\n    // Start side: every offline instance with a wake_command and headroom.\n    for owner in spt_store::perch::list_self_perch_ids(owlery) {\n        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\n            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\n                continue;\n            }\n            let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {\n                continue; // deregistered adapter: nothing to run\n            };\n            let Some(wake_command) = shell.wake_command.as_deref() else {\n                continue;\n            };\n            let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\n            if perch.join(WAKER_GAVE_UP_FILE).exists() {\n                continue; // crash-latched until the next shell activity\n            }\n            // Adopt cleanly: a dead daemon's watcher must not double-run.\n            kill_waker_at(&perch);\n            let tokens = match fill_wake_command(&shell_id, &info.adapter_name, wake_command) {\n                Ok(t) => t,\n                Err(e) => {\n                    eprintln!(\"WAKER_TEMPLATE:{owner}/{shell_id}: {e}\");\n                    continue;\n                }\n            };\n            let stop = Arc::new(AtomicBool::new(false));\n            let handle = {\n                let stop = Arc::clone(&stop);\n                let owlery = owlery.to_path_buf();\n                let owner = owner.clone();\n                let shell_id = shell_id.clone();\n                let adapter_name = info.adapter_name.clone();\n                let params = *params;\n                std::thread::spawn(move || {\n                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\n                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\n                    });\n                })\n            };\n            set.insert(\n                &owner,\n                &shell_id,\n                WatcherHandle {\n                    stop,\n                    thread: handle,\n                },\n            );\n        }\n    }\n}\n\n/// The reconcile cadence (ms): lifecycle flips land in CLI processes, so the\n/// daemon's loop is the invariant holder — a flip is at most one tick stale.\npub const RECONCILE_INTERVAL_MS: u64 = 5_000;\n\n/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\n/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\n/// is re-read each sweep (adapter add/remove lands between ticks).\n// [impl->REQ-SHELL-2]\npub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(WakeSet::new());\n        let params = WakeParams::default();\n        while !stop.load(Ordering::SeqCst) {\n            let owlery = spt_store::perch::owlery_dir();\n            let adapters_dir = spt_store::perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};\n\n    fn fast_params() -> WakeParams {\n        WakeParams {\n            backoff_base_ms: 10,\n            backoff_cap_ms: 40,\n            give_up_after: 3,\n        }\n    }\n\n    fn seed_owner(owlery: &Path, owner: &str) {\n        let p = owlery.join(owner);\n        std::fs::create_dir_all(&p).unwrap();\n        std::fs::write(p.join(\"info.json\"), \"{}\").unwrap();\n    }\n\n    /// Tokens for a waker that exits with `code` immediately.\n    fn exit_with(code: i32) -> Vec<String> {\n        #[cfg(windows)]\n        return vec![\"cmd\".into(), \"/c\".into(), format!(\"exit {code}\")];\n        #[cfg(unix)]\n        return vec![\"sh\".into(), \"-c\".into(), format!(\"exit {code}\")];\n    }\n\n    /// Tokens for a waker that appends one line to `tally` then exits 1.\n    fn crash_tallying(tally: &Path) -> Vec<String> {\n        #[cfg(windows)]\n        return vec![\n            \"powershell\".into(),\n            \"-NoProfile\".into(),\n            \"-Command\".into(),\n            format!(\"Add-Content -Path '{}' -Value x; exit 1\", tally.display()),\n        ];\n        #[cfg(unix)]\n        return vec![\n            \"sh\".into(),\n            \"-c\".into(),\n            format!(\"echo x >> '{}'; exit 1\", tally.display()),\n        ];\n    }\n\n    // [unit->REQ-SHELL-2] the backoff curve: base × 2^(n-1), saturating at\n    // the cap; zero failures wait nothing.\n    #[test]\n    fn backoff_curve_doubles_to_the_cap() {\n        let p = WakeParams {\n            backoff_base_ms: 100,\n            backoff_cap_ms: 1_500,\n            give_up_after: 6,\n        };\n        assert_eq!(backoff_ms(&p, 0), 0);\n        assert_eq!(backoff_ms(&p, 1), 100);\n        assert_eq!(backoff_ms(&p, 2), 200);\n        assert_eq!(backoff_ms(&p, 4), 800);\n        assert_eq!(backoff_ms(&p, 5), 1_500, \"saturates at the cap\");\n        assert_eq!(\n            backoff_ms(&p, 60),\n            1_500,\n            \"huge failure counts can't overflow\"\n        );\n    }\n\n    // [unit->REQ-SHELL-2] exit-opcode supervision: exit(86) fires the wake\n    // resolution exactly once and the loop ends; the pid file is retired.\n    #[test]\n    fn watcher_opcode_exit_fires_resolution_once() {\n        let tmp = tempfile::tempdir().unwrap();\n        let owlery = tmp.path();\n        seed_owner(owlery, \"doyle\");\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\n\n        let fired = std::sync::atomic::AtomicU32::new(0);\n        let stop = AtomicBool::new(false);\n        watcher_run(\n            owlery,\n            \"doyle\",\n            &id,\n            &exit_with(WAKE_OPCODE),\n            &fast_params(),\n            &stop,\n            || {\n                fired.fetch_add(1, Ordering::SeqCst);\n                Ok(\"test-resolved\".into())\n            },\n        );\n        assert_eq!(\n            fired.load(Ordering::SeqCst),\n            1,\n            \"resolution fired exactly once\"\n        );\n        assert!(!perch.join(WAKER_PID_FILE).exists(), \"pid file retired\");\n        assert!(\n            !perch.join(WAKER_GAVE_UP_FILE).exists(),\n            \"an opcode exit is not a crash\"\n        );\n    }\n\n    // [unit->REQ-SHELL-2] crash-exit supervision: a crashing waker respawns\n    // (with backoff) exactly give_up_after times, then the durable give-up\n    // latch drops and the resolution never fires; clear_gave_up re-arms.\n    #[test]\n    fn watcher_crash_exits_respawn_then_give_up() {\n        let tmp = tempfile::tempdir().unwrap();\n        let owlery = tmp.path();\n        seed_owner(owlery, \"doyle\");\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\n        let tally = perch.join(\"waker-tally.txt\");\n\n        let stop = AtomicBool::new(false);\n        watcher_run(\n            owlery,\n            \"doyle\",\n            &id,\n            &crash_tallying(&tally),\n            &fast_params(),\n            &stop,\n…\n        );\n…\n    }\n…\n}\n\n[Showing lines 479-693 of 1001. Use :694 to continue]"}],"details":{"truncation":{"content":"    let live: Vec<(String, String)> = {\r\n        let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());\r\n        map.retain(|_, h| !h.thread.is_finished());\r\n        map.keys().cloned().collect()\r\n    };\r\n    for (owner, shell_id) in live {\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\r\n        let still_eligible = shellinfo::read_shell_info(&perch)\r\n            .map(|i| i.status == SHELL_STATUS_OFFLINE)\r\n            .unwrap_or(false);\r\n        if !still_eligible {\r\n            set.stop_watcher(owlery, &owner, &shell_id);\r\n        }\r\n    }\r\n\r\n    // Start side: every offline instance with a wake_command and headroom.\r\n    for owner in spt_store::perch::list_self_perch_ids(owlery) {\r\n        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\r\n            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\r\n                continue;\r\n            }\r\n            let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {\r\n                continue; // deregistered adapter: nothing to run\r\n            };\r\n            let Some(wake_command) = shell.wake_command.as_deref() else {\r\n                continue;\r\n            };\r\n            let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\r\n            if perch.join(WAKER_GAVE_UP_FILE).exists() {\r\n                continue; // crash-latched until the next shell activity\r\n            }\r\n            // Adopt cleanly: a dead daemon's watcher must not double-run.\r\n            kill_waker_at(&perch);\r\n            let tokens = match fill_wake_command(&shell_id, &info.adapter_name, wake_command) {\r\n                Ok(t) => t,\r\n                Err(e) => {\r\n                    eprintln!(\"WAKER_TEMPLATE:{owner}/{shell_id}: {e}\");\r\n                    continue;\r\n                }\r\n            };\r\n            let stop = Arc::new(AtomicBool::new(false));\r\n            let handle = {\r\n                let stop = Arc::clone(&stop);\r\n                let owlery = owlery.to_path_buf();\r\n                let owner = owner.clone();\r\n                let shell_id = shell_id.clone();\r\n                let adapter_name = info.adapter_name.clone();\r\n                let params = *params;\r\n                std::thread::spawn(move || {\r\n                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\r\n                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\r\n                    });\r\n                })\r\n            };\r\n            set.insert(\r\n                &owner,\r\n                &shell_id,\r\n                WatcherHandle {\r\n                    stop,\r\n                    thread: handle,\r\n                },\r\n            );\r\n        }\r\n    }\r\n}\r\n\r\n/// The reconcile cadence (ms): lifecycle flips land in CLI processes, so the\r\n/// daemon's loop is the invariant holder — a flip is at most one tick stale.\r\npub const RECONCILE_INTERVAL_MS: u64 = 5_000;\r\n\r\n/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\r\n/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\r\n/// is re-read each sweep (adapter add/remove lands between ticks).\r\n// [impl->REQ-SHELL-2]\r\npub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        let set = Arc::new(WakeSet::new());\r\n        let params = WakeParams::default();\r\n        while !stop.load(Ordering::SeqCst) {\r\n            let owlery = spt_store::perch::owlery_dir();\r\n            let adapters_dir = spt_store::perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\r\n            // Sleep in slices so a stop lands promptly.\r\n            let mut left = RECONCILE_INTERVAL_MS;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};\r\n\r\n    fn fast_params() -> WakeParams {\r\n        WakeParams {\r\n            backoff_base_ms: 10,\r\n            backoff_cap_ms: 40,\r\n            give_up_after: 3,\r\n        }\r\n    }\r\n\r\n    fn seed_owner(owlery: &Path, owner: &str) {\r\n        let p = owlery.join(owner);\r\n        std::fs::create_dir_all(&p).unwrap();\r\n        std::fs::write(p.join(\"info.json\"), \"{}\").unwrap();\r\n    }\r\n\r\n    /// Tokens for a waker that exits with `code` immediately.\r\n    fn exit_with(code: i32) -> Vec<String> {\r\n        #[cfg(windows)]\r\n        return vec![\"cmd\".into(), \"/c\".into(), format!(\"exit {code}\")];\r\n        #[cfg(unix)]\r\n        return vec![\"sh\".into(), \"-c\".into(), format!(\"exit {code}\")];\r\n    }\r\n\r\n    /// Tokens for a waker that appends one line to `tally` then exits 1.\r\n    fn crash_tallying(tally: &Path) -> Vec<String> {\r\n        #[cfg(windows)]\r\n        return vec![\r\n            \"powershell\".into(),\r\n            \"-NoProfile\".into(),\r\n            \"-Command\".into(),\r\n            format!(\"Add-Content -Path '{}' -Value x; exit 1\", tally.display()),\r\n        ];\r\n        #[cfg(unix)]\r\n        return vec![\r\n            \"sh\".into(),\r\n            \"-c\".into(),\r\n            format!(\"echo x >> '{}'; exit 1\", tally.display()),\r\n        ];\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] the backoff curve: base × 2^(n-1), saturating at\r\n    // the cap; zero failures wait nothing.\r\n    #[test]\r\n    fn backoff_curve_doubles_to_the_cap() {\r\n        let p = WakeParams {\r\n            backoff_base_ms: 100,\r\n            backoff_cap_ms: 1_500,\r\n            give_up_after: 6,\r\n        };\r\n        assert_eq!(backoff_ms(&p, 0), 0);\r\n        assert_eq!(backoff_ms(&p, 1), 100);\r\n        assert_eq!(backoff_ms(&p, 2), 200);\r\n        assert_eq!(backoff_ms(&p, 4), 800);\r\n        assert_eq!(backoff_ms(&p, 5), 1_500, \"saturates at the cap\");\r\n        assert_eq!(\r\n            backoff_ms(&p, 60),\r\n            1_500,\r\n            \"huge failure counts can't overflow\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] exit-opcode supervision: exit(86) fires the wake\r\n    // resolution exactly once and the loop ends; the pid file is retired.\r\n    #[test]\r\n    fn watcher_opcode_exit_fires_resolution_once() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let owlery = tmp.path();\r\n        seed_owner(owlery, \"doyle\");\r\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\r\n\r\n        let fired = std::sync::atomic::AtomicU32::new(0);\r\n        let stop = AtomicBool::new(false);\r\n        watcher_run(\r\n            owlery,\r\n            \"doyle\",\r\n            &id,\r\n            &exit_with(WAKE_OPCODE),\r\n            &fast_params(),\r\n            &stop,\r\n            || {\r\n                fired.fetch_add(1, Ordering::SeqCst);\r\n                Ok(\"test-resolved\".into())\r\n            },\r\n        );\r\n        assert_eq!(\r\n            fired.load(Ordering::SeqCst),\r\n            1,\r\n            \"resolution fired exactly once\"\r\n        );\r\n        assert!(!perch.join(WAKER_PID_FILE).exists(), \"pid file retired\");\r\n        assert!(\r\n            !perch.join(WAKER_GAVE_UP_FILE).exists(),\r\n            \"an opcode exit is not a crash\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] crash-exit supervision: a crashing waker respawns\r\n    // (with backoff) exactly give_up_after times, then the durable give-up\r\n    // latch drops and the resolution never fires; clear_gave_up re-arms.\r\n    #[test]\r\n    fn watcher_crash_exits_respawn_then_give_up() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let owlery = tmp.path();\r\n        seed_owner(owlery, \"doyle\");\r\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\r\n        let tally = perch.join(\"waker-tally.txt\");\r\n\r\n        let stop = AtomicBool::new(false);\r\n        watcher_run(\r\n            owlery,\r\n            \"doyle\",\r\n            &id,\r\n            &crash_tallying(&tally),\r\n            &fast_params(),\r\n            &stop,\r","truncated":true,"truncatedBy":"lines","totalLines":523,"totalBytes":8357,"outputLines":215,"outputBytes":8357,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn reconcile_once(\n…\n) {\n…\n    let live: Vec<(String, String)> = {\r\n        let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());\r\n        map.retain(|_, h| !h.thread.is_finished());\r\n        map.keys().cloned().collect()\r\n    };\r\n    for (owner, shell_id) in live {\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\r\n        let still_eligible = shellinfo::read_shell_info(&perch)\r\n            .map(|i| i.status == SHELL_STATUS_OFFLINE)\r\n            .unwrap_or(false);\r\n        if !still_eligible {\r\n            set.stop_watcher(owlery, &owner, &shell_id);\r\n        }\r\n    }\r\n\r\n    // Start side: every offline instance with a wake_command and headroom.\r\n    for owner in spt_store::perch::list_self_perch_ids(owlery) {\r\n        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\r\n            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\r\n                continue;\r\n            }\r\n            let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {\r\n                continue; // deregistered adapter: nothing to run\r\n            };\r\n            let Some(wake_command) = shell.wake_command.as_deref() else {\r\n                continue;\r\n            };\r\n            let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);\r\n            if perch.join(WAKER_GAVE_UP_FILE).exists() {\r\n                continue; // crash-latched until the next shell activity\r\n            }\r\n            // Adopt cleanly: a dead daemon's watcher must not double-run.\r\n            kill_waker_at(&perch);\r\n            let tokens = match fill_wake_command(&shell_id, &info.adapter_name, wake_command) {\r\n                Ok(t) => t,\r\n                Err(e) => {\r\n                    eprintln!(\"WAKER_TEMPLATE:{owner}/{shell_id}: {e}\");\r\n                    continue;\r\n                }\r\n            };\r\n            let stop = Arc::new(AtomicBool::new(false));\r\n            let handle = {\r\n                let stop = Arc::clone(&stop);\r\n                let owlery = owlery.to_path_buf();\r\n                let owner = owner.clone();\r\n                let shell_id = shell_id.clone();\r\n                let adapter_name = info.adapter_name.clone();\r\n                let params = *params;\r\n                std::thread::spawn(move || {\r\n                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\r\n                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\r\n                    });\r\n                })\r\n            };\r\n            set.insert(\r\n                &owner,\r\n                &shell_id,\r\n                WatcherHandle {\r\n                    stop,\r\n                    thread: handle,\r\n                },\r\n            );\r\n        }\r\n    }\r\n}\r\n\r\n/// The reconcile cadence (ms): lifecycle flips land in CLI processes, so the\r\n/// daemon's loop is the invariant holder — a flip is at most one tick stale.\r\npub const RECONCILE_INTERVAL_MS: u64 = 5_000;\r\n\r\n/// Spawn the daemon's wake host: one thread sweeping [`reconcile_once`] at\r\n/// boot and every [`RECONCILE_INTERVAL_MS`] until `stop`. The registered set\r\n/// is re-read each sweep (adapter add/remove lands between ticks).\r\n// [impl->REQ-SHELL-2]\r\npub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        let set = Arc::new(WakeSet::new());\r\n        let params = WakeParams::default();\r\n        while !stop.load(Ordering::SeqCst) {\r\n            let owlery = spt_store::perch::owlery_dir();\r\n            let adapters_dir = spt_store::perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\r\n            // Sleep in slices so a stop lands promptly.\r\n            let mut left = RECONCILE_INTERVAL_MS;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};\r\n\r\n    fn fast_params() -> WakeParams {\r\n        WakeParams {\r\n            backoff_base_ms: 10,\r\n            backoff_cap_ms: 40,\r\n            give_up_after: 3,\r\n        }\r\n    }\r\n\r\n    fn seed_owner(owlery: &Path, owner: &str) {\r\n        let p = owlery.join(owner);\r\n        std::fs::create_dir_all(&p).unwrap();\r\n        std::fs::write(p.join(\"info.json\"), \"{}\").unwrap();\r\n    }\r\n\r\n    /// Tokens for a waker that exits with `code` immediately.\r\n    fn exit_with(code: i32) -> Vec<String> {\r\n        #[cfg(windows)]\r\n        return vec![\"cmd\".into(), \"/c\".into(), format!(\"exit {code}\")];\r\n        #[cfg(unix)]\r\n        return vec![\"sh\".into(), \"-c\".into(), format!(\"exit {code}\")];\r\n    }\r\n\r\n    /// Tokens for a waker that appends one line to `tally` then exits 1.\r\n    fn crash_tallying(tally: &Path) -> Vec<String> {\r\n        #[cfg(windows)]\r\n        return vec![\r\n            \"powershell\".into(),\r\n            \"-NoProfile\".into(),\r\n            \"-Command\".into(),\r\n            format!(\"Add-Content -Path '{}' -Value x; exit 1\", tally.display()),\r\n        ];\r\n        #[cfg(unix)]\r\n        return vec![\r\n            \"sh\".into(),\r\n            \"-c\".into(),\r\n            format!(\"echo x >> '{}'; exit 1\", tally.display()),\r\n        ];\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] the backoff curve: base × 2^(n-1), saturating at\r\n    // the cap; zero failures wait nothing.\r\n    #[test]\r\n    fn backoff_curve_doubles_to_the_cap() {\r\n        let p = WakeParams {\r\n            backoff_base_ms: 100,\r\n            backoff_cap_ms: 1_500,\r\n            give_up_after: 6,\r\n        };\r\n        assert_eq!(backoff_ms(&p, 0), 0);\r\n        assert_eq!(backoff_ms(&p, 1), 100);\r\n        assert_eq!(backoff_ms(&p, 2), 200);\r\n        assert_eq!(backoff_ms(&p, 4), 800);\r\n        assert_eq!(backoff_ms(&p, 5), 1_500, \"saturates at the cap\");\r\n        assert_eq!(\r\n            backoff_ms(&p, 60),\r\n            1_500,\r\n            \"huge failure counts can't overflow\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] exit-opcode supervision: exit(86) fires the wake\r\n    // resolution exactly once and the loop ends; the pid file is retired.\r\n    #[test]\r\n    fn watcher_opcode_exit_fires_resolution_once() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let owlery = tmp.path();\r\n        seed_owner(owlery, \"doyle\");\r\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\r\n\r\n        let fired = std::sync::atomic::AtomicU32::new(0);\r\n        let stop = AtomicBool::new(false);\r\n        watcher_run(\r\n            owlery,\r\n            \"doyle\",\r\n            &id,\r\n            &exit_with(WAKE_OPCODE),\r\n            &fast_params(),\r\n            &stop,\r\n            || {\r\n                fired.fetch_add(1, Ordering::SeqCst);\r\n                Ok(\"test-resolved\".into())\r\n            },\r\n        );\r\n        assert_eq!(\r\n            fired.load(Ordering::SeqCst),\r\n            1,\r\n            \"resolution fired exactly once\"\r\n        );\r\n        assert!(!perch.join(WAKER_PID_FILE).exists(), \"pid file retired\");\r\n        assert!(\r\n            !perch.join(WAKER_GAVE_UP_FILE).exists(),\r\n            \"an opcode exit is not a crash\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-SHELL-2] crash-exit supervision: a crashing waker respawns\r\n    // (with backoff) exactly give_up_after times, then the durable give-up\r\n    // latch drops and the resolution never fires; clear_gave_up re-arms.\r\n    #[test]\r\n    fn watcher_crash_exits_respawn_then_give_up() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let owlery = tmp.path();\r\n        seed_owner(owlery, \"doyle\");\r\n        let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();\r\n        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\r\n        let tally = perch.join(\"waker-tally.txt\");\r\n\r\n        let stop = AtomicBool::new(false);\r\n        watcher_run(\r\n            owlery,\r\n            \"doyle\",\r\n            &id,\r\n            &crash_tallying(&tally),\r\n            &fast_params(),\r\n            &stop,\r\n…\n        );\n…\n    }\n…\n}","startLine":471,"lineNumbers":[471,null,477,null,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,null,695,null,708,null,1000]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\shellwake.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1001,"totalBytes":8357,"outputLines":215,"outputBytes":8357,"shownRange":{"start":479,"end":693},"nextOffset":694}}},"isError":false,"timestamp":1784293163178}}
{"type":"message","id":"547ec591","parentId":"59b1e748","timestamp":"2026-07-17T12:59:23.194Z","message":{"role":"toolResult","toolCallId":"call_Sx2yUh7Gb87tkFuCMq8Tfr52|fc_034a6be5a6696b6c016a5a272ab9d081919087700eefc9676f","toolName":"read","content":[{"type":"text","text":"/// stream to a family worker, until `stop` is set. Blocks the calling thread\n/// (the daemon spawns it on its own); workers detach (each ends with its\n/// stream).\npub fn run_dispatch_loop(\n    broker_name: &str,\n    paths: &DispatchPaths,\n    registry: Arc<RegistryHost>,\n    stop: &AtomicBool,\n    poll: Duration,\n) -> io::Result<()> {\n    let mut brain = connect(broker_name)?;\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n    // abandoned a stream on the first transient failure.\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\n    // loop emits carries it, so per-generation attach/poison censuses line up.\n    let generation = now_ms();\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\n    // with workers so a seat-blocked retry paces on it.\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\n    // with a large backlog) claims at most this many rows per poll — the\n    // rest wait for the next tick, batching the cold enumeration instead of\n    // spawning one thread per row. No claim lock is held across any I/O:\n    // enumeration runs lock-free, the claim map is touched in short scopes.\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n    while !stop.load(Ordering::Relaxed) {\n        if breaker.lock().unwrap().open(Instant::now()) {\n            // Circuit open: a poisoned replay just happened — pause ALL\n            // claiming for the window instead of hammering the wedged conn\n            // with fresh replay subscribers (Amendment fix 5).\n            thread::sleep(poll);\n            continue;\n        }\n        let reply = brain.net_streams()?;\n        for s in reply.streams {\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\n            // invisible until its first write anyway — gotcha #6 — but the\n            // next_seq guard also skips a row whose pump hasn't appended yet).\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\n            if s.initiated_locally || s.next_seq == 0 {\n                continue;\n            }\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\n                break; // pool full: the rest of the table waits for the next poll\n            }\n            let attempts = {\n                let mut c = claims.lock().unwrap();\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\n                    Some(attempts) => {\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\n                        attempts\n                    }\n                    None => continue,\n                }\n            };\n            let name = broker_name.to_string();\n            let origin = s.remote_id_hex.clone();\n            let stream_id = s.stream_id;\n            let conn_id = s.conn_id;\n            let floor_seq = s.floor_seq;\n            let finished = s.finished;\n            let p = paths.clone();\n            let reg = Arc::clone(&registry);\n            let claims_done = Arc::clone(&claims);\n            let breaker_done = Arc::clone(&breaker);\n            let pool = Arc::clone(&active_workers);\n            pool.fetch_add(1, Ordering::Relaxed);\n            thread::spawn(move || {\n                let started = Instant::now();\n                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n                pool.fetch_sub(1, Ordering::Relaxed);\n                let outcome = report.outcome;\n                let elapsed_ms = started.elapsed().as_millis();\n                if let DispatchOutcome::Served(detail) = &outcome {\n                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\n                    // this stream's exchange is over — take its row out of\n                    // every FUTURE dispatcher generation's enumeration (the\n                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\n                    // an older broker without the verb answers error (KH-2.3)\n                    // and the row retires when the broker cycles.\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire(stream_id);\n                    }\n                    // Breaker reset = REAL progress only (gate round 1): a row\n                    // that vanished before serve proves nothing about the\n                    // wedge — a sibling's row-gone would close the breaker\n                    // AND zero its doubling ladder mid-wedge. A real serve\n                    // (including a finished-attach retirement) resets.\n                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\n                    if !detail.contains(\"terminal pre-serve\") {\n                        breaker_done.lock().unwrap().reset();\n                    }\n                } else {\n                    // Keyed worker-outcome record (Amendment fix 9) — the\n                    // legacy DISPATCH:<id> token is kept as a prefix so\n                    // existing field greps keep matching.\n                    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n                    eprintln!(\"DISPATCH:{stream_id}:{outcome:?}\");\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"worker-outcome\",\n                            &format!(\n                                \"{outcome:?} elapsed_ms={elapsed_ms} endpoint={}\",\n                                report.endpoint.as_deref().unwrap_or(\"-\")\n                            ),\n                        )\n                    );\n                }\n                // Seat-blocked failures trip the GLOBAL breaker; the claim\n                // requeue paces on the breaker window (never burning the\n                // bounded transient budget — T5's recovery discriminator).\n                let breaker_window = match &outcome {\n                    DispatchOutcome::Failed(msg)\n                        if classify_failure(msg) == FailClass::SeatBlocked =>\n                    {\n                        let mut b = breaker_done.lock().unwrap();\n                        let window = b.trip(Instant::now());\n                        eprintln!(\n                            \"{}\",\n                            dispatch_event(\n                                generation,\n                                stream_id,\n                                None,\n                                attempts,\n                                conn_id,\n                                \"breaker-trip\",\n                                &format!(\"window_ms={}\", window.as_millis()),\n                            )\n                        );\n                        window\n                    }\n                    _ => Duration::ZERO,\n                };\n                let (state, retire_terminal) = outcome_transition(\n                    &outcome,\n                    report.family,\n                    attempts,\n                    Instant::now(),\n                    breaker_window,\n                );\n                // One-way strike budget spent (ADR-0040 decision 4): retire\n                // the row TERMINAL — physically, loudly. A poisoned feed\n                // replay must never remain redispatchable across dispatcher\n                // generations; the next pump round re-advertises everything.\n                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\n                if retire_terminal {\n                    if let Ok(mut retire_brain) = connect(&name) {\n                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\n                    }\n                    eprintln!(\n                        \"{}\",\n                        dispatch_event(\n                            generation,\n                            stream_id,\n                            report.family,\n                            attempts,\n                            conn_id,\n                            \"oneway-strike-retire\",\n                            &format!(\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\n                                 advertisement round recovers\"\n                            ),\n                        )\n                    );\n                }\n                let mut c = claims_done.lock().unwrap();\n                c.insert(stream_id, state);\n            });\n        }\n        thread::sleep(poll);\n    }\n    Ok(())\n}\n\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\n/// table claims at most this many rows per poll tick.\nconst MAX_DISPATCH_WORKERS: usize = 8;\n\n/// PURE pool gate (Amendment fix 7): may the loop claim another row right\n/// now? The cold-enumeration break rides this — a refresh with a large\n/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest\n/// wait for the next tick (batched, never one thread per row).\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\nfn pool_has_room(active: usize) -> bool {\n…\n}\n\n[Showing lines 499-693 of 1920. Use :694 to continue]"}],"details":{"truncation":{"content":"/// stream to a family worker, until `stop` is set. Blocks the calling thread\r\n/// (the daemon spawns it on its own); workers detach (each ends with its\r\n/// stream).\r\npub fn run_dispatch_loop(\r\n    broker_name: &str,\r\n    paths: &DispatchPaths,\r\n    registry: Arc<RegistryHost>,\r\n    stop: &AtomicBool,\r\n    poll: Duration,\r\n) -> io::Result<()> {\r\n    let mut brain = connect(broker_name)?;\r\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\r\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\r\n    // abandoned a stream on the first transient failure.\r\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\r\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\r\n    // loop emits carries it, so per-generation attach/poison censuses line up.\r\n    let generation = now_ms();\r\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\r\n    // with workers so a seat-blocked retry paces on it.\r\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\r\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\r\n    // with a large backlog) claims at most this many rows per poll — the\r\n    // rest wait for the next tick, batching the cold enumeration instead of\r\n    // spawning one thread per row. No claim lock is held across any I/O:\r\n    // enumeration runs lock-free, the claim map is touched in short scopes.\r\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\r\n\r\n    while !stop.load(Ordering::Relaxed) {\r\n        if breaker.lock().unwrap().open(Instant::now()) {\r\n            // Circuit open: a poisoned replay just happened — pause ALL\r\n            // claiming for the window instead of hammering the wedged conn\r\n            // with fresh replay subscribers (Amendment fix 5).\r\n            thread::sleep(poll);\r\n            continue;\r\n        }\r\n        let reply = brain.net_streams()?;\r\n        for s in reply.streams {\r\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\r\n            // invisible until its first write anyway — gotcha #6 — but the\r\n            // next_seq guard also skips a row whose pump hasn't appended yet).\r\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\r\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\r\n            if s.initiated_locally || s.next_seq == 0 {\r\n                continue;\r\n            }\r\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\r\n                break; // pool full: the rest of the table waits for the next poll\r\n            }\r\n            let attempts = {\r\n                let mut c = claims.lock().unwrap();\r\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\r\n                    Some(attempts) => {\r\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\r\n                        attempts\r\n                    }\r\n                    None => continue,\r\n                }\r\n            };\r\n            let name = broker_name.to_string();\r\n            let origin = s.remote_id_hex.clone();\r\n            let stream_id = s.stream_id;\r\n            let conn_id = s.conn_id;\r\n            let floor_seq = s.floor_seq;\r\n            let finished = s.finished;\r\n            let p = paths.clone();\r\n            let reg = Arc::clone(&registry);\r\n            let claims_done = Arc::clone(&claims);\r\n            let breaker_done = Arc::clone(&breaker);\r\n            let pool = Arc::clone(&active_workers);\r\n            pool.fetch_add(1, Ordering::Relaxed);\r\n            thread::spawn(move || {\r\n                let started = Instant::now();\r\n                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\r\n                pool.fetch_sub(1, Ordering::Relaxed);\r\n                let outcome = report.outcome;\r\n                let elapsed_ms = started.elapsed().as_millis();\r\n                if let DispatchOutcome::Served(detail) = &outcome {\r\n                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\r\n                    // this stream's exchange is over — take its row out of\r\n                    // every FUTURE dispatcher generation's enumeration (the\r\n                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\r\n                    // an older broker without the verb answers error (KH-2.3)\r\n                    // and the row retires when the broker cycles.\r\n                    if let Ok(mut retire_brain) = connect(&name) {\r\n                        let _ = retire_brain.net_stream_retire(stream_id);\r\n                    }\r\n                    // Breaker reset = REAL progress only (gate round 1): a row\r\n                    // that vanished before serve proves nothing about the\r\n                    // wedge — a sibling's row-gone would close the breaker\r\n                    // AND zero its doubling ladder mid-wedge. A real serve\r\n                    // (including a finished-attach retirement) resets.\r\n                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n                    if !detail.contains(\"terminal pre-serve\") {\r\n                        breaker_done.lock().unwrap().reset();\r\n                    }\r\n                } else {\r\n                    // Keyed worker-outcome record (Amendment fix 9) — the\r\n                    // legacy DISPATCH:<id> token is kept as a prefix so\r\n                    // existing field greps keep matching.\r\n                    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\n                    eprintln!(\"DISPATCH:{stream_id}:{outcome:?}\");\r\n                    eprintln!(\r\n                        \"{}\",\r\n                        dispatch_event(\r\n                            generation,\r\n                            stream_id,\r\n                            report.family,\r\n                            attempts,\r\n                            conn_id,\r\n                            \"worker-outcome\",\r\n                            &format!(\r\n                                \"{outcome:?} elapsed_ms={elapsed_ms} endpoint={}\",\r\n                                report.endpoint.as_deref().unwrap_or(\"-\")\r\n                            ),\r\n                        )\r\n                    );\r\n                }\r\n                // Seat-blocked failures trip the GLOBAL breaker; the claim\r\n                // requeue paces on the breaker window (never burning the\r\n                // bounded transient budget — T5's recovery discriminator).\r\n                let breaker_window = match &outcome {\r\n                    DispatchOutcome::Failed(msg)\r\n                        if classify_failure(msg) == FailClass::SeatBlocked =>\r\n                    {\r\n                        let mut b = breaker_done.lock().unwrap();\r\n                        let window = b.trip(Instant::now());\r\n                        eprintln!(\r\n                            \"{}\",\r\n                            dispatch_event(\r\n                                generation,\r\n                                stream_id,\r\n                                None,\r\n                                attempts,\r\n                                conn_id,\r\n                                \"breaker-trip\",\r\n                                &format!(\"window_ms={}\", window.as_millis()),\r\n                            )\r\n                        );\r\n                        window\r\n                    }\r\n                    _ => Duration::ZERO,\r\n                };\r\n                let (state, retire_terminal) = outcome_transition(\r\n                    &outcome,\r\n                    report.family,\r\n                    attempts,\r\n                    Instant::now(),\r\n                    breaker_window,\r\n                );\r\n                // One-way strike budget spent (ADR-0040 decision 4): retire\r\n                // the row TERMINAL — physically, loudly. A poisoned feed\r\n                // replay must never remain redispatchable across dispatcher\r\n                // generations; the next pump round re-advertises everything.\r\n                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\n                if retire_terminal {\r\n                    if let Ok(mut retire_brain) = connect(&name) {\r\n                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\r\n                    }\r\n                    eprintln!(\r\n                        \"{}\",\r\n                        dispatch_event(\r\n                            generation,\r\n                            stream_id,\r\n                            report.family,\r\n                            attempts,\r\n                            conn_id,\r\n                            \"oneway-strike-retire\",\r\n                            &format!(\r\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\r\n                                 advertisement round recovers\"\r\n                            ),\r\n                        )\r\n                    );\r\n                }\r\n                let mut c = claims_done.lock().unwrap();\r\n                c.insert(stream_id, state);\r\n            });\r\n        }\r\n        thread::sleep(poll);\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\r\n/// table claims at most this many rows per poll tick.\r\nconst MAX_DISPATCH_WORKERS: usize = 8;\r\n\r\n/// PURE pool gate (Amendment fix 7): may the loop claim another row right\r\n/// now? The cold-enumeration break rides this — a refresh with a large\r\n/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest\r\n/// wait for the next tick (batched, never one thread per row).\r\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\nfn pool_has_room(active: usize) -> bool {\r","truncated":true,"truncatedBy":"lines","totalLines":1422,"totalBytes":9826,"outputLines":195,"outputBytes":9826,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// stream to a family worker, until `stop` is set. Blocks the calling thread\r\n/// (the daemon spawns it on its own); workers detach (each ends with its\r\n/// stream).\r\npub fn run_dispatch_loop(\r\n    broker_name: &str,\r\n    paths: &DispatchPaths,\r\n    registry: Arc<RegistryHost>,\r\n    stop: &AtomicBool,\r\n    poll: Duration,\r\n) -> io::Result<()> {\r\n    let mut brain = connect(broker_name)?;\r\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\r\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\r\n    // abandoned a stream on the first transient failure.\r\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\r\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\r\n    // loop emits carries it, so per-generation attach/poison censuses line up.\r\n    let generation = now_ms();\r\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\r\n    // with workers so a seat-blocked retry paces on it.\r\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\r\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\r\n    // with a large backlog) claims at most this many rows per poll — the\r\n    // rest wait for the next tick, batching the cold enumeration instead of\r\n    // spawning one thread per row. No claim lock is held across any I/O:\r\n    // enumeration runs lock-free, the claim map is touched in short scopes.\r\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\r\n\r\n    while !stop.load(Ordering::Relaxed) {\r\n        if breaker.lock().unwrap().open(Instant::now()) {\r\n            // Circuit open: a poisoned replay just happened — pause ALL\r\n            // claiming for the window instead of hammering the wedged conn\r\n            // with fresh replay subscribers (Amendment fix 5).\r\n            thread::sleep(poll);\r\n            continue;\r\n        }\r\n        let reply = brain.net_streams()?;\r\n        for s in reply.streams {\r\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\r\n            // invisible until its first write anyway — gotcha #6 — but the\r\n            // next_seq guard also skips a row whose pump hasn't appended yet).\r\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\r\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\r\n            if s.initiated_locally || s.next_seq == 0 {\r\n                continue;\r\n            }\r\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\r\n                break; // pool full: the rest of the table waits for the next poll\r\n            }\r\n            let attempts = {\r\n                let mut c = claims.lock().unwrap();\r\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\r\n                    Some(attempts) => {\r\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\r\n                        attempts\r\n                    }\r\n                    None => continue,\r\n                }\r\n            };\r\n            let name = broker_name.to_string();\r\n            let origin = s.remote_id_hex.clone();\r\n            let stream_id = s.stream_id;\r\n            let conn_id = s.conn_id;\r\n            let floor_seq = s.floor_seq;\r\n            let finished = s.finished;\r\n            let p = paths.clone();\r\n            let reg = Arc::clone(&registry);\r\n            let claims_done = Arc::clone(&claims);\r\n            let breaker_done = Arc::clone(&breaker);\r\n            let pool = Arc::clone(&active_workers);\r\n            pool.fetch_add(1, Ordering::Relaxed);\r\n            thread::spawn(move || {\r\n                let started = Instant::now();\r\n                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\r\n                pool.fetch_sub(1, Ordering::Relaxed);\r\n                let outcome = report.outcome;\r\n                let elapsed_ms = started.elapsed().as_millis();\r\n                if let DispatchOutcome::Served(detail) = &outcome {\r\n                    // Retirement (ADR-0038 A, REQ-REDISPATCH-FINISHED-RETIRE):\r\n                    // this stream's exchange is over — take its row out of\r\n                    // every FUTURE dispatcher generation's enumeration (the\r\n                    // KNOWN-HAZARDS 7.41 control-steal class). Best-effort:\r\n                    // an older broker without the verb answers error (KH-2.3)\r\n                    // and the row retires when the broker cycles.\r\n                    if let Ok(mut retire_brain) = connect(&name) {\r\n                        let _ = retire_brain.net_stream_retire(stream_id);\r\n                    }\r\n                    // Breaker reset = REAL progress only (gate round 1): a row\r\n                    // that vanished before serve proves nothing about the\r\n                    // wedge — a sibling's row-gone would close the breaker\r\n                    // AND zero its doubling ladder mid-wedge. A real serve\r\n                    // (including a finished-attach retirement) resets.\r\n                    // [impl->REQ-DISPATCH-FALLBACK-CIRCUIT]\r\n                    if !detail.contains(\"terminal pre-serve\") {\r\n                        breaker_done.lock().unwrap().reset();\r\n                    }\r\n                } else {\r\n                    // Keyed worker-outcome record (Amendment fix 9) — the\r\n                    // legacy DISPATCH:<id> token is kept as a prefix so\r\n                    // existing field greps keep matching.\r\n                    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\n                    eprintln!(\"DISPATCH:{stream_id}:{outcome:?}\");\r\n                    eprintln!(\r\n                        \"{}\",\r\n                        dispatch_event(\r\n                            generation,\r\n                            stream_id,\r\n                            report.family,\r\n                            attempts,\r\n                            conn_id,\r\n                            \"worker-outcome\",\r\n                            &format!(\r\n                                \"{outcome:?} elapsed_ms={elapsed_ms} endpoint={}\",\r\n                                report.endpoint.as_deref().unwrap_or(\"-\")\r\n                            ),\r\n                        )\r\n                    );\r\n                }\r\n                // Seat-blocked failures trip the GLOBAL breaker; the claim\r\n                // requeue paces on the breaker window (never burning the\r\n                // bounded transient budget — T5's recovery discriminator).\r\n                let breaker_window = match &outcome {\r\n                    DispatchOutcome::Failed(msg)\r\n                        if classify_failure(msg) == FailClass::SeatBlocked =>\r\n                    {\r\n                        let mut b = breaker_done.lock().unwrap();\r\n                        let window = b.trip(Instant::now());\r\n                        eprintln!(\r\n                            \"{}\",\r\n                            dispatch_event(\r\n                                generation,\r\n                                stream_id,\r\n                                None,\r\n                                attempts,\r\n                                conn_id,\r\n                                \"breaker-trip\",\r\n                                &format!(\"window_ms={}\", window.as_millis()),\r\n                            )\r\n                        );\r\n                        window\r\n                    }\r\n                    _ => Duration::ZERO,\r\n                };\r\n                let (state, retire_terminal) = outcome_transition(\r\n                    &outcome,\r\n                    report.family,\r\n                    attempts,\r\n                    Instant::now(),\r\n                    breaker_window,\r\n                );\r\n                // One-way strike budget spent (ADR-0040 decision 4): retire\r\n                // the row TERMINAL — physically, loudly. A poisoned feed\r\n                // replay must never remain redispatchable across dispatcher\r\n                // generations; the next pump round re-advertises everything.\r\n                // [impl->REQ-REGISTRY-REPLAY-BOUNDED]\r\n                if retire_terminal {\r\n                    if let Ok(mut retire_brain) = connect(&name) {\r\n                        let _ = retire_brain.net_stream_retire_terminal(stream_id);\r\n                    }\r\n                    eprintln!(\r\n                        \"{}\",\r\n                        dispatch_event(\r\n                            generation,\r\n                            stream_id,\r\n                            report.family,\r\n                            attempts,\r\n                            conn_id,\r\n                            \"oneway-strike-retire\",\r\n                            &format!(\r\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\r\n                                 advertisement round recovers\"\r\n                            ),\r\n                        )\r\n                    );\r\n                }\r\n                let mut c = claims_done.lock().unwrap();\r\n                c.insert(stream_id, state);\r\n            });\r\n        }\r\n        thread::sleep(poll);\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream\r\n/// table claims at most this many rows per poll tick.\r\nconst MAX_DISPATCH_WORKERS: usize = 8;\r\n\r\n/// PURE pool gate (Amendment fix 7): may the loop claim another row right\r\n/// now? The cold-enumeration break rides this — a refresh with a large\r\n/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest\r\n/// wait for the next tick (batched, never one thread per row).\r\n// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\r\nfn pool_has_room(active: usize) -> bool {\r\n…\n}","startLine":499,"lineNumbers":[499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,null,695]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1920,"totalBytes":9826,"outputLines":195,"outputBytes":9826,"shownRange":{"start":499,"end":693},"nextOffset":694}}},"isError":false,"timestamp":1784293163194}}
{"type":"message","id":"37c0b71f","parentId":"547ec591","timestamp":"2026-07-17T12:59:23.209Z","message":{"role":"toolResult","toolCallId":"call_pfFQxUytie2NTJFNEJPsTJr0|fc_034a6be5a6696b6c016a5a272ab9d88191a00090805d7e3410","toolName":"read","content":[{"type":"text","text":"impl PeerIo<'_> {\n…\n    /// Mint the next durable open-op from the pump's sole counter (exactly-once\n    /// open identity — a restart can never reuse one), tagged with the `pump`\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\n    fn open_op(&mut self) -> io::Result<MintedOp> {\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\n    }\n}\n\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\n/// per-peer connection cache (an IO failure against a peer drops its cache\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\n/// because the broker's closed-watcher reaps dead conns).\n///\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n/// logic lives here — the shell owns only *when* and *toward whom*.\npub fn run_peer_pump(\n    broker_name: &str,\n    registry: Arc<RegistryHost>,\n    paths: &PumpPaths,\n    resolver: PeerResolver,\n    config: PumpConfig,\n    hooks: PumpHooks,\n    stop: &AtomicBool,\n) -> io::Result<()> {\n    let PumpConfig {\n        cadence,\n        full_auto_update,\n    } = config;\n    // PUMP MODE: a brain whose carrier is SPLIT at construction (reader thread +\n    // channel) so every reply read is bounded by PUMP_PEER_IO_TIMEOUT — a\n    // black-holed peer can never wedge this single-threaded loop (the 2.2h\n    // hfenduleam stall). A timed-out read escalates to a supervised restart\n    // below, never a per-peer retry (REQ-HAZARD-PUMP-IPC-DEADLINE).\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n    let mut brain = connect(broker_name)?;\n    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\n    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\n    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\n    // whose reply-reads consume every event kind off their carrier; sharing one\n    // carrier would make a pull-read swallow a presence frame (advancing the\n    // exactly-once cursor while dropping the outcome — the D4c break). Two\n    // carriers keep the drain and the pulls from swallowing each other by\n    // construction. Tail-follow (no history replay, baseline on first live event)\n    // so a long-lived broker's evicted ring can never gap-trip a false restart.\n    let mut events = connect(broker_name)?;\n    events.net_presence_subscribe_tail()?;\n    // Startup reconcile + invariant migration (ADR-0039 Decisions 3+4,\n    // REQ-PEER-ROUTE-CHAIN / REQ-PEERADDR-INVARIANT): validated roster\n    // addresses reconcile into the dial cache BEFORE the first round —\n    // recovery is connection-independent (a node restarted mid-strand heals\n    // here, no operator surgery) — and rows violating `outer key ==\n    // address.id` are repaired from the roster or dropped loudly (the first\n    // post-upgrade load is the migration; the file is never bare-deleted —\n    // valid rows and the id-only fallback behind them stay untouched).\n    // Idempotent, so re-running on every supervised pump restart is free.\n    startup_reconcile_peeraddrs(paths, registry.node_hex());\n    // Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded\n    // so the last-good stamps survive a restart; the live counts re-prime as\n    // rounds run. Persisted beside the heartbeat; the status CLI reads it.\n    let health_path = PumpHealth::path_beside(&paths.heartbeat);\n    let mut health = PumpHealth::load_from(&health_path);\n    health.note_disconnected(0); // no conns exist yet in this pump generation\n    let mut ops = EpochSource::load_from(&paths.ops);\n    // The live per-peer connection cache (updated by presence events) + the\n    // per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.\n    let mut conns: HashMap<String, u64> = HashMap::new();\n    let mut sched: HashMap<String, PeerSched> = HashMap::new();\n    // The four cadenced legs behind the worker seam, in fan-out order\n    // (registry → notif → sync → update). The shell drives them generically;\n    // each leg's *what* lives in its module (§Frozen). Construction capture\n    // (§Frozen-4): each worker owns the registry Arc / path slices / config\n    // knob it needs — the sync worker additionally owns the conflict-surface\n    // hooks (ADR-0013).\n    let mut registry_worker = RegistryWorker::new(Arc::clone(&registry), paths, &cadence);\n    let mut notif_worker = NotifWorker::new(paths, &cadence);\n    let mut sync_worker = SyncWorker::new(Arc::clone(&registry), paths, &cadence, hooks);\n    let mut update_worker = UpdateWorker::new(Arc::clone(&registry), paths, &cadence, full_auto_update);\n    let mut workers: [&mut dyn PumpWorker; 4] = [\n        &mut registry_worker,\n        &mut notif_worker,\n        &mut sync_worker,\n        &mut update_worker,\n    ];\n    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\n    // `workers`. `None` = never run yet → due immediately, so the first tick\n    // primes every leg. Never `Instant - Duration` — the underflow panic on a\n    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\n    let mut last: [Option<Instant>; 4] = [None; 4];\n    let mut last_hb: Option<Instant> = None;\n\n    while !stop.load(Ordering::Relaxed) {\n        let now = Instant::now();\n        // Shell-owned liveness heartbeat (M8 decision 23, REQ-DAEMON-5): written\n        // while the loop is ALIVE — including idle ticks — never per work round,\n        // so a wedged step and a healthy quiet pump are distinguishable.\n        // Throttled; per-tick, never a worker (REQ-DAEMON-5), no wake.\n        // [impl->REQ-DAEMON-5]\n        if due(last_hb, false, now, HEARTBEAT_PERIOD) {\n            write_heartbeat(&paths.heartbeat);\n            last_hb = Some(now);\n        }\n        // Poll every worker's wake and decide due (the pure scheduler step):\n        // every wake is consumed EVERY tick so a marker is never stranded (the\n        // registry advertise-now, REQ-CONV-2; the sync freshness pull,\n        // REQ-INST-3). The take IS the remove — one wake claims exactly one\n        // forced round.\n        let (due_flags, any_due) = compute_due(&mut workers, &last, now);\n        if !any_due {\n            thread::sleep(TICK);\n            continue;\n        }\n\n        // Per-round shared loads (§Frozen-3): subnets / attachment /\n        // roster-backed policy, read ONCE and handed to every worker.\n        let ctx = RoundCtx::load(paths);\n\n        // Each due worker's node-local pre_round, once per round before ANY\n        // peer_step (only the registry leg does work here — its sweep +\n        // advertise; the rest default to a no-op).\n        pre_rounds(&mut workers, &due_flags, &ctx);\n\n        // ── PUMP-TRUTH W2 round (REQ-PUMP-PEER-ISOLATION) — concurrent dials +\n        // per-peer fault isolation. Group this round's fan-out targets by peer (a\n        // peer may target several subnets; one conn serves them all).\n        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\n        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\n            peer_subnets.entry(peer_hex).or_default().push(sub_name);\n        }\n        // Health targets = this round's fan-out set; snapshot the registry\n        // host's last-admitted stamp while here (REQ-PUMP-STAGE-TRUTH).\n        health.set_targets(peer_subnets.keys().cloned(), now_ms());\n        health.note_registry_admit(registry.last_admit_ms());\n        let round_start = Instant::now();\n        let mut pending: HashSet<String> = HashSet::new();\n\n        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\n        // legs NOW for already-connected ones. The live peer advertises without\n        // waiting on a dead one (no head-of-line block) — a dead peer is only a\n        // pending outcome, never a serial blocker.\n        for (peer_hex, subs) in &peer_subnets {\n            if let Some(&conn_id) = conns.get(peer_hex) {\n                run_peer_subnets(\n                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    conn_id, subs, peer_hex, &ctx, round_start,\n                )?;\n            } else if peer_eligible(&sched, peer_hex, round_start) {\n                if let Some(addr) =\n                    resolve_submit_addr(&resolver, peer_hex, &paths.peer_addrs, &ctx.policy.roster)\n                {\n                    match brain.submit_dial(addr) {\n                        Ok(()) => {\n                            pending.insert(peer_hex.clone());\n                        }\n                        // A raw carrier-op TimedOut on the submit IPC itself is a\n                        // genuine broker-IPC desync → bubble → supervised restart.\n                        Err(e) if e.kind() == io::ErrorKind::TimedOut => return Err(e),\n                        // The broker refused the submit (net disabled / bad addr):\n                        // an ordinary per-peer failure — back off, round continues.\n                        Err(e) => {\n                            eprintln!(\n                                \"PUMP_PEER_FAIL:{peer_hex}:{e} wall_ms={} mono_ms={}\",\n                                now_ms(),\n                                mono_ms()\n                            );\n                            health.note_failed(peer_hex, \"submit\", conns.len(), now_ms());\n                            let prev = sched.get(peer_hex).copied();\n                            sched.insert(peer_hex.clone(), next_peer_backoff(prev, round_start));\n                        }\n                    }\n                } else {\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\n                    // `address-resolution`). Transition-logged: the first\n                    // unroutable round per peer is loud, repeats are quiet —\n                    // the peer retries on its own cadence like before.\n                    if health.note_failed(\n                        peer_hex,\n                        crate::seedproofx::STAGE_RESOLVE,\n                        conns.len(),\n                        now_ms(),\n                    ) {\n                        eprintln!(\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\n                            crate::seedproofx::STAGE_RESOLVE,\n                            now_ms(),\n                            mono_ms()\n                        );\n                    }\n                }\n            }\n        }\n\n        // Drain dial outcomes on the DEDICATED event carrier until the round\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\n        // restarts the pump; a dead PEER never does).\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\n        loop {\n            let read_deadline = if pending.is_empty() {\n                Instant::now() // no outstanding submits — sweep only what is queued\n            } else {\n                round_deadline\n            };\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\n                DrainStep::Apply(ev) => handle_presence_event(\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\n                )?,\n                DrainStep::Skip => continue, // the event carrier only carries presence\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\n            }\n        }\n\n        // Persist the round's reachability truth for the status surfaces\n        // (REQ-PUMP-STAGE-TRUTH: the acceptance surface of this contract).\n        health.save_to(&health_path);\n\n        // Mark-after-round with a POST-round instant (ADR-0018 §V4: the\n        // stagger — ran = ATTEMPTED, not succeeded; the next due is measured\n        // from here, not from the round's start).\n        mark_ran(&mut last, &due_flags, Instant::now());\n    }\n    Ok(())\n}\n\n/// Compute each worker's due flag for this tick (the pure scheduler step):\n/// poll EVERY worker's wake first — even a not-otherwise-due leg, so a marker\n/// is never stranded — then the [`due`] kernel over its RAM-only last-ran\n/// instant. Returns the per-worker flags (parallel to `workers`) and whether\n/// ANY leg is due (an all-idle tick sleeps without loading a round).\nfn compute_due(\n    workers: &mut [&mut dyn PumpWorker],\n    last: &[Option<Instant>],\n    now: Instant,\n) -> (Vec<bool>, bool) {\n    let mut flags = vec![false; workers.len()];\n    let mut any = false;\n    for i in 0..workers.len() {\n        let wake = workers[i].poll_wake();\n        flags[i] = due(last[i], wake, now, workers[i].cadence());\n        any |= flags[i];\n    }\n    (flags, any)\n}\n\n/// Run each due worker's node-local `pre_round` ONCE for the round, before any\n/// peer_step (the registry sweep + advertise; the other legs default no-op).\nfn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\n    for i in 0..workers.len() {\n        if due_flags[i] {\n            workers[i].pre_round(ctx);\n        }\n    }\n}\n\n/// Run `step` for each due worker index in fan-out order, aborting on the\n/// FIRST error (abort-on-first-fail — the caller drops the peer's conn and\n/// redials next tick). The peer-step IO itself lives in `step`; this is the\n/// pure ordering/abort kernel, so the choreography is a unit fact.\nfn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {\n    for (i, &is_due) in due_flags.iter().enumerate() {\n        if is_due {\n            step(i)?;\n        }\n    }\n    Ok(())\n}\n\n/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — SUPERSEDES\n/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its\n/// carrier-desync→restart path. `Ok` keeps the conn. An ORDINARY error (including\n/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\n/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\n/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\n/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\n/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\n/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\n/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\n/// does (the decouple W2 delivers).\n// [impl->REQ-PUMP-PEER-ISOLATION]\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\nfn peer_leg_outcome(\n    result: io::Result<()>,\n    peer_hex: &str,\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    now: Instant,\n) -> io::Result<()> {\n    match result {\n        Ok(()) => Ok(()),\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => Err(e), // carrier desync → restart\n        Err(e) => {\n            eprintln!(\"PUMP_PEER_FAIL:{peer_hex}:{e}\");\n            conns.remove(peer_hex); // ordinary per-peer failure → drop conn\n            let prev = sched.get(peer_hex).copied();\n            sched.insert(peer_hex.to_string(), next_peer_backoff(prev, now)); // + back off (Q3)\n            Ok(())\n        }\n    }\n}\n\n/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\n/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\n/// after each — an ordinary failure drops the conn + backs the peer off and stops\n/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\n/// Each worker mints its open-ops only through the shell-owned [`PeerIo`].\n// [impl->REQ-PUMP-PEER-ISOLATION]\n#[allow(clippy::too_many_arguments)]\nfn run_peer_subnets(\n    brain: &mut Brain,\n    ops: &mut EpochSource,\n    workers: &mut [&mut dyn PumpWorker],\n    due_flags: &[bool],\n    conns: &mut HashMap<String, u64>,\n    sched: &mut HashMap<String, PeerSched>,\n    conn_id: u64,\n    subs: &[String],\n    peer_hex: &str,\n    ctx: &RoundCtx,\n    now: Instant,\n) -> io::Result<()> {\n    for sub_name in subs {\n        let outcome = run_due(due_flags, |i| {\n            let mut io = PeerIo {\n                brain: &mut *brain,\n                conn_id,\n                ops: &mut *ops,\n            };\n            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\n        });\n        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\n        if !conns.contains_key(peer_hex) {\n            break; // an ordinary failure dropped the conn — redial a later round\n        }\n    }\n    Ok(())\n}\n\n/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).\n/// `CONNECTED` → cache the conn, RESET the peer's backoff, seed the observed addr\n/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in\n/// THIS round (advertise the round it connects — no head-of-line block by the dead\n/// peers). `DIAL_FAILED` → back the peer off (G5), log the ordinary per-peer\n/// signal, and drop the stale seed (REQ-CONV-1 self-heal → next round re-resolves\n/// via discovery). `DISCONNECTED` → drop the cached conn, NO backoff (redial-\n\n[Showing lines 499-853 of 2054. Use :854 to continue]"}],"details":{"truncation":{"content":"    /// Mint the next durable open-op from the pump's sole counter (exactly-once\r\n    /// open identity — a restart can never reuse one), tagged with the `pump`\r\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\r\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\r\n    fn open_op(&mut self) -> io::Result<MintedOp> {\r\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\r\n    }\r\n}\r\n\r\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\r\n/// per-peer connection cache (an IO failure against a peer drops its cache\r\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\r\n/// because the broker's closed-watcher reaps dead conns).\r\n///\r\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\r\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\r\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\r\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\r\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\r\n/// logic lives here — the shell owns only *when* and *toward whom*.\r\npub fn run_peer_pump(\r\n    broker_name: &str,\r\n    registry: Arc<RegistryHost>,\r\n    paths: &PumpPaths,\r\n    resolver: PeerResolver,\r\n    config: PumpConfig,\r\n    hooks: PumpHooks,\r\n    stop: &AtomicBool,\r\n) -> io::Result<()> {\r\n    let PumpConfig {\r\n        cadence,\r\n        full_auto_update,\r\n    } = config;\r\n    // PUMP MODE: a brain whose carrier is SPLIT at construction (reader thread +\r\n    // channel) so every reply read is bounded by PUMP_PEER_IO_TIMEOUT — a\r\n    // black-holed peer can never wedge this single-threaded loop (the 2.2h\r\n    // hfenduleam stall). A timed-out read escalates to a supervised restart\r\n    // below, never a per-peer retry (REQ-HAZARD-PUMP-IPC-DEADLINE).\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    let mut brain = connect(broker_name)?;\r\n    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\r\n    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\r\n    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\r\n    // whose reply-reads consume every event kind off their carrier; sharing one\r\n    // carrier would make a pull-read swallow a presence frame (advancing the\r\n    // exactly-once cursor while dropping the outcome — the D4c break). Two\r\n    // carriers keep the drain and the pulls from swallowing each other by\r\n    // construction. Tail-follow (no history replay, baseline on first live event)\r\n    // so a long-lived broker's evicted ring can never gap-trip a false restart.\r\n    let mut events = connect(broker_name)?;\r\n    events.net_presence_subscribe_tail()?;\r\n    // Startup reconcile + invariant migration (ADR-0039 Decisions 3+4,\r\n    // REQ-PEER-ROUTE-CHAIN / REQ-PEERADDR-INVARIANT): validated roster\r\n    // addresses reconcile into the dial cache BEFORE the first round —\r\n    // recovery is connection-independent (a node restarted mid-strand heals\r\n    // here, no operator surgery) — and rows violating `outer key ==\r\n    // address.id` are repaired from the roster or dropped loudly (the first\r\n    // post-upgrade load is the migration; the file is never bare-deleted —\r\n    // valid rows and the id-only fallback behind them stay untouched).\r\n    // Idempotent, so re-running on every supervised pump restart is free.\r\n    startup_reconcile_peeraddrs(paths, registry.node_hex());\r\n    // Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded\r\n    // so the last-good stamps survive a restart; the live counts re-prime as\r\n    // rounds run. Persisted beside the heartbeat; the status CLI reads it.\r\n    let health_path = PumpHealth::path_beside(&paths.heartbeat);\r\n    let mut health = PumpHealth::load_from(&health_path);\r\n    health.note_disconnected(0); // no conns exist yet in this pump generation\r\n    let mut ops = EpochSource::load_from(&paths.ops);\r\n    // The live per-peer connection cache (updated by presence events) + the\r\n    // per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.\r\n    let mut conns: HashMap<String, u64> = HashMap::new();\r\n    let mut sched: HashMap<String, PeerSched> = HashMap::new();\r\n    // The four cadenced legs behind the worker seam, in fan-out order\r\n    // (registry → notif → sync → update). The shell drives them generically;\r\n    // each leg's *what* lives in its module (§Frozen). Construction capture\r\n    // (§Frozen-4): each worker owns the registry Arc / path slices / config\r\n    // knob it needs — the sync worker additionally owns the conflict-surface\r\n    // hooks (ADR-0013).\r\n    let mut registry_worker = RegistryWorker::new(Arc::clone(&registry), paths, &cadence);\r\n    let mut notif_worker = NotifWorker::new(paths, &cadence);\r\n    let mut sync_worker = SyncWorker::new(Arc::clone(&registry), paths, &cadence, hooks);\r\n    let mut update_worker = UpdateWorker::new(Arc::clone(&registry), paths, &cadence, full_auto_update);\r\n    let mut workers: [&mut dyn PumpWorker; 4] = [\r\n        &mut registry_worker,\r\n        &mut notif_worker,\r\n        &mut sync_worker,\r\n        &mut update_worker,\r\n    ];\r\n    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\r\n    // `workers`. `None` = never run yet → due immediately, so the first tick\r\n    // primes every leg. Never `Instant - Duration` — the underflow panic on a\r\n    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\r\n    let mut last: [Option<Instant>; 4] = [None; 4];\r\n    let mut last_hb: Option<Instant> = None;\r\n\r\n    while !stop.load(Ordering::Relaxed) {\r\n        let now = Instant::now();\r\n        // Shell-owned liveness heartbeat (M8 decision 23, REQ-DAEMON-5): written\r\n        // while the loop is ALIVE — including idle ticks — never per work round,\r\n        // so a wedged step and a healthy quiet pump are distinguishable.\r\n        // Throttled; per-tick, never a worker (REQ-DAEMON-5), no wake.\r\n        // [impl->REQ-DAEMON-5]\r\n        if due(last_hb, false, now, HEARTBEAT_PERIOD) {\r\n            write_heartbeat(&paths.heartbeat);\r\n            last_hb = Some(now);\r\n        }\r\n        // Poll every worker's wake and decide due (the pure scheduler step):\r\n        // every wake is consumed EVERY tick so a marker is never stranded (the\r\n        // registry advertise-now, REQ-CONV-2; the sync freshness pull,\r\n        // REQ-INST-3). The take IS the remove — one wake claims exactly one\r\n        // forced round.\r\n        let (due_flags, any_due) = compute_due(&mut workers, &last, now);\r\n        if !any_due {\r\n            thread::sleep(TICK);\r\n            continue;\r\n        }\r\n\r\n        // Per-round shared loads (§Frozen-3): subnets / attachment /\r\n        // roster-backed policy, read ONCE and handed to every worker.\r\n        let ctx = RoundCtx::load(paths);\r\n\r\n        // Each due worker's node-local pre_round, once per round before ANY\r\n        // peer_step (only the registry leg does work here — its sweep +\r\n        // advertise; the rest default to a no-op).\r\n        pre_rounds(&mut workers, &due_flags, &ctx);\r\n\r\n        // ── PUMP-TRUTH W2 round (REQ-PUMP-PEER-ISOLATION) — concurrent dials +\r\n        // per-peer fault isolation. Group this round's fan-out targets by peer (a\r\n        // peer may target several subnets; one conn serves them all).\r\n        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\r\n        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\r\n            peer_subnets.entry(peer_hex).or_default().push(sub_name);\r\n        }\r\n        // Health targets = this round's fan-out set; snapshot the registry\r\n        // host's last-admitted stamp while here (REQ-PUMP-STAGE-TRUTH).\r\n        health.set_targets(peer_subnets.keys().cloned(), now_ms());\r\n        health.note_registry_admit(registry.last_admit_ms());\r\n        let round_start = Instant::now();\r\n        let mut pending: HashSet<String> = HashSet::new();\r\n\r\n        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\r\n        // legs NOW for already-connected ones. The live peer advertises without\r\n        // waiting on a dead one (no head-of-line block) — a dead peer is only a\r\n        // pending outcome, never a serial blocker.\r\n        for (peer_hex, subs) in &peer_subnets {\r\n            if let Some(&conn_id) = conns.get(peer_hex) {\r\n                run_peer_subnets(\r\n                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    conn_id, subs, peer_hex, &ctx, round_start,\r\n                )?;\r\n            } else if peer_eligible(&sched, peer_hex, round_start) {\r\n                if let Some(addr) =\r\n                    resolve_submit_addr(&resolver, peer_hex, &paths.peer_addrs, &ctx.policy.roster)\r\n                {\r\n                    match brain.submit_dial(addr) {\r\n                        Ok(()) => {\r\n                            pending.insert(peer_hex.clone());\r\n                        }\r\n                        // A raw carrier-op TimedOut on the submit IPC itself is a\r\n                        // genuine broker-IPC desync → bubble → supervised restart.\r\n                        Err(e) if e.kind() == io::ErrorKind::TimedOut => return Err(e),\r\n                        // The broker refused the submit (net disabled / bad addr):\r\n                        // an ordinary per-peer failure — back off, round continues.\r\n                        Err(e) => {\r\n                            eprintln!(\r\n                                \"PUMP_PEER_FAIL:{peer_hex}:{e} wall_ms={} mono_ms={}\",\r\n                                now_ms(),\r\n                                mono_ms()\r\n                            );\r\n                            health.note_failed(peer_hex, \"submit\", conns.len(), now_ms());\r\n                            let prev = sched.get(peer_hex).copied();\r\n                            sched.insert(peer_hex.clone(), next_peer_backoff(prev, round_start));\r\n                        }\r\n                    }\r\n                } else {\r\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\r\n                    // `address-resolution`). Transition-logged: the first\r\n                    // unroutable round per peer is loud, repeats are quiet —\r\n                    // the peer retries on its own cadence like before.\r\n                    if health.note_failed(\r\n                        peer_hex,\r\n                        crate::seedproofx::STAGE_RESOLVE,\r\n                        conns.len(),\r\n                        now_ms(),\r\n                    ) {\r\n                        eprintln!(\r\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\r\n                            crate::seedproofx::STAGE_RESOLVE,\r\n                            now_ms(),\r\n                            mono_ms()\r\n                        );\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Drain dial outcomes on the DEDICATED event carrier until the round\r\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\r\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\r\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\r\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\r\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\r\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\r\n        // restarts the pump; a dead PEER never does).\r\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\r\n        loop {\r\n            let read_deadline = if pending.is_empty() {\r\n                Instant::now() // no outstanding submits — sweep only what is queued\r\n            } else {\r\n                round_deadline\r\n            };\r\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\r\n                DrainStep::Apply(ev) => handle_presence_event(\r\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\r\n                )?,\r\n                DrainStep::Skip => continue, // the event carrier only carries presence\r\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\r\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\r\n            }\r\n        }\r\n\r\n        // Persist the round's reachability truth for the status surfaces\r\n        // (REQ-PUMP-STAGE-TRUTH: the acceptance surface of this contract).\r\n        health.save_to(&health_path);\r\n\r\n        // Mark-after-round with a POST-round instant (ADR-0018 §V4: the\r\n        // stagger — ran = ATTEMPTED, not succeeded; the next due is measured\r\n        // from here, not from the round's start).\r\n        mark_ran(&mut last, &due_flags, Instant::now());\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Compute each worker's due flag for this tick (the pure scheduler step):\r\n/// poll EVERY worker's wake first — even a not-otherwise-due leg, so a marker\r\n/// is never stranded — then the [`due`] kernel over its RAM-only last-ran\r\n/// instant. Returns the per-worker flags (parallel to `workers`) and whether\r\n/// ANY leg is due (an all-idle tick sleeps without loading a round).\r\nfn compute_due(\r\n    workers: &mut [&mut dyn PumpWorker],\r\n    last: &[Option<Instant>],\r\n    now: Instant,\r\n) -> (Vec<bool>, bool) {\r\n    let mut flags = vec![false; workers.len()];\r\n    let mut any = false;\r\n    for i in 0..workers.len() {\r\n        let wake = workers[i].poll_wake();\r\n        flags[i] = due(last[i], wake, now, workers[i].cadence());\r\n        any |= flags[i];\r\n    }\r\n    (flags, any)\r\n}\r\n\r\n/// Run each due worker's node-local `pre_round` ONCE for the round, before any\r\n/// peer_step (the registry sweep + advertise; the other legs default no-op).\r\nfn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\r\n    for i in 0..workers.len() {\r\n        if due_flags[i] {\r\n            workers[i].pre_round(ctx);\r\n        }\r\n    }\r\n}\r\n\r\n/// Run `step` for each due worker index in fan-out order, aborting on the\r\n/// FIRST error (abort-on-first-fail — the caller drops the peer's conn and\r\n/// redials next tick). The peer-step IO itself lives in `step`; this is the\r\n/// pure ordering/abort kernel, so the choreography is a unit fact.\r\nfn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {\r\n    for (i, &is_due) in due_flags.iter().enumerate() {\r\n        if is_due {\r\n            step(i)?;\r\n        }\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — SUPERSEDES\r\n/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its\r\n/// carrier-desync→restart path. `Ok` keeps the conn. An ORDINARY error (including\r\n/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\r\n/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\r\n/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\r\n/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\r\n/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\r\n/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\r\n/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\r\n/// does (the decouple W2 delivers).\r\n// [impl->REQ-PUMP-PEER-ISOLATION]\r\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\nfn peer_leg_outcome(\r\n    result: io::Result<()>,\r\n    peer_hex: &str,\r\n    conns: &mut HashMap<String, u64>,\r\n    sched: &mut HashMap<String, PeerSched>,\r\n    now: Instant,\r\n) -> io::Result<()> {\r\n    match result {\r\n        Ok(()) => Ok(()),\r\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => Err(e), // carrier desync → restart\r\n        Err(e) => {\r\n            eprintln!(\"PUMP_PEER_FAIL:{peer_hex}:{e}\");\r\n            conns.remove(peer_hex); // ordinary per-peer failure → drop conn\r\n            let prev = sched.get(peer_hex).copied();\r\n            sched.insert(peer_hex.to_string(), next_peer_backoff(prev, now)); // + back off (Q3)\r\n            Ok(())\r\n        }\r\n    }\r\n}\r\n\r\n/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\r\n/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\r\n/// after each — an ordinary failure drops the conn + backs the peer off and stops\r\n/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\r\n/// Each worker mints its open-ops only through the shell-owned [`PeerIo`].\r\n// [impl->REQ-PUMP-PEER-ISOLATION]\r\n#[allow(clippy::too_many_arguments)]\r\nfn run_peer_subnets(\r\n    brain: &mut Brain,\r\n    ops: &mut EpochSource,\r\n    workers: &mut [&mut dyn PumpWorker],\r\n    due_flags: &[bool],\r\n    conns: &mut HashMap<String, u64>,\r\n    sched: &mut HashMap<String, PeerSched>,\r\n    conn_id: u64,\r\n    subs: &[String],\r\n    peer_hex: &str,\r\n    ctx: &RoundCtx,\r\n    now: Instant,\r\n) -> io::Result<()> {\r\n    for sub_name in subs {\r\n        let outcome = run_due(due_flags, |i| {\r\n            let mut io = PeerIo {\r\n                brain: &mut *brain,\r\n                conn_id,\r\n                ops: &mut *ops,\r\n            };\r\n            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\r\n        });\r\n        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\r\n        if !conns.contains_key(peer_hex) {\r\n            break; // an ordinary failure dropped the conn — redial a later round\r\n        }\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).\r\n/// `CONNECTED` → cache the conn, RESET the peer's backoff, seed the observed addr\r\n/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in\r\n/// THIS round (advertise the round it connects — no head-of-line block by the dead\r\n/// peers). `DIAL_FAILED` → back the peer off (G5), log the ordinary per-peer\r\n/// signal, and drop the stale seed (REQ-CONV-1 self-heal → next round re-resolves\r\n/// via discovery). `DISCONNECTED` → drop the cached conn, NO backoff (redial-\r","truncated":true,"truncatedBy":"lines","totalLines":1556,"totalBytes":18628,"outputLines":355,"outputBytes":18628,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl PeerIo<'_> {\n…\n    /// Mint the next durable open-op from the pump's sole counter (exactly-once\r\n    /// open identity — a restart can never reuse one), tagged with the `pump`\r\n    /// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,\r\n    /// so its ops namespace under `pump` and never collide with cli/rc/shell ops.\r\n    fn open_op(&mut self) -> io::Result<MintedOp> {\r\n        Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))\r\n    }\r\n}\r\n\r\n/// Run the pump until `stop` is set. Owns one brain IPC connection and a\r\n/// per-peer connection cache (an IO failure against a peer drops its cache\r\n/// row; the next tick redials — conns are rebuilt freely, nothing leaks\r\n/// because the broker's closed-watcher reaps dead conns).\r\n///\r\n/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):\r\n/// heartbeat → poll every worker's wake → the [`due`] kernel → each due\r\n/// worker's `pre_round` (once, before any peer_step) → per-subnet × per-peer\r\n/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\r\n/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\r\n/// logic lives here — the shell owns only *when* and *toward whom*.\r\npub fn run_peer_pump(\r\n    broker_name: &str,\r\n    registry: Arc<RegistryHost>,\r\n    paths: &PumpPaths,\r\n    resolver: PeerResolver,\r\n    config: PumpConfig,\r\n    hooks: PumpHooks,\r\n    stop: &AtomicBool,\r\n) -> io::Result<()> {\r\n    let PumpConfig {\r\n        cadence,\r\n        full_auto_update,\r\n    } = config;\r\n    // PUMP MODE: a brain whose carrier is SPLIT at construction (reader thread +\r\n    // channel) so every reply read is bounded by PUMP_PEER_IO_TIMEOUT — a\r\n    // black-holed peer can never wedge this single-threaded loop (the 2.2h\r\n    // hfenduleam stall). A timed-out read escalates to a supervised restart\r\n    // below, never a per-peer retry (REQ-HAZARD-PUMP-IPC-DEADLINE).\r\n    // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n    let mut brain = connect(broker_name)?;\r\n    // The DEDICATED event-drain carrier (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION):\r\n    // a SECOND pump-mode brain that OWNS the presence subscription. It is split\r\n    // from `brain` deliberately — `brain` runs the per-peer `peer_step` pulls\r\n    // whose reply-reads consume every event kind off their carrier; sharing one\r\n    // carrier would make a pull-read swallow a presence frame (advancing the\r\n    // exactly-once cursor while dropping the outcome — the D4c break). Two\r\n    // carriers keep the drain and the pulls from swallowing each other by\r\n    // construction. Tail-follow (no history replay, baseline on first live event)\r\n    // so a long-lived broker's evicted ring can never gap-trip a false restart.\r\n    let mut events = connect(broker_name)?;\r\n    events.net_presence_subscribe_tail()?;\r\n    // Startup reconcile + invariant migration (ADR-0039 Decisions 3+4,\r\n    // REQ-PEER-ROUTE-CHAIN / REQ-PEERADDR-INVARIANT): validated roster\r\n    // addresses reconcile into the dial cache BEFORE the first round —\r\n    // recovery is connection-independent (a node restarted mid-strand heals\r\n    // here, no operator surgery) — and rows violating `outer key ==\r\n    // address.id` are repaired from the roster or dropped loudly (the first\r\n    // post-upgrade load is the migration; the file is never bare-deleted —\r\n    // valid rows and the id-only fallback behind them stay untouched).\r\n    // Idempotent, so re-running on every supervised pump restart is free.\r\n    startup_reconcile_peeraddrs(paths, registry.node_hex());\r\n    // Reachability health (ADR-0039 Decision 5, REQ-PUMP-STAGE-TRUTH): loaded\r\n    // so the last-good stamps survive a restart; the live counts re-prime as\r\n    // rounds run. Persisted beside the heartbeat; the status CLI reads it.\r\n    let health_path = PumpHealth::path_beside(&paths.heartbeat);\r\n    let mut health = PumpHealth::load_from(&health_path);\r\n    health.note_disconnected(0); // no conns exist yet in this pump generation\r\n    let mut ops = EpochSource::load_from(&paths.ops);\r\n    // The live per-peer connection cache (updated by presence events) + the\r\n    // per-peer dial schedule (G5 backoff). Both RAM-only, re-primed on restart.\r\n    let mut conns: HashMap<String, u64> = HashMap::new();\r\n    let mut sched: HashMap<String, PeerSched> = HashMap::new();\r\n    // The four cadenced legs behind the worker seam, in fan-out order\r\n    // (registry → notif → sync → update). The shell drives them generically;\r\n    // each leg's *what* lives in its module (§Frozen). Construction capture\r\n    // (§Frozen-4): each worker owns the registry Arc / path slices / config\r\n    // knob it needs — the sync worker additionally owns the conflict-surface\r\n    // hooks (ADR-0013).\r\n    let mut registry_worker = RegistryWorker::new(Arc::clone(&registry), paths, &cadence);\r\n    let mut notif_worker = NotifWorker::new(paths, &cadence);\r\n    let mut sync_worker = SyncWorker::new(Arc::clone(&registry), paths, &cadence, hooks);\r\n    let mut update_worker = UpdateWorker::new(Arc::clone(&registry), paths, &cadence, full_auto_update);\r\n    let mut workers: [&mut dyn PumpWorker; 4] = [\r\n        &mut registry_worker,\r\n        &mut notif_worker,\r\n        &mut sync_worker,\r\n        &mut update_worker,\r\n    ];\r\n    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\r\n    // `workers`. `None` = never run yet → due immediately, so the first tick\r\n    // primes every leg. Never `Instant - Duration` — the underflow panic on a\r\n    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\r\n    let mut last: [Option<Instant>; 4] = [None; 4];\r\n    let mut last_hb: Option<Instant> = None;\r\n\r\n    while !stop.load(Ordering::Relaxed) {\r\n        let now = Instant::now();\r\n        // Shell-owned liveness heartbeat (M8 decision 23, REQ-DAEMON-5): written\r\n        // while the loop is ALIVE — including idle ticks — never per work round,\r\n        // so a wedged step and a healthy quiet pump are distinguishable.\r\n        // Throttled; per-tick, never a worker (REQ-DAEMON-5), no wake.\r\n        // [impl->REQ-DAEMON-5]\r\n        if due(last_hb, false, now, HEARTBEAT_PERIOD) {\r\n            write_heartbeat(&paths.heartbeat);\r\n            last_hb = Some(now);\r\n        }\r\n        // Poll every worker's wake and decide due (the pure scheduler step):\r\n        // every wake is consumed EVERY tick so a marker is never stranded (the\r\n        // registry advertise-now, REQ-CONV-2; the sync freshness pull,\r\n        // REQ-INST-3). The take IS the remove — one wake claims exactly one\r\n        // forced round.\r\n        let (due_flags, any_due) = compute_due(&mut workers, &last, now);\r\n        if !any_due {\r\n            thread::sleep(TICK);\r\n            continue;\r\n        }\r\n\r\n        // Per-round shared loads (§Frozen-3): subnets / attachment /\r\n        // roster-backed policy, read ONCE and handed to every worker.\r\n        let ctx = RoundCtx::load(paths);\r\n\r\n        // Each due worker's node-local pre_round, once per round before ANY\r\n        // peer_step (only the registry leg does work here — its sweep +\r\n        // advertise; the rest default to a no-op).\r\n        pre_rounds(&mut workers, &due_flags, &ctx);\r\n\r\n        // ── PUMP-TRUTH W2 round (REQ-PUMP-PEER-ISOLATION) — concurrent dials +\r\n        // per-peer fault isolation. Group this round's fan-out targets by peer (a\r\n        // peer may target several subnets; one conn serves them all).\r\n        let mut peer_subnets: HashMap<String, Vec<String>> = HashMap::new();\r\n        for (sub_name, peer_hex) in fan_targets(&ctx, registry.node_hex()) {\r\n            peer_subnets.entry(peer_hex).or_default().push(sub_name);\r\n        }\r\n        // Health targets = this round's fan-out set; snapshot the registry\r\n        // host's last-admitted stamp while here (REQ-PUMP-STAGE-TRUTH).\r\n        health.set_targets(peer_subnets.keys().cloned(), now_ms());\r\n        health.note_registry_admit(registry.last_admit_ms());\r\n        let round_start = Instant::now();\r\n        let mut pending: HashSet<String> = HashSet::new();\r\n\r\n        // Submit NON-BLOCKING dials for eligible unconnected peers; run the due\r\n        // legs NOW for already-connected ones. The live peer advertises without\r\n        // waiting on a dead one (no head-of-line block) — a dead peer is only a\r\n        // pending outcome, never a serial blocker.\r\n        for (peer_hex, subs) in &peer_subnets {\r\n            if let Some(&conn_id) = conns.get(peer_hex) {\r\n                run_peer_subnets(\r\n                    &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    conn_id, subs, peer_hex, &ctx, round_start,\r\n                )?;\r\n            } else if peer_eligible(&sched, peer_hex, round_start) {\r\n                if let Some(addr) =\r\n                    resolve_submit_addr(&resolver, peer_hex, &paths.peer_addrs, &ctx.policy.roster)\r\n                {\r\n                    match brain.submit_dial(addr) {\r\n                        Ok(()) => {\r\n                            pending.insert(peer_hex.clone());\r\n                        }\r\n                        // A raw carrier-op TimedOut on the submit IPC itself is a\r\n                        // genuine broker-IPC desync → bubble → supervised restart.\r\n                        Err(e) if e.kind() == io::ErrorKind::TimedOut => return Err(e),\r\n                        // The broker refused the submit (net disabled / bad addr):\r\n                        // an ordinary per-peer failure — back off, round continues.\r\n                        Err(e) => {\r\n                            eprintln!(\r\n                                \"PUMP_PEER_FAIL:{peer_hex}:{e} wall_ms={} mono_ms={}\",\r\n                                now_ms(),\r\n                                mono_ms()\r\n                            );\r\n                            health.note_failed(peer_hex, \"submit\", conns.len(), now_ms());\r\n                            let prev = sched.get(peer_hex).copied();\r\n                            sched.insert(peer_hex.clone(), next_peer_backoff(prev, round_start));\r\n                        }\r\n                    }\r\n                } else {\r\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\r\n                    // `address-resolution`). Transition-logged: the first\r\n                    // unroutable round per peer is loud, repeats are quiet —\r\n                    // the peer retries on its own cadence like before.\r\n                    if health.note_failed(\r\n                        peer_hex,\r\n                        crate::seedproofx::STAGE_RESOLVE,\r\n                        conns.len(),\r\n                        now_ms(),\r\n                    ) {\r\n                        eprintln!(\r\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\r\n                            crate::seedproofx::STAGE_RESOLVE,\r\n                            now_ms(),\r\n                            mono_ms()\r\n                        );\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Drain dial outcomes on the DEDICATED event carrier until the round\r\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\r\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\r\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\r\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\r\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\r\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\r\n        // restarts the pump; a dead PEER never does).\r\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\r\n        loop {\r\n            let read_deadline = if pending.is_empty() {\r\n                Instant::now() // no outstanding submits — sweep only what is queued\r\n            } else {\r\n                round_deadline\r\n            };\r\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\r\n                DrainStep::Apply(ev) => handle_presence_event(\r\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\r\n                )?,\r\n                DrainStep::Skip => continue, // the event carrier only carries presence\r\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\r\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\r\n            }\r\n        }\r\n\r\n        // Persist the round's reachability truth for the status surfaces\r\n        // (REQ-PUMP-STAGE-TRUTH: the acceptance surface of this contract).\r\n        health.save_to(&health_path);\r\n\r\n        // Mark-after-round with a POST-round instant (ADR-0018 §V4: the\r\n        // stagger — ran = ATTEMPTED, not succeeded; the next due is measured\r\n        // from here, not from the round's start).\r\n        mark_ran(&mut last, &due_flags, Instant::now());\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Compute each worker's due flag for this tick (the pure scheduler step):\r\n/// poll EVERY worker's wake first — even a not-otherwise-due leg, so a marker\r\n/// is never stranded — then the [`due`] kernel over its RAM-only last-ran\r\n/// instant. Returns the per-worker flags (parallel to `workers`) and whether\r\n/// ANY leg is due (an all-idle tick sleeps without loading a round).\r\nfn compute_due(\r\n    workers: &mut [&mut dyn PumpWorker],\r\n    last: &[Option<Instant>],\r\n    now: Instant,\r\n) -> (Vec<bool>, bool) {\r\n    let mut flags = vec![false; workers.len()];\r\n    let mut any = false;\r\n    for i in 0..workers.len() {\r\n        let wake = workers[i].poll_wake();\r\n        flags[i] = due(last[i], wake, now, workers[i].cadence());\r\n        any |= flags[i];\r\n    }\r\n    (flags, any)\r\n}\r\n\r\n/// Run each due worker's node-local `pre_round` ONCE for the round, before any\r\n/// peer_step (the registry sweep + advertise; the other legs default no-op).\r\nfn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {\r\n    for i in 0..workers.len() {\r\n        if due_flags[i] {\r\n            workers[i].pre_round(ctx);\r\n        }\r\n    }\r\n}\r\n\r\n/// Run `step` for each due worker index in fan-out order, aborting on the\r\n/// FIRST error (abort-on-first-fail — the caller drops the peer's conn and\r\n/// redials next tick). The peer-step IO itself lives in `step`; this is the\r\n/// pure ordering/abort kernel, so the choreography is a unit fact.\r\nfn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {\r\n    for (i, &is_due) in due_flags.iter().enumerate() {\r\n        if is_due {\r\n            step(i)?;\r\n        }\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) — SUPERSEDES\r\n/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its\r\n/// carrier-desync→restart path. `Ok` keeps the conn. An ORDINARY error (including\r\n/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of\r\n/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT\r\n/// conn + back the peer off (Q3 — a mid-round `peer_step` fail isolates exactly\r\n/// like a `DIAL_FAILED`, never round-wide), the round continues, the heartbeat\r\n/// advances. A genuine broker-IPC-CARRIER desync — a raw `TimedOut` (the carrier\r\n/// ops `net_open_stream` / `subscribe` / `send` keep it) — STILL bubbles `Err` to\r\n/// a SUPERVISED RESTART: a dead BROKER conn restarts the pump; a dead PEER never\r\n/// does (the decouple W2 delivers).\r\n// [impl->REQ-PUMP-PEER-ISOLATION]\r\n// [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\nfn peer_leg_outcome(\r\n    result: io::Result<()>,\r\n    peer_hex: &str,\r\n    conns: &mut HashMap<String, u64>,\r\n    sched: &mut HashMap<String, PeerSched>,\r\n    now: Instant,\r\n) -> io::Result<()> {\r\n    match result {\r\n        Ok(()) => Ok(()),\r\n        Err(e) if e.kind() == io::ErrorKind::TimedOut => Err(e), // carrier desync → restart\r\n        Err(e) => {\r\n            eprintln!(\"PUMP_PEER_FAIL:{peer_hex}:{e}\");\r\n            conns.remove(peer_hex); // ordinary per-peer failure → drop conn\r\n            let prev = sched.get(peer_hex).copied();\r\n            sched.insert(peer_hex.to_string(), next_peer_backoff(prev, now)); // + back off (Q3)\r\n            Ok(())\r\n        }\r\n    }\r\n}\r\n\r\n/// Run every due worker's `peer_step` for a CONNECTED peer across all subnets it\r\n/// targets this round (one conn serves them all), applying [`peer_leg_outcome`]\r\n/// after each — an ordinary failure drops the conn + backs the peer off and stops\r\n/// this peer's remaining legs; a carrier desync bubbles to a supervised restart.\r\n/// Each worker mints its open-ops only through the shell-owned [`PeerIo`].\r\n// [impl->REQ-PUMP-PEER-ISOLATION]\r\n#[allow(clippy::too_many_arguments)]\r\nfn run_peer_subnets(\r\n    brain: &mut Brain,\r\n    ops: &mut EpochSource,\r\n    workers: &mut [&mut dyn PumpWorker],\r\n    due_flags: &[bool],\r\n    conns: &mut HashMap<String, u64>,\r\n    sched: &mut HashMap<String, PeerSched>,\r\n    conn_id: u64,\r\n    subs: &[String],\r\n    peer_hex: &str,\r\n    ctx: &RoundCtx,\r\n    now: Instant,\r\n) -> io::Result<()> {\r\n    for sub_name in subs {\r\n        let outcome = run_due(due_flags, |i| {\r\n            let mut io = PeerIo {\r\n                brain: &mut *brain,\r\n                conn_id,\r\n                ops: &mut *ops,\r\n            };\r\n            workers[i].peer_step(&mut io, sub_name, peer_hex, ctx)\r\n        });\r\n        peer_leg_outcome(outcome, peer_hex, conns, sched, now)?;\r\n        if !conns.contains_key(peer_hex) {\r\n            break; // an ordinary failure dropped the conn — redial a later round\r\n        }\r\n    }\r\n    Ok(())\r\n}\r\n\r\n/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).\r\n/// `CONNECTED` → cache the conn, RESET the peer's backoff, seed the observed addr\r\n/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in\r\n/// THIS round (advertise the round it connects — no head-of-line block by the dead\r\n/// peers). `DIAL_FAILED` → back the peer off (G5), log the ordinary per-peer\r\n/// signal, and drop the stale seed (REQ-CONV-1 self-heal → next round re-resolves\r\n/// via discovery). `DISCONNECTED` → drop the cached conn, NO backoff (redial-\r","startLine":492,"lineNumbers":[492,null,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2054,"totalBytes":18628,"outputLines":355,"outputBytes":18628,"shownRange":{"start":499,"end":853},"nextOffset":854}}},"isError":false,"timestamp":1784293163209}}
{"type":"message","id":"d122b57b","parentId":"37c0b71f","timestamp":"2026-07-17T12:59:23.223Z","message":{"role":"toolResult","toolCallId":"call_q4a95XXJcvsCs7AeTpOYQFHR|fc_034a6be5a6696b6c016a5a272ab9c88191939b4fd34f4ea5cc","toolName":"read","content":[{"type":"text","text":"fn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {\n    for id in perch::list_self_perch_ids(owlery) {\n…\n        for entry in entries.flatten() {\n…\n            if name == \".live-bin\" {\n                let displaced = fresh_live_bin_old(&dir);\n                match std::fs::rename(&dir, &displaced) {\n                    Ok(()) => {\n                        let _ = remove(&displaced);\n                    }\n                    Err(e) => eprintln!(\n                        \"LIVE_BIN_GC_DECLINE:{id}: {e} (image-locked, left in place — retried next boot)\"\n                    ),\n                }\n            }\n        }\n    }\n}\n\n/// A fresh, non-colliding `.live-bin.old[-N]` sibling of a `.live-bin` dir (mirrors\n/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).\nfn fresh_live_bin_old(live_bin: &Path) -> PathBuf {\n    let base = live_bin.with_file_name(\".live-bin.old\");\n    if !base.exists() {\n        return base;\n    }\n    for n in 1u64.. {\n        let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));\n        if !candidate.exists() {\n            return candidate;\n        }\n    }\n    unreachable!(\"an unbounded search for a free .live-bin.old-N name always terminates\")\n}\n\n/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\n/// config are re-read each sweep (adapter / pulse-period changes land between\n/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\n/// for symmetry — the threads die with the brain process and the next brain\n/// rehydrates from disk.\n// [impl->REQ-DAEMON-1]\npub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        let set = Arc::new(LiveSet::new());\n        {\n            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n            // BEFORE the first reconcile, bury any pre-W3 psyche WRAPPER a cross-version\n            // upgrade left ALIVE-but-hung (it registered its `<id>-psyche` ready perch then\n            // blocked forever on `spt ready --once`; the per-event driver never delivers to\n            // it). Fires exactly once at brain start (never per-reconcile) — the retired\n            // residency machinery's corpse-burial, not its resurrection.\n            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            sweep_legacy_resident_psyches(&owlery, &registered, &adapters_dir);\n            // F-030 W5 ONE-SHOT `.live-bin` GC — ORDERED AFTER the sweep so any wrapper\n            // running FROM the own-copy image is killed first (its dir then unlocks).\n            gc_live_bin_dirs(&owlery);\n            // LIFECYCLE-TRUTH W3 ONE-SHOT daemon-restart endpoint survival\n            // (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL): re-run the harness of every\n            // previously-ONLINE spt-hosted endpoint this (re)start orphaned, BEFORE the\n            // reconcile loop's phantom-clear offlines the stale-online records (the \"was\n            // online\" signal). A brain restart with a surviving broker re-runs nothing\n            // (its sessions are live, not orphaned). Belts inside the gate.\n            // [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\n            resume_restart_orphaned_endpoints(&owlery, &registered, &adapters_dir);\n        }\n        while !stop.load(Ordering::SeqCst) {\n            // TEST-ONLY gate `SPT_LIVEHOST_RECONCILE_DISABLE` (runtime env, DEFAULT\n            // unset = normal production, untouched): skip the reconcile poll+body so an\n            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\n            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\n            // 30s kill, so it never drove the reap) — the exact failure mode the fix\n            // makes the wedge-reap independent of. Runtime env (not cfg(test)): the rig\n            // spawns a real release `spt daemon brain` child cfg(test) can't reach — the\n            // SPT_BRAIN_WRITE_DEADLINE_MS precedent. Still honors `stop` on a tight tick.\n            // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\n            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\n                std::thread::sleep(Duration::from_millis(100));\n                continue;\n            }\n            let owlery = perch::owlery_dir();\n            let adapters_dir = perch::adapters_dir();\n            let registered = spt_runtime::registry::registered(&adapters_dir);\n            let cfg = DaemonConfig::load();\n            // B2 keystone (REQ-HAZARD-HOSTED-LIVENESS-RECONCILE) + B5 boot-gate\n            // (REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE): clear the status=online\n            // latch for any spt-hosted endpoint whose broker session is gone — and\n            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\n            // so the same-tick stop-side un-hosts the now-offline perch and the\n            // start-side never REVIVES its Psyche. The boot-gate is what stops a\n            // cold start after an unclean stop from spawning N phantom Psyches for N\n            // dead-but-latched perches. Skipped only when the broker is unreachable\n            // (None) — never mass-offline on a hiccup; safe at tick 1 because\n            // run_brain connects to the broker BEFORE this host spawns, so the query\n            // returns the REAL session set: empty at a cold start (every online\n            // controllable perch is a phantom → offlined), the surviving sessions at\n            // a brain restart (live agents stay, only the dead are offlined). The\n            // controllable==Some(true) gate inside keeps relay/legacy perches exempt.\n            // [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\n            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\n            if let Some(live) = query_live_session_endpoints() {\n                reconcile_hosted_liveness(&owlery, &live);\n            }\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n            // Sleep in slices so a stop lands promptly.\n            let mut left = LIVE_RECONCILE_INTERVAL_MS;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n    use std::time::{Duration, Instant};\n\n    // A no-op Psyche summarizer command: spawns + exits 0 (we never depend on its\n…\n}\n\n[Showing lines 999-1123 of 2333. Use :1124 to continue]"}],"details":{"truncation":{"content":"            if name == \".live-bin\" {\r\n                let displaced = fresh_live_bin_old(&dir);\r\n                match std::fs::rename(&dir, &displaced) {\r\n                    Ok(()) => {\r\n                        let _ = remove(&displaced);\r\n                    }\r\n                    Err(e) => eprintln!(\r\n                        \"LIVE_BIN_GC_DECLINE:{id}: {e} (image-locked, left in place — retried next boot)\"\r\n                    ),\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/// A fresh, non-colliding `.live-bin.old[-N]` sibling of a `.live-bin` dir (mirrors\r\n/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).\r\nfn fresh_live_bin_old(live_bin: &Path) -> PathBuf {\r\n    let base = live_bin.with_file_name(\".live-bin.old\");\r\n    if !base.exists() {\r\n        return base;\r\n    }\r\n    for n in 1u64.. {\r\n        let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));\r\n        if !candidate.exists() {\r\n            return candidate;\r\n        }\r\n    }\r\n    unreachable!(\"an unbounded search for a free .live-bin.old-N name always terminates\")\r\n}\r\n\r\n/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\r\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\r\n/// config are re-read each sweep (adapter / pulse-period changes land between\r\n/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\r\n/// for symmetry — the threads die with the brain process and the next brain\r\n/// rehydrates from disk.\r\n// [impl->REQ-DAEMON-1]\r\npub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        let set = Arc::new(LiveSet::new());\r\n        {\r\n            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\r\n            // BEFORE the first reconcile, bury any pre-W3 psyche WRAPPER a cross-version\r\n            // upgrade left ALIVE-but-hung (it registered its `<id>-psyche` ready perch then\r\n            // blocked forever on `spt ready --once`; the per-event driver never delivers to\r\n            // it). Fires exactly once at brain start (never per-reconcile) — the retired\r\n            // residency machinery's corpse-burial, not its resurrection.\r\n            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\n            let owlery = perch::owlery_dir();\r\n            let adapters_dir = perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            sweep_legacy_resident_psyches(&owlery, &registered, &adapters_dir);\r\n            // F-030 W5 ONE-SHOT `.live-bin` GC — ORDERED AFTER the sweep so any wrapper\r\n            // running FROM the own-copy image is killed first (its dir then unlocks).\r\n            gc_live_bin_dirs(&owlery);\r\n            // LIFECYCLE-TRUTH W3 ONE-SHOT daemon-restart endpoint survival\r\n            // (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL): re-run the harness of every\r\n            // previously-ONLINE spt-hosted endpoint this (re)start orphaned, BEFORE the\r\n            // reconcile loop's phantom-clear offlines the stale-online records (the \"was\r\n            // online\" signal). A brain restart with a surviving broker re-runs nothing\r\n            // (its sessions are live, not orphaned). Belts inside the gate.\r\n            // [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\r\n            resume_restart_orphaned_endpoints(&owlery, &registered, &adapters_dir);\r\n        }\r\n        while !stop.load(Ordering::SeqCst) {\r\n            // TEST-ONLY gate `SPT_LIVEHOST_RECONCILE_DISABLE` (runtime env, DEFAULT\r\n            // unset = normal production, untouched): skip the reconcile poll+body so an\r\n            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\r\n            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\r\n            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\r\n            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\r\n            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\r\n            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\r\n            // 30s kill, so it never drove the reap) — the exact failure mode the fix\r\n            // makes the wedge-reap independent of. Runtime env (not cfg(test)): the rig\r\n            // spawns a real release `spt daemon brain` child cfg(test) can't reach — the\r\n            // SPT_BRAIN_WRITE_DEADLINE_MS precedent. Still honors `stop` on a tight tick.\r\n            // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\r\n                std::thread::sleep(Duration::from_millis(100));\r\n                continue;\r\n            }\r\n            let owlery = perch::owlery_dir();\r\n            let adapters_dir = perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            let cfg = DaemonConfig::load();\r\n            // B2 keystone (REQ-HAZARD-HOSTED-LIVENESS-RECONCILE) + B5 boot-gate\r\n            // (REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE): clear the status=online\r\n            // latch for any spt-hosted endpoint whose broker session is gone — and\r\n            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\r\n            // so the same-tick stop-side un-hosts the now-offline perch and the\r\n            // start-side never REVIVES its Psyche. The boot-gate is what stops a\r\n            // cold start after an unclean stop from spawning N phantom Psyches for N\r\n            // dead-but-latched perches. Skipped only when the broker is unreachable\r\n            // (None) — never mass-offline on a hiccup; safe at tick 1 because\r\n            // run_brain connects to the broker BEFORE this host spawns, so the query\r\n            // returns the REAL session set: empty at a cold start (every online\r\n            // controllable perch is a phantom → offlined), the surviving sessions at\r\n            // a brain restart (live agents stay, only the dead are offlined). The\r\n            // controllable==Some(true) gate inside keeps relay/legacy perches exempt.\r\n            // [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\r\n            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\r\n            if let Some(live) = query_live_session_endpoints() {\r\n                reconcile_hosted_liveness(&owlery, &live);\r\n            }\r\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\r\n            // Sleep in slices so a stop lands promptly.\r\n            let mut left = LIVE_RECONCILE_INTERVAL_MS;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use std::time::{Duration, Instant};\r\n\r\n    // A no-op Psyche summarizer command: spawns + exits 0 (we never depend on its\r","truncated":true,"truncatedBy":"lines","totalLines":1335,"totalBytes":7196,"outputLines":125,"outputBytes":7196,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {\n    for id in perch::list_self_perch_ids(owlery) {\n…\n        for entry in entries.flatten() {\n…\n            if name == \".live-bin\" {\r\n                let displaced = fresh_live_bin_old(&dir);\r\n                match std::fs::rename(&dir, &displaced) {\r\n                    Ok(()) => {\r\n                        let _ = remove(&displaced);\r\n                    }\r\n                    Err(e) => eprintln!(\r\n                        \"LIVE_BIN_GC_DECLINE:{id}: {e} (image-locked, left in place — retried next boot)\"\r\n                    ),\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/// A fresh, non-colliding `.live-bin.old[-N]` sibling of a `.live-bin` dir (mirrors\r\n/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).\r\nfn fresh_live_bin_old(live_bin: &Path) -> PathBuf {\r\n    let base = live_bin.with_file_name(\".live-bin.old\");\r\n    if !base.exists() {\r\n        return base;\r\n    }\r\n    for n in 1u64.. {\r\n        let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));\r\n        if !candidate.exists() {\r\n            return candidate;\r\n        }\r\n    }\r\n    unreachable!(\"an unbounded search for a free .live-bin.old-N name always terminates\")\r\n}\r\n\r\n/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot\r\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +\r\n/// config are re-read each sweep (adapter / pulse-period changes land between\r\n/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held\r\n/// for symmetry — the threads die with the brain process and the next brain\r\n/// rehydrates from disk.\r\n// [impl->REQ-DAEMON-1]\r\npub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        let set = Arc::new(LiveSet::new());\r\n        {\r\n            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\r\n            // BEFORE the first reconcile, bury any pre-W3 psyche WRAPPER a cross-version\r\n            // upgrade left ALIVE-but-hung (it registered its `<id>-psyche` ready perch then\r\n            // blocked forever on `spt ready --once`; the per-event driver never delivers to\r\n            // it). Fires exactly once at brain start (never per-reconcile) — the retired\r\n            // residency machinery's corpse-burial, not its resurrection.\r\n            // [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\n            let owlery = perch::owlery_dir();\r\n            let adapters_dir = perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            sweep_legacy_resident_psyches(&owlery, &registered, &adapters_dir);\r\n            // F-030 W5 ONE-SHOT `.live-bin` GC — ORDERED AFTER the sweep so any wrapper\r\n            // running FROM the own-copy image is killed first (its dir then unlocks).\r\n            gc_live_bin_dirs(&owlery);\r\n            // LIFECYCLE-TRUTH W3 ONE-SHOT daemon-restart endpoint survival\r\n            // (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL): re-run the harness of every\r\n            // previously-ONLINE spt-hosted endpoint this (re)start orphaned, BEFORE the\r\n            // reconcile loop's phantom-clear offlines the stale-online records (the \"was\r\n            // online\" signal). A brain restart with a surviving broker re-runs nothing\r\n            // (its sessions are live, not orphaned). Belts inside the gate.\r\n            // [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\r\n            resume_restart_orphaned_endpoints(&owlery, &registered, &adapters_dir);\r\n        }\r\n        while !stop.load(Ordering::SeqCst) {\r\n            // TEST-ONLY gate `SPT_LIVEHOST_RECONCILE_DISABLE` (runtime env, DEFAULT\r\n            // unset = normal production, untouched): skip the reconcile poll+body so an\r\n            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\r\n            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\r\n            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\r\n            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\r\n            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\r\n            // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the\r\n            // 30s kill, so it never drove the reap) — the exact failure mode the fix\r\n            // makes the wedge-reap independent of. Runtime env (not cfg(test)): the rig\r\n            // spawns a real release `spt daemon brain` child cfg(test) can't reach — the\r\n            // SPT_BRAIN_WRITE_DEADLINE_MS precedent. Still honors `stop` on a tight tick.\r\n            // [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]\r\n            if std::env::var_os(\"SPT_LIVEHOST_RECONCILE_DISABLE\").is_some() {\r\n                std::thread::sleep(Duration::from_millis(100));\r\n                continue;\r\n            }\r\n            let owlery = perch::owlery_dir();\r\n            let adapters_dir = perch::adapters_dir();\r\n            let registered = spt_runtime::registry::registered(&adapters_dir);\r\n            let cfg = DaemonConfig::load();\r\n            // B2 keystone (REQ-HAZARD-HOSTED-LIVENESS-RECONCILE) + B5 boot-gate\r\n            // (REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE): clear the status=online\r\n            // latch for any spt-hosted endpoint whose broker session is gone — and\r\n            // do it from BOOT tick 1, NOT after a grace. Runs BEFORE reconcile_once\r\n            // so the same-tick stop-side un-hosts the now-offline perch and the\r\n            // start-side never REVIVES its Psyche. The boot-gate is what stops a\r\n            // cold start after an unclean stop from spawning N phantom Psyches for N\r\n            // dead-but-latched perches. Skipped only when the broker is unreachable\r\n            // (None) — never mass-offline on a hiccup; safe at tick 1 because\r\n            // run_brain connects to the broker BEFORE this host spawns, so the query\r\n            // returns the REAL session set: empty at a cold start (every online\r\n            // controllable perch is a phantom → offlined), the surviving sessions at\r\n            // a brain restart (live agents stay, only the dead are offlined). The\r\n            // controllable==Some(true) gate inside keeps relay/legacy perches exempt.\r\n            // [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\r\n            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\r\n            if let Some(live) = query_live_session_endpoints() {\r\n                reconcile_hosted_liveness(&owlery, &live);\r\n            }\r\n            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\r\n            // Sleep in slices so a stop lands promptly.\r\n            let mut left = LIVE_RECONCILE_INTERVAL_MS;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use std::time::{Duration, Instant};\r\n\r\n    // A no-op Psyche summarizer command: spawns + exits 0 (we never depend on its\r\n…\n}","startLine":975,"lineNumbers":[975,976,null,981,null,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,null,2332]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2333,"totalBytes":7196,"outputLines":125,"outputBytes":7196,"shownRange":{"start":999,"end":1123},"nextOffset":1124}}},"isError":false,"timestamp":1784293163223}}
{"type":"message","id":"41d2c9e8","parentId":"d122b57b","timestamp":"2026-07-17T12:59:33.203Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Inspecting reconcile_once complexity**"},{"type":"toolCall","id":"call_WdKurw8IuU6L5mVgCcPoW8pW|fc_034a6be5a6696b6c016a5a2734ca5c8191a231c76740549b33","name":"grep","arguments":{"i":"Locating live reconciliation body","pattern":"pub fn reconcile_once|fn reconcile_once|query_live_session_endpoints|reconcile_hosted_liveness","path":"crates/spt-daemon/src/livehost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_n5dalq3r81QepfhgFoItLGL6|fc_034a6be5a6696b6c016a5a2734ca7481918f4d78c14dcf07d6","name":"read","arguments":{"i":"Reading live reconciliation body","path":"crates/spt-daemon/src/livehost.rs","selector":"760-1000"}},{"type":"toolCall","id":"call_OwzMiDO0HR8HX7dllyvVxnR1|fc_034a6be5a6696b6c016a5a2734ca84819187ff4de9c81fa407","name":"grep","arguments":{"i":"Locating wake reconciliation body","pattern":"pub fn reconcile_once|fn reconcile_once|list_self_perch_ids|registered\\(","path":"crates/spt-daemon/src/shellwake.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_Ow7Cx8Cfs77enZzZZ09jZNiO|fc_034a6be5a6696b6c016a5a2734ca9481919f5d2ffab0073e5a","name":"read","arguments":{"i":"Reading pump workers notif sync","path":"crates/spt-daemon/src/pump/notif.rs","selector":"1-260"}},{"type":"toolCall","id":"call_T1pDRhfJt1GhUMPVHauQsJ1P|fc_034a6be5a6696b6c016a5a2734cab08191a09db1af40b3e099","name":"read","arguments":{"i":"Reading pump sync worker","path":"crates/spt-daemon/src/pump/sync.rs","selector":"1-300"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":16339,"output":306,"cacheRead":59904,"cacheWrite":0,"totalTokens":76549,"reasoningTokens":32,"cost":{"input":0.081695,"output":0.00918,"cacheRead":0.029952,"cacheWrite":0,"total":0.12082700000000002}},"stopReason":"toolUse","timestamp":1784293163263,"responseId":"resp_034a6be5a6696b6c016a5a272bade081919adf45291a499046","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a272f287c8191bf436962e3b040b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWic0dzHLKzsziv8ZI1yoHTXWx96bIpcJKWX6DsfeXnJXna_qTuhdayIcU6FU7EzJvFR5Sp7wkdb-tBFkK3f-PNuaPs09NPS6OI1_rNRH4hNosLU5uJcKEnWtE2PnMZ6nCzyvS_64jTkr1X11sgbKUtsph0bOm64v-x0iCr-VhZyZIghRAdPUmN8jc-aZeZPiKjNU1iZV7PSLtQx-Vdt17Fp51vLx3iugyDyHdlhE96HSIrKTvTXX3klrGbipTPRHcwY5EMEtMszs7Q0Q4ESSz4vNP5GfHNhsDJHLI42NQr_VA4Mk_m2a0Ecp1cdaae9ucSAvXhEU7iqICe5w-YnT4AzZB1e9Z9nOQg4CK00kCKUsO3wSYIDSphYSBepm7JYs4ByObCETV5Pv8Exq8lO4Is2iqMqLG8Ug_S-nwI7VzYqS1wmrvbTQTR9vtEiYxgXM4LeWFbhG3caGnpOHb2v4CiKU2Oo87-UoFLJK6cMgKTqdOkanxO6qffqqygsgmo7cKPCxiJepYRN6aUdKuNQenk5VEQIWq7GCVCJ5BAoeLEDdMEMLdx5RQ1mOB4bV4gqVBtK9yuyJ4K2HnAn4E9V7xwpqXOz9c4BtaPPDfNfFOsKZsS9iPJDnvXDv9I9xLccS9BO06LBk39sKjGkx_ZhC5TxDeJ17cLhgCQl2z_4IjOm4s_efKy7BsEAFa9S-l1rbWp7f5I5XrELZHpv9JXwIizurKQdB-b1mSN-OHHdWgalTVZ4mFerLZGwrb_nZw91SgladPCMDJSNA58QVuMoOtk-acqEiyiMcD_HqH6psXcKBhWG-8OTW6WA3JIchgUl9sKnERhy6vUeHDYMn21NXvNrIH_GTdk4at9uraRj5Q8wqIxrLD2USI1_90QP91vdcm5zdzbUb02E58aR6q4iiESIdALEtGlwAYdjBOZFYEtAd1kP3k-SD3K958XBfTwP9UfcINUpoRYP7fzc-Wn2YiFWoxro5NgueuqI-AXqhm-ISWnJjhi7bgV8Ut_GKoyqta2Xwi0dD4XnTcfJ9vGlUXaToD0Qyy8Zz_TfrbxzE5xSmKMPAAm2kao9OAp4q5z1_aW00uK3Vi3AFhS2axOe2DYx_7TAgaf51EiwGRSXnkQF4EPo=","summary":[{"type":"summary_text","text":"**Inspecting reconcile_once complexity**"}]},{"id":"fc_034a6be5a6696b6c016a5a2734ca5c8191a231c76740549b33","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating live reconciliation body\",\"pattern\":\"pub fn reconcile_once|fn reconcile_once|query_live_session_endpoints|reconcile_hosted_liveness\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_WdKurw8IuU6L5mVgCcPoW8pW","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a2734ca7481918f4d78c14dcf07d6","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading live reconciliation body\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":\"760-1000\"}","call_id":"call_n5dalq3r81QepfhgFoItLGL6","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a2734ca84819187ff4de9c81fa407","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating wake reconciliation body\",\"pattern\":\"pub fn reconcile_once|fn reconcile_once|list_self_perch_ids|registered\\\\(\",\"path\":\"crates/spt-daemon/src/shellwake.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_OwzMiDO0HR8HX7dllyvVxnR1","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a2734ca9481919f5d2ffab0073e5a","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump workers notif sync\",\"path\":\"crates/spt-daemon/src/pump/notif.rs\",\"selector\":\"1-260\"}","call_id":"call_Ow7Cx8Cfs77enZzZZ09jZNiO","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a2734cab08191a09db1af40b3e099","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump sync worker\",\"path\":\"crates/spt-daemon/src/pump/sync.rs\",\"selector\":\"1-300\"}","call_id":"call_T1pDRhfJt1GhUMPVHauQsJ1P","name":"read"}]},"duration":9914.740700006485,"ttft":4118.065300002694,"contextSnapshot":{"promptTokens":76243,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_WdKurw8IuU6L5mVgCcPoW8pW|fc_034a6be5a6696b6c016a5a2734ca5c8191a231c76740549b33","toolName":"grep","startedAt":"2026-07-17T12:59:33.204Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Locating live reconciliation body"},"id":"ad1a07f7","parentId":"41d2c9e8","timestamp":"2026-07-17T12:59:33.204Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_n5dalq3r81QepfhgFoItLGL6|fc_034a6be5a6696b6c016a5a2734ca7481918f4d78c14dcf07d6","toolName":"read","startedAt":"2026-07-17T12:59:33.204Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Reading live reconciliation body"},"id":"2005c2ae","parentId":"ad1a07f7","timestamp":"2026-07-17T12:59:33.204Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_OwzMiDO0HR8HX7dllyvVxnR1|fc_034a6be5a6696b6c016a5a2734ca84819187ff4de9c81fa407","toolName":"grep","startedAt":"2026-07-17T12:59:33.204Z","args":{"path":"crates/spt-daemon/src/shellwake.rs"},"intent":"Locating wake reconciliation body"},"id":"37d981c3","parentId":"2005c2ae","timestamp":"2026-07-17T12:59:33.204Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Ow7Cx8Cfs77enZzZZ09jZNiO|fc_034a6be5a6696b6c016a5a2734ca9481919f5d2ffab0073e5a","toolName":"read","startedAt":"2026-07-17T12:59:33.204Z","args":{"path":"crates/spt-daemon/src/pump/notif.rs"},"intent":"Reading pump workers notif sync"},"id":"5d9b7f12","parentId":"37d981c3","timestamp":"2026-07-17T12:59:33.204Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_T1pDRhfJt1GhUMPVHauQsJ1P|fc_034a6be5a6696b6c016a5a2734cab08191a09db1af40b3e099","toolName":"read","startedAt":"2026-07-17T12:59:33.204Z","args":{"path":"crates/spt-daemon/src/pump/sync.rs"},"intent":"Reading pump sync worker"},"id":"3e5e883f","parentId":"5d9b7f12","timestamp":"2026-07-17T12:59:33.204Z"}
{"type":"message","id":"1193c0ee","parentId":"3e5e883f","timestamp":"2026-07-17T12:59:33.208Z","message":{"role":"toolResult","toolCallId":"call_OwzMiDO0HR8HX7dllyvVxnR1|fc_034a6be5a6696b6c016a5a2734ca84819187ff4de9c81fa407","toolName":"grep","content":[{"type":"text","text":" 470|// [impl->REQ-SHELL-2]\n*471|pub fn reconcile_once(\n 472|    owlery: &Path,\n 473|    registered: &[(AdapterRecord, Manifest)],\n 474|    adapters_dir: &Path,\n...\n 494|    // Start side: every offline instance with a wake_command and headroom.\n*495|    for owner in spt_store::perch::list_self_perch_ids(owlery) {\n 496|        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\n 497|            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\n 498|                continue;\n...\n 559|            let adapters_dir = spt_store::perch::adapters_dir();\n*560|            let registered = spt_runtime::registry::registered(&adapters_dir);\n 561|            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n 562|            // Sleep in slices so a stop lands promptly.\n 563|            let mut left = RECONCILE_INTERVAL_MS;\n...\n 896|        spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();\n*897|        let registered = spt_runtime::registry::registered(&adapters_dir);\n 898|\n 899|        let id = spawn_record(owlery, \"doyle\", \"mock-wake\", None).unwrap();\n 900|        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\n...\n 974|        spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();\n*975|        let registered = spt_runtime::registry::registered(&adapters_dir);\n 976|\n 977|        // A bare-parent instance: no wake_command in the parent ⇒ never woken.\n 978|        spawn_record(owlery, \"doyle\", \"mock-wakeprof\", None).unwrap();"}],"details":{"scopePath":"crates/spt-daemon/src/shellwake.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\shellwake.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":1,"files":["crates/spt-daemon/src/shellwake.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/shellwake.rs","count":5}],"truncated":false,"displayContent":" 470│// [impl->REQ-SHELL-2]\n*471│pub fn reconcile_once(\n 472│    owlery: &Path,\n 473│    registered: &[(AdapterRecord, Manifest)],\n 474│    adapters_dir: &Path,\n    │...\n 494│    // Start side: every offline instance with a wake_command and headroom.\n*495│    for owner in spt_store::perch::list_self_perch_ids(owlery) {\n 496│        for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {\n 497│            if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {\n 498│                continue;\n    │...\n 559│            let adapters_dir = spt_store::perch::adapters_dir();\n*560│            let registered = spt_runtime::registry::registered(&adapters_dir);\n 561│            reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);\n 562│            // Sleep in slices so a stop lands promptly.\n 563│            let mut left = RECONCILE_INTERVAL_MS;\n    │...\n 896│        spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();\n*897│        let registered = spt_runtime::registry::registered(&adapters_dir);\n 898│\n 899│        let id = spawn_record(owlery, \"doyle\", \"mock-wake\", None).unwrap();\n 900│        let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);\n    │...\n 974│        spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();\n*975│        let registered = spt_runtime::registry::registered(&adapters_dir);\n 976│\n 977│        // A bare-parent instance: no wake_command in the parent ⇒ never woken.\n 978│        spawn_record(owlery, \"doyle\", \"mock-wakeprof\", None).unwrap();"},"isError":false,"timestamp":1784293173208}}
{"type":"message","id":"545dcb28","parentId":"1193c0ee","timestamp":"2026-07-17T12:59:33.209Z","message":{"role":"toolResult","toolCallId":"call_WdKurw8IuU6L5mVgCcPoW8pW|fc_034a6be5a6696b6c016a5a2734ca5c8191a231c76740549b33","toolName":"grep","content":[{"type":"text","text":" 144|// [impl->REQ-DAEMON-1]\n*145|pub fn reconcile_once(\n 146|    owlery: &Path,\n 147|    registered: &[(AdapterRecord, Manifest)],\n 148|    adapters_dir: &Path,\n...\n 541|/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear\n*542|/// ([`reconcile_hosted_liveness`]) offlines the stale-online records — which IS the \"was\n 543|/// online at restart\" signal. A brain restart with a SURVIVING broker sees the live\n 544|/// sessions in `live` and re-runs nothing (they are not orphaned). The re-run resumes\n 545|/// from the last ledger session via the shared [`launch_ledger_resume`] tagged\n...\n 547|/// [`restart_resume_gate`]. Broker unreachable ⇒ skip entirely (never mass-respawn on a\n*548|/// hiccup — the safe direction, same posture as [`reconcile_hosted_liveness`]).\n 549|// [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\n 550|pub fn resume_restart_orphaned_endpoints(\n 551|    owlery: &Path,\n...\n 554|) {\n*555|    let Some(live) = query_live_session_endpoints() else {\n 556|        return; // broker unreachable — skip (never mass-respawn on a hiccup)\n 557|    };\n 558|    for id in perch::list_self_perch_ids(owlery) {\n...\n 689|\n*690|pub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\n 691|    let mut offlined = Vec::new();\n 692|    for id in perch::list_self_perch_ids(owlery) {\n 693|        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n...\n 808|/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\n*809|fn query_live_session_endpoints() -> Option<BTreeSet<String>> {\n 810|    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\n 811|    let reply = brain.sessions().ok()?;\n 812|    Some(\n...\n 1067|            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\n*1068|            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n 1069|            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n 1070|            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n 1071|            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n...\n 1101|            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\n*1102|            if let Some(live) = query_live_session_endpoints() {\n*1103|                reconcile_hosted_liveness(&owlery, &live);\n 1104|            }\n 1105|            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n 1106|            // Sleep in slices so a stop lands promptly.\n...\n 1232|\n*1233|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1234|            assert_eq!(\n 1235|                offlined,\n 1236|                vec![\"dead\".to_string()],\n...\n 1332|\n*1333|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1334|            assert!(\n 1335|                offlined.is_empty(),\n 1336|                \"live-pid quirk row: stamps cleared but presence untouched\"\n...\n 1395|            if let Some(live) = query_failed {\n*1396|                reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1397|            }\n 1398|            assert_eq!(\n 1399|                spt_store::info::read_info(&perch).and_then(|i| i.status).as_deref(),\n...\n 1404|            // Some(∅) — broker reachable with zero sessions — DOES offline it.\n*1405|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1406|            assert_eq!(offlined, vec![\"phantom\".to_string()]);\n 1407|        });\n 1408|    }\n...\n 1432|            // No live sessions (the restarted daemon's broker hosts nothing for it).\n*1433|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1434|            assert!(\n 1435|                offlined.is_empty(),\n 1436|                \"an already-offline perch is not re-offlined (presence unchanged)\"\n...\n 1450|    // [unit->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE] the B5 boot-gate: at boot the\n*1451|    // reconcile runs reconcile_hosted_liveness BEFORE reconcile_once, so a\n 1452|    // sessionless spt-hosted (controllable) online perch is OFFLINED first and\n 1453|    // reconcile_once then never REVIVES its Psyche (the cold-start-after-unclean-stop\n 1454|    // phantom). A session-backed perch is left online and IS hosted — proving the\n...\n 1485|            // Boot-tick ordering: liveness reconcile (the gate) BEFORE the host scan.\n*1486|            reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1487|            reconcile_once(\n 1488|                &perch::owlery_dir(),\n 1489|                &registered_now(),\n...\n 1612|\n*1613|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1614|            assert_eq!(\n 1615|                offlined,\n 1616|                vec![\"skeleton-dead\".to_string()],\n...\n 1708|            assert!(live.contains(\"wallb\"), \"broker hosts the session\");\n*1709|            assert!(reconcile_hosted_liveness(&perch::owlery_dir(), &live).is_empty());\n 1710|            assert_eq!(status(\"wallb\").as_deref(), Some(STATUS_ONLINE));\n 1711|\n 1712|            // Kill the session; wait for the exit-waiter to reap it from the table.\n...\n 1720|            let live2 = session_set(&mut brain);\n*1721|            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live2);\n 1722|            assert_eq!(offlined, vec![\"wallb\".to_string()], \"dead-session perch offlined\");\n 1723|            assert_eq!(\n 1724|                status(\"wallb\").as_deref(),"}],"details":{"scopePath":"crates/spt-daemon/src/livehost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":19,"fileCount":1,"files":["crates/spt-daemon/src/livehost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/livehost.rs","count":19}],"truncated":false,"displayContent":"  144│// [impl->REQ-DAEMON-1]\n *145│pub fn reconcile_once(\n  146│    owlery: &Path,\n  147│    registered: &[(AdapterRecord, Manifest)],\n  148│    adapters_dir: &Path,\n     │...\n  541│/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear\n *542│/// ([`reconcile_hosted_liveness`]) offlines the stale-online records — which IS the \"was\n  543│/// online at restart\" signal. A brain restart with a SURVIVING broker sees the live\n  544│/// sessions in `live` and re-runs nothing (they are not orphaned). The re-run resumes\n  545│/// from the last ledger session via the shared [`launch_ledger_resume`] tagged\n     │...\n  547│/// [`restart_resume_gate`]. Broker unreachable ⇒ skip entirely (never mass-respawn on a\n *548│/// hiccup — the safe direction, same posture as [`reconcile_hosted_liveness`]).\n  549│// [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]\n  550│pub fn resume_restart_orphaned_endpoints(\n  551│    owlery: &Path,\n     │...\n  554│) {\n *555│    let Some(live) = query_live_session_endpoints() else {\n  556│        return; // broker unreachable — skip (never mass-respawn on a hiccup)\n  557│    };\n  558│    for id in perch::list_self_perch_ids(owlery) {\n     │...\n  689│\n *690│pub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\n  691│    let mut offlined = Vec::new();\n  692│    for id in perch::list_self_perch_ids(owlery) {\n  693│        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n     │...\n  808│/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\n *809│fn query_live_session_endpoints() -> Option<BTreeSet<String>> {\n  810│    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\n  811│    let reply = brain.sessions().ok()?;\n  812│    Some(\n     │...\n 1067│            // int rig can prove REQ-UPDATE-TRIAL-DRAIN-DRIVE's core-loop KIND_SESSIONS\n*1068│            // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`\n 1069│            // → `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE\n 1070│            // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting\n 1071│            // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition\n     │...\n 1101│            // [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]\n*1102│            if let Some(live) = query_live_session_endpoints() {\n*1103│                reconcile_hosted_liveness(&owlery, &live);\n 1104│            }\n 1105│            reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);\n 1106│            // Sleep in slices so a stop lands promptly.\n     │...\n 1232│\n*1233│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1234│            assert_eq!(\n 1235│                offlined,\n 1236│                vec![\"dead\".to_string()],\n     │...\n 1332│\n*1333│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1334│            assert!(\n 1335│                offlined.is_empty(),\n 1336│                \"live-pid quirk row: stamps cleared but presence untouched\"\n     │...\n 1395│            if let Some(live) = query_failed {\n*1396│                reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1397│            }\n 1398│            assert_eq!(\n 1399│                spt_store::info::read_info(&perch).and_then(|i| i.status).as_deref(),\n     │...\n 1404│            // Some(∅) — broker reachable with zero sessions — DOES offline it.\n*1405│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1406│            assert_eq!(offlined, vec![\"phantom\".to_string()]);\n 1407│        });\n 1408│    }\n     │...\n 1432│            // No live sessions (the restarted daemon's broker hosts nothing for it).\n*1433│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &BTreeSet::new());\n 1434│            assert!(\n 1435│                offlined.is_empty(),\n 1436│                \"an already-offline perch is not re-offlined (presence unchanged)\"\n     │...\n 1450│    // [unit->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE] the B5 boot-gate: at boot the\n*1451│    // reconcile runs reconcile_hosted_liveness BEFORE reconcile_once, so a\n 1452│    // sessionless spt-hosted (controllable) online perch is OFFLINED first and\n 1453│    // reconcile_once then never REVIVES its Psyche (the cold-start-after-unclean-stop\n 1454│    // phantom). A session-backed perch is left online and IS hosted — proving the\n     │...\n 1485│            // Boot-tick ordering: liveness reconcile (the gate) BEFORE the host scan.\n*1486│            reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1487│            reconcile_once(\n 1488│                &perch::owlery_dir(),\n 1489│                &registered_now(),\n     │...\n 1612│\n*1613│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live);\n 1614│            assert_eq!(\n 1615│                offlined,\n 1616│                vec![\"skeleton-dead\".to_string()],\n     │...\n 1708│            assert!(live.contains(\"wallb\"), \"broker hosts the session\");\n*1709│            assert!(reconcile_hosted_liveness(&perch::owlery_dir(), &live).is_empty());\n 1710│            assert_eq!(status(\"wallb\").as_deref(), Some(STATUS_ONLINE));\n 1711│\n 1712│            // Kill the session; wait for the exit-waiter to reap it from the table.\n     │...\n 1720│            let live2 = session_set(&mut brain);\n*1721│            let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live2);\n 1722│            assert_eq!(offlined, vec![\"wallb\".to_string()], \"dead-session perch offlined\");\n 1723│            assert_eq!(\n 1724│                status(\"wallb\").as_deref(),"},"isError":false,"timestamp":1784293173209}}
{"type":"message","id":"be9403d4","parentId":"545dcb28","timestamp":"2026-07-17T12:59:33.210Z","message":{"role":"toolResult","toolCallId":"call_Ow7Cx8Cfs77enZzZZ09jZNiO|fc_034a6be5a6696b6c016a5a2734ca9481919f5d2ffab0073e5a","toolName":"read","content":[{"type":"text","text":"//! The notif pump worker (pump-seam P3) — the full semilattice spool push.\n//!\n//! `peer_step` emits this node's notif feed for the subnet\n//! ([`emit_notif_feed`]) and pushes it over the peer's feed stream; the\n//! receiver's join dedups. No node-local `pre_round` and no wake edge — a\n//! plain cadenced push. Construction-captured dep: the notif spool DB path.\n\nuse std::io;\nuse std::path::PathBuf;\nuse std::time::Duration;\n\nuse spt_store::notif::NotifStore;\n\nuse crate::notifsync::emit_notif_feed;\n\nuse super::{PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\n\n/// The notif leg as a [`PumpWorker`]: the full semilattice spool per subnet\n/// ([`emit_notif_feed`]); the receiver's join dedups.\npub(super) struct NotifWorker {\n    /// The notif spool DB ([`NotifStore::open_at`]).\n    notif_db: PathBuf,\n    /// This worker's scheduling period (`cadence.notif`).\n    cadence: Duration,\n}\n\nimpl NotifWorker {\n    /// Construction capture (§Frozen-4): the notif spool DB path + the cadence.\n    pub(super) fn new(paths: &PumpPaths, cadence: &PumpCadence) -> NotifWorker {\n        NotifWorker {\n            notif_db: paths.notif_db.clone(),\n            cadence: cadence.notif,\n        }\n    }\n}\n\nimpl PumpWorker for NotifWorker {\n    fn cadence(&self) -> Duration {\n        self.cadence\n    }\n\n    /// Emit this node's notif feed for `subnet` (the full semilattice spool)\n    /// and push it fire-and-forget; the receiver's join dedups.\n    // [impl->REQ-NOTIF-1]\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        _peer_hex: &str,\n        _ctx: &RoundCtx,\n    ) -> io::Result<()> {\n        let store =\n            NotifStore::open_at(&self.notif_db).map_err(|e| io::Error::other(e.to_string()))?;\n        let feed = emit_notif_feed(&store, subnet).map_err(io::Error::other)?;\n        if !feed.is_empty() {\n            io.push_feed(&feed)?;\n        }\n        Ok(())\n    }\n}\n"}],"details":{"displayContent":{"text":"//! The notif pump worker (pump-seam P3) — the full semilattice spool push.\r\n//!\r\n//! `peer_step` emits this node's notif feed for the subnet\r\n//! ([`emit_notif_feed`]) and pushes it over the peer's feed stream; the\r\n//! receiver's join dedups. No node-local `pre_round` and no wake edge — a\r\n//! plain cadenced push. Construction-captured dep: the notif spool DB path.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::time::Duration;\r\n\r\nuse spt_store::notif::NotifStore;\r\n\r\nuse crate::notifsync::emit_notif_feed;\r\n\r\nuse super::{PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// The notif leg as a [`PumpWorker`]: the full semilattice spool per subnet\r\n/// ([`emit_notif_feed`]); the receiver's join dedups.\r\npub(super) struct NotifWorker {\r\n    /// The notif spool DB ([`NotifStore::open_at`]).\r\n    notif_db: PathBuf,\r\n    /// This worker's scheduling period (`cadence.notif`).\r\n    cadence: Duration,\r\n}\r\n\r\nimpl NotifWorker {\r\n    /// Construction capture (§Frozen-4): the notif spool DB path + the cadence.\r\n    pub(super) fn new(paths: &PumpPaths, cadence: &PumpCadence) -> NotifWorker {\r\n        NotifWorker {\r\n            notif_db: paths.notif_db.clone(),\r\n            cadence: cadence.notif,\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for NotifWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// Emit this node's notif feed for `subnet` (the full semilattice spool)\r\n    /// and push it fire-and-forget; the receiver's join dedups.\r\n    // [impl->REQ-NOTIF-1]\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let store =\r\n            NotifStore::open_at(&self.notif_db).map_err(|e| io::Error::other(e.to_string()))?;\r\n        let feed = emit_notif_feed(&store, subnet).map_err(io::Error::other)?;\r\n        if !feed.is_empty() {\r\n            io.push_feed(&feed)?;\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\notif.rs"}}},"isError":false,"timestamp":1784293173210}}
{"type":"message","id":"9528ec92","parentId":"be9403d4","timestamp":"2026-07-17T12:59:33.210Z","message":{"role":"toolResult","toolCallId":"call_T1pDRhfJt1GhUMPVHauQsJ1P|fc_034a6be5a6696b6c016a5a2734cab08191a09db1af40b3e099","toolName":"read","content":[{"type":"text","text":"//! The sync pump worker (pump-seam P3) — anti-entropy pull for the minds.\n//!\n//! `poll_wake` consumes the wake-edge freshness-pull marker (a dormant→active\n//! transition forces a pull NOW); `peer_step` builds the want-set — the union\n//! of locally-tracked allowed branches ([`select_refs`]) and registry-derived\n//! `a-<id>` bootstrap refs (endpoints known in the shared subnet this node\n//! never held locally), both gated by the same [`crate::sync::SyncPolicy`] the\n//! responder enforces (symmetric scoping) — then pulls via [`request_sync`]\n//! over the shell's open-op counter and reports conflicts through the\n//! construction-captured [`PumpHooks`]. Construction-captured deps (§Frozen-4):\n//! the registry [`Arc`] (snapshot bootstrap refs), the store/scratch/marker\n//! paths, and the hooks.\n\nuse std::io;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nuse spt_store::contextstore::ContextStore;\n\nuse crate::registryhost::RegistryHost;\nuse crate::sync::{request_sync, select_refs};\n\nuse super::{PeerIo, PumpCadence, PumpHooks, PumpPaths, PumpWorker, RoundCtx};\n\n/// The sync leg as a [`PumpWorker`]: anti-entropy pull for the minds.\npub(super) struct SyncWorker {\n    /// Registry snapshot source for the bootstrap-ref union (§Frozen-4: the\n    /// sync worker's own construction-captured Arc, not the shell's).\n    registry: Arc<RegistryHost>,\n    /// The context store root ([`ContextStore::open_or_init_in`]).\n    ctx_root: PathBuf,\n    /// Transient pull scratch.\n    scratch: PathBuf,\n    /// The wake-edge freshness-pull marker\n    /// ([`crate::resting::take_freshness_pull`]).\n    pull_marker: PathBuf,\n    /// This worker's scheduling period (`cadence.sync`).\n    cadence: Duration,\n    /// The conflict-surface hooks (ADR-0013): `on_pull` fires after every\n    /// completed pull. A sync-worker construction dep (the conflict surface).\n    hooks: PumpHooks,\n}\n\nimpl SyncWorker {\n    /// Construction capture (§Frozen-4): the registry Arc, the worker's path\n    /// slices, the cadence, and the conflict-surface hooks.\n    pub(super) fn new(\n        registry: Arc<RegistryHost>,\n        paths: &PumpPaths,\n        cadence: &PumpCadence,\n        hooks: PumpHooks,\n    ) -> SyncWorker {\n        SyncWorker {\n            registry,\n            ctx_root: paths.ctx_root.clone(),\n            scratch: paths.scratch.clone(),\n            pull_marker: paths.pull_marker.clone(),\n            cadence: cadence.sync,\n            hooks,\n        }\n    }\n}\n\nimpl PumpWorker for SyncWorker {\n    fn cadence(&self) -> Duration {\n        self.cadence\n    }\n\n    /// The wake edge's freshness pull (D9-2, REQ-INST-3): a dormant→active\n    /// transition dropped the marker — consume it and pull NOW, the\n    /// catch-up-on-activation latency is the point. The take is the remove, so\n    /// one wake claims exactly one forced round.\n    // [impl->REQ-INST-3]\n    fn poll_wake(&mut self) -> bool {\n        crate::resting::take_freshness_pull(&self.pull_marker)\n    }\n\n    /// Pull anti-entropy from one peer: the want-set is the union of\n    /// [`select_refs`] (locally-tracked branches the policy allows toward the\n    /// peer) and registry-derived `a-<id>` bootstrap refs, both gated by the\n    /// same policy the responder enforces. The pull's `open_op` is durable\n    /// (exactly-once open identity), minted from the shell's sole counter via\n    /// [`PeerIo`].\n    // [impl->REQ-INST-5]\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        peer_hex: &str,\n        ctx: &RoundCtx,\n    ) -> io::Result<()> {\n        let cs = ContextStore::open_or_init_in(&self.ctx_root)?;\n        let mut want = select_refs(&ctx.policy, &cs, peer_hex)?;\n        // Registry-derived bootstrap refs: minds named in the shared subnet\n        // that this node never held locally.\n        if let Some(snap) = self.registry.snapshot(subnet) {\n            for id in snap.endpoint_ids() {\n                let r = format!(\"a-{id}\");\n                if !want.contains(&r) && ctx.policy.allows(&r, peer_hex) {\n                    want.push(r);\n                }\n            }\n        }\n        if !want.is_empty() {\n            let open_op = io.open_op()?;\n            let report = request_sync(&mut *io.brain, io.conn_id, &want, open_op, &cs, &self.scratch)?;\n            (self.hooks.on_pull)(peer_hex, &report);\n        }\n        Ok(())\n    }\n}\n"}],"details":{"displayContent":{"text":"//! The sync pump worker (pump-seam P3) — anti-entropy pull for the minds.\r\n//!\r\n//! `poll_wake` consumes the wake-edge freshness-pull marker (a dormant→active\r\n//! transition forces a pull NOW); `peer_step` builds the want-set — the union\r\n//! of locally-tracked allowed branches ([`select_refs`]) and registry-derived\r\n//! `a-<id>` bootstrap refs (endpoints known in the shared subnet this node\r\n//! never held locally), both gated by the same [`crate::sync::SyncPolicy`] the\r\n//! responder enforces (symmetric scoping) — then pulls via [`request_sync`]\r\n//! over the shell's open-op counter and reports conflicts through the\r\n//! construction-captured [`PumpHooks`]. Construction-captured deps (§Frozen-4):\r\n//! the registry [`Arc`] (snapshot bootstrap refs), the store/scratch/marker\r\n//! paths, and the hooks.\r\n\r\nuse std::io;\r\nuse std::path::PathBuf;\r\nuse std::sync::Arc;\r\nuse std::time::Duration;\r\n\r\nuse spt_store::contextstore::ContextStore;\r\n\r\nuse crate::registryhost::RegistryHost;\r\nuse crate::sync::{request_sync, select_refs};\r\n\r\nuse super::{PeerIo, PumpCadence, PumpHooks, PumpPaths, PumpWorker, RoundCtx};\r\n\r\n/// The sync leg as a [`PumpWorker`]: anti-entropy pull for the minds.\r\npub(super) struct SyncWorker {\r\n    /// Registry snapshot source for the bootstrap-ref union (§Frozen-4: the\r\n    /// sync worker's own construction-captured Arc, not the shell's).\r\n    registry: Arc<RegistryHost>,\r\n    /// The context store root ([`ContextStore::open_or_init_in`]).\r\n    ctx_root: PathBuf,\r\n    /// Transient pull scratch.\r\n    scratch: PathBuf,\r\n    /// The wake-edge freshness-pull marker\r\n    /// ([`crate::resting::take_freshness_pull`]).\r\n    pull_marker: PathBuf,\r\n    /// This worker's scheduling period (`cadence.sync`).\r\n    cadence: Duration,\r\n    /// The conflict-surface hooks (ADR-0013): `on_pull` fires after every\r\n    /// completed pull. A sync-worker construction dep (the conflict surface).\r\n    hooks: PumpHooks,\r\n}\r\n\r\nimpl SyncWorker {\r\n    /// Construction capture (§Frozen-4): the registry Arc, the worker's path\r\n    /// slices, the cadence, and the conflict-surface hooks.\r\n    pub(super) fn new(\r\n        registry: Arc<RegistryHost>,\r\n        paths: &PumpPaths,\r\n        cadence: &PumpCadence,\r\n        hooks: PumpHooks,\r\n    ) -> SyncWorker {\r\n        SyncWorker {\r\n            registry,\r\n            ctx_root: paths.ctx_root.clone(),\r\n            scratch: paths.scratch.clone(),\r\n            pull_marker: paths.pull_marker.clone(),\r\n            cadence: cadence.sync,\r\n            hooks,\r\n        }\r\n    }\r\n}\r\n\r\nimpl PumpWorker for SyncWorker {\r\n    fn cadence(&self) -> Duration {\r\n        self.cadence\r\n    }\r\n\r\n    /// The wake edge's freshness pull (D9-2, REQ-INST-3): a dormant→active\r\n    /// transition dropped the marker — consume it and pull NOW, the\r\n    /// catch-up-on-activation latency is the point. The take is the remove, so\r\n    /// one wake claims exactly one forced round.\r\n    // [impl->REQ-INST-3]\r\n    fn poll_wake(&mut self) -> bool {\r\n        crate::resting::take_freshness_pull(&self.pull_marker)\r\n    }\r\n\r\n    /// Pull anti-entropy from one peer: the want-set is the union of\r\n    /// [`select_refs`] (locally-tracked branches the policy allows toward the\r\n    /// peer) and registry-derived `a-<id>` bootstrap refs, both gated by the\r\n    /// same policy the responder enforces. The pull's `open_op` is durable\r\n    /// (exactly-once open identity), minted from the shell's sole counter via\r\n    /// [`PeerIo`].\r\n    // [impl->REQ-INST-5]\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        peer_hex: &str,\r\n        ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let cs = ContextStore::open_or_init_in(&self.ctx_root)?;\r\n        let mut want = select_refs(&ctx.policy, &cs, peer_hex)?;\r\n        // Registry-derived bootstrap refs: minds named in the shared subnet\r\n        // that this node never held locally.\r\n        if let Some(snap) = self.registry.snapshot(subnet) {\r\n            for id in snap.endpoint_ids() {\r\n                let r = format!(\"a-{id}\");\r\n                if !want.contains(&r) && ctx.policy.allows(&r, peer_hex) {\r\n                    want.push(r);\r\n                }\r\n            }\r\n        }\r\n        if !want.is_empty() {\r\n            let open_op = io.open_op()?;\r\n            let report = request_sync(&mut *io.brain, io.conn_id, &want, open_op, &cs, &self.scratch)?;\r\n            (self.hooks.on_pull)(peer_hex, &report);\r\n        }\r\n        Ok(())\r\n    }\r\n}\r\n","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\sync.rs"}}},"isError":false,"timestamp":1784293173210}}
{"type":"message","id":"e3fe2c31","parentId":"9528ec92","timestamp":"2026-07-17T12:59:33.225Z","message":{"role":"toolResult","toolCallId":"call_n5dalq3r81QepfhgFoItLGL6|fc_034a6be5a6696b6c016a5a2734ca7481918f4d78c14dcf07d6","toolName":"read","content":[{"type":"text","text":"pub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\n…\n    for id in perch::list_self_perch_ids(owlery) {\n…\n        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\n        // yet, so `controllable` may be unset) — skip the gate for it.\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\n        if !is_unbound && info.controllable != Some(true) {\n            continue; // harness-hosted relay / legacy — exempt\n        }\n        if !has_session {\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\n            // session → the harness child is gone. CUSTODY GATE first: a\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\n            // mid-revival — normalizing now would land `suspended` under the\n            // incoming bind (which carries rest_state forward by design,\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\n                eprintln!(\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\n                );\n                continue;\n            }\n            // Definitive death → terminal normalize (offline + suspended +\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\n            // so a bind that lands between our read and this write is never\n            // clobbered.\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\n            // a stale `driven_by = Some` — its broker session (the single writer)\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\n            // it. The split cleanup above already cleared every no-session row;\n            // this belt stays for the same-tick read (info is a pre-cleanup\n            // snapshot). RACE-FREE for the same no-live-session reason.\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\n            if info.driven_by.is_some() {\n                let _ = spt_store::info::set_driven_by(&perch, None);\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\n            }\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\n            offlined.push(id);\n        }\n    }\n    offlined\n}\n\n/// Query the broker for the set of endpoint ids it currently hosts a session for\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\n    let reply = brain.sessions().ok()?;\n    Some(\n        reply\n            .sessions\n            .into_iter()\n            .map(|s| s.endpoint)\n            .filter(|e| !e.is_empty())\n            .collect(),\n    )\n}\n\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\n/// [`normalize_basename`](spt_runtime::resolve::normalize_basename) (lowercase /\n/// `.exe`-strip / dot-stem) so it keys the same as a live exe basename. `None` for an\n/// empty command. Adapter-AGNOSTIC: the expected program is the MANIFEST-declared psyche\n/// command, NEVER a hardcoded adapter name (glue-model boundary).\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\nfn psyche_program_norm(command: &str) -> Option<String> {\n    let token = command.split_whitespace().next()?;\n    let file = Path::new(token).file_name()?.to_string_lossy().into_owned();\n    Some(spt_runtime::resolve::normalize_basename(&file))\n}\n\n/// FAIL-SAFE-DECLINE, positive-match-only guard for a stranded legacy-resident\n/// `<id>-psyche` process (F-030 W5, REQ-PSYCHE-LEGACY-RESIDENT-SWEEP, pin 2). Kill IFF\n/// ALL THREE hold: (a) `pid` is alive, (b) its exe basename == the adapter's\n/// MANIFEST-declared psyche program (`expected_prog_norm`, via `normalize_basename` —\n/// never a hardcoded adapter name), AND (c) its command line contains the FULL\n/// `<id>-psyche` id (baked into the wrapper argv via `{id}`; a sibling\n/// `agent-other-psyche` never contains `agent-psyche`). ANY None — dead pid, unreadable\n/// basename, basename mismatch (a same-basename SIBLING), or unreadable cmdline — returns\n/// `false`, i.e. DECLINE to reap: a missed orphan is a visible idle process (cheap), a\n/// wrong-kill is catastrophic (infra never-kill inside the sweep). Pure over the process\n/// signals so the reap/spare/decline verdict is unit-testable.\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\nfn legacy_psyche_should_reap(psyche_id: &str, expected_prog_norm: &str, pid: u32) -> bool {\n    if !spt_store::proc::is_process_alive(pid) {\n        return false;\n    }\n    let basename_ok = spt_store::proc::exe_basename(pid)\n        .map(|b| spt_runtime::resolve::normalize_basename(&b) == expected_prog_norm)\n        .unwrap_or(false);\n    if !basename_ok {\n        return false; // unreadable basename OR a same-basename sibling ⇒ decline\n    }\n    spt_store::proc::process_cmdline(pid)\n        .map(|cl| cl.contains(psyche_id))\n        .unwrap_or(false) // cmdline unreadable ⇒ fail safe (decline)\n}\n\n/// F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP) — bury the\n/// residency era's corpse, NOT resurrect its machinery. A box upgraded across F-030 W4\n/// can carry a pre-W3 v0.13.x psyche WRAPPER still ALIVE: it registered its `<id>-psyche`\n/// READY perch then BLOCKED FOREVER on `spt ready <id>-psyche --once` (W4's nested-ready\n/// fix converted the old accidental READY_FAIL self-reap into a silent hang — KH 2.6\n/// invisible-loop, one level up). The per-event driver never delivers to a psyche perch,\n/// so it lingers idle, no exit, no fault. This sweep is its INTENDED replacement.\n///\n/// Runs ONCE at brain start (pin 1), BEFORE the first reconcile — so no per-event turn is\n/// in flight yet, and any `<id>-psyche` psyche-program process alive at this instant is\n/// unambiguously a stranded pre-W3 resident (fratricide closed by TIMING: the F-030 shim\n/// is daemon-spawned PER EVENT and its only alive-window is an in-flight resume turn,\n/// which cannot exist before the first reconcile). For each self-perch live-agent id it\n/// reads the pid the wrapper's ready registration recorded in the nested `<id>-psyche`\n/// info.json — a pure F-030 psyche writes NO info.json (custody is a dedicated\n/// `psyche-custody.json`, FORK-2), so `read_pid` is `None` for it and the sweep declines,\n/// making the info.json-with-pid the exact discriminator of a legacy wrapper.\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\npub fn sweep_legacy_resident_psyches(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n) {\n    for id in perch::list_self_perch_ids(owlery) {\n        sweep_legacy_resident_psyche_for(&id, registered, adapters_dir);\n    }\n}\n\n/// Sweep ONE endpoint's stranded legacy-resident psyche (see\n/// [`sweep_legacy_resident_psyches`]). Positive-match-gated by\n/// [`legacy_psyche_should_reap`]; on a match, tree-kill the wrapper (so any harness\n/// children it spawned die with it, not orphaned) THEN clear the stale `<id>-psyche` ready\n/// registration (pin 3 residue: the info.json + `ready` marker the wrapper wrote, else a\n/// dead-pid phantom ready perch lingers — the REMOTE-TRUTH presence-lie class). Loud,\n/// non-fatal.\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\nfn sweep_legacy_resident_psyche_for(\n    id: &str,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n) {\n    let perch = perch::resolve_perch_path(id, ParentHint::Infer);\n    let Some(info) = spt_store::info::read_info(&perch) else {\n        return;\n    };\n    if info.state != LIVE_AGENT_STATE {\n        return;\n    }\n    let Some(adapter) = info.adapter.as_deref() else {\n        return;\n    };\n    let Ok(manifest) = spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\n    else {\n        return;\n    };\n    let Some(expected) = manifest\n        .session\n        .psyche_init\n        .as_ref()\n        .and_then(|role| psyche_program_norm(&role.command))\n    else {\n        return;\n    };\n    let psyche_id = format!(\"{id}-psyche\");\n    let psyche_perch = perch::resolve_perch_path(&psyche_id, ParentHint::Explicit(id));\n    let Some(pid) = spt_store::info::read_pid(&psyche_perch) else {\n        return; // no nested info.json pid ⇒ not a legacy ready registration\n    };\n    if !legacy_psyche_should_reap(&psyche_id, &expected, pid) {\n        // DECLINE. Loud ONLY when there is a live pid we chose not to kill (an ambiguous\n        // or sibling signal) — never for the common dead-pid / no-orphan case.\n        if spt_store::proc::is_process_alive(pid) {\n            eprintln!(\n                \"LEGACY_PSYCHE_SWEEP_DECLINE:{id} pid={pid}: no positive match \\\n                 (basename/cmdline did not confirm the `{psyche_id}` legacy wrapper) — left running\"\n            );\n        }\n        return;\n    }\n    // Positive match: THIS pid is the stranded pre-W3 `<id>-psyche` wrapper. Tree-kill so\n    // its harness descendants die with it rather than orphaning.\n    spt_store::proc::kill_pid_tree(pid);\n    // Pin 3 residue: clear the stale ready registration the wrapper wrote (info.json +\n    // `ready` marker) so no dead-pid phantom ready perch is left behind.\n    let _ = std::fs::remove_file(psyche_perch.join(\"info.json\"));\n    let _ = std::fs::remove_file(perch::resolve_ready_file(&psyche_id, ParentHint::Explicit(id)));\n    eprintln!(\n        \"LEGACY_PSYCHE_SWEEP_REAP:{id} pid={pid}: reaped stranded pre-W3 resident psyche \\\n         + cleared its stale `{psyche_id}` ready registration\"\n    );\n}\n\n/// F-030 W5 ONE-SHOT brain-start GC of stranded `.live-bin` own-copy dirs (design\n/// §W5, [`REQ-PSYCHE-LEGACY-RESIDENT-SWEEP`]). The retired resident spawn kept a\n/// per-endpoint `<perch>/.live-bin/<prog>` PRIVATE COPY of the psyche binary; the\n/// ephemeral per-event turn needs none (it runs from the install-dir/PATH snapshot,\n/// image-lock exposure now turn-bounded), so a cross-version upgrade leaves a multi-MB\n/// `.live-bin` per pre-W5 endpoint forever. Runs ONCE at brain start AFTER\n/// [`sweep_legacy_resident_psyches`] (which kills any wrapper running FROM the image →\n/// the dir then unlocks). A still-image-locked dir → F-028 C1 DISPLACE (a locked exe\n/// can be MOVED even when it can't be unlinked): rename the dir aside to a fresh\n/// `.live-bin.old-N` sibling + best-effort remove; a still-locked displaced dir stays\n/// uniquely-named for a later boot's GC. NEVER delete-fail-abort. Also sweeps stale\n/// `.live-bin.old*` litter a prior locked displace left behind.\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\npub fn gc_live_bin_dirs(owlery: &Path) {\n    gc_live_bin_dirs_with(owlery, &|d| std::fs::remove_dir_all(d));\n}\n\n/// [`gc_live_bin_dirs`] over an injected `remove` (the crc_swap injectable-seam\n/// pattern) so the image-locked DISPLACE path is unit-testable deterministically\n/// without a real OS lock: a unit feeds a `remove` that fails for `.live-bin` and\n/// asserts the dir is DISPLACED (renamed aside), never errored/aborted.\nfn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {\n    for id in perch::list_self_perch_ids(owlery) {\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n        let Ok(entries) = std::fs::read_dir(&perch) else {\n            continue;\n        };\n        for entry in entries.flatten() {\n            let name = entry.file_name();\n            let name = name.to_string_lossy();\n            // The live own-copy dir + any already-displaced `.live-bin.old*` litter.\n            if name != \".live-bin\" && !name.starts_with(\".live-bin.old\") {\n                continue;\n            }\n            let dir = entry.path();\n            if !dir.is_dir() {\n                continue;\n            }\n            if remove(&dir).is_ok() {\n                continue;\n            }\n            // Still image-locked. An already-displaced `.old*` just waits for the next\n            // boot (uniquely named, never a brick); the LIVE `.live-bin` is displaced now\n            // (a locked exe can be MOVED even when it can't be unlinked) so the endpoint's\n            // perch no longer carries the stale own-copy in place. NEVER abort.\n            if name == \".live-bin\" {\n                let displaced = fresh_live_bin_old(&dir);\n                match std::fs::rename(&dir, &displaced) {\n                    Ok(()) => {\n                        let _ = remove(&displaced);\n                    }\n…\n                }\n            }\n        }\n    }\n}\n\n[Showing lines 759-1003 of 2333. Use :1004 to continue]"}],"details":{"truncation":{"content":"        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\r\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\r\n        // yet, so `controllable` may be unset) — skip the gate for it.\r\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n        if !is_unbound && info.controllable != Some(true) {\r\n            continue; // harness-hosted relay / legacy — exempt\r\n        }\r\n        if !has_session {\r\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\r\n            // session → the harness child is gone. CUSTODY GATE first: a\r\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\r\n            // mid-revival — normalizing now would land `suspended` under the\r\n            // incoming bind (which carries rest_state forward by design,\r\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\r\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\r\n                eprintln!(\r\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\r\n                );\r\n                continue;\r\n            }\r\n            // Definitive death → terminal normalize (offline + suspended +\r\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\r\n            // so a bind that lands between our read and this write is never\r\n            // clobbered.\r\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\r\n            // a stale `driven_by = Some` — its broker session (the single writer)\r\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\r\n            // it. The split cleanup above already cleared every no-session row;\r\n            // this belt stays for the same-tick read (info is a pre-cleanup\r\n            // snapshot). RACE-FREE for the same no-live-session reason.\r\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\r\n            if info.driven_by.is_some() {\r\n                let _ = spt_store::info::set_driven_by(&perch, None);\r\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\r\n            }\r\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\r\n            offlined.push(id);\r\n        }\r\n    }\r\n    offlined\r\n}\r\n\r\n/// Query the broker for the set of endpoint ids it currently hosts a session for\r\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\r\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\r\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\r\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\r\n    let reply = brain.sessions().ok()?;\r\n    Some(\r\n        reply\r\n            .sessions\r\n            .into_iter()\r\n            .map(|s| s.endpoint)\r\n            .filter(|e| !e.is_empty())\r\n            .collect(),\r\n    )\r\n}\r\n\r\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\r\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\r\n/// [`normalize_basename`](spt_runtime::resolve::normalize_basename) (lowercase /\r\n/// `.exe`-strip / dot-stem) so it keys the same as a live exe basename. `None` for an\r\n/// empty command. Adapter-AGNOSTIC: the expected program is the MANIFEST-declared psyche\r\n/// command, NEVER a hardcoded adapter name (glue-model boundary).\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn psyche_program_norm(command: &str) -> Option<String> {\r\n    let token = command.split_whitespace().next()?;\r\n    let file = Path::new(token).file_name()?.to_string_lossy().into_owned();\r\n    Some(spt_runtime::resolve::normalize_basename(&file))\r\n}\r\n\r\n/// FAIL-SAFE-DECLINE, positive-match-only guard for a stranded legacy-resident\r\n/// `<id>-psyche` process (F-030 W5, REQ-PSYCHE-LEGACY-RESIDENT-SWEEP, pin 2). Kill IFF\r\n/// ALL THREE hold: (a) `pid` is alive, (b) its exe basename == the adapter's\r\n/// MANIFEST-declared psyche program (`expected_prog_norm`, via `normalize_basename` —\r\n/// never a hardcoded adapter name), AND (c) its command line contains the FULL\r\n/// `<id>-psyche` id (baked into the wrapper argv via `{id}`; a sibling\r\n/// `agent-other-psyche` never contains `agent-psyche`). ANY None — dead pid, unreadable\r\n/// basename, basename mismatch (a same-basename SIBLING), or unreadable cmdline — returns\r\n/// `false`, i.e. DECLINE to reap: a missed orphan is a visible idle process (cheap), a\r\n/// wrong-kill is catastrophic (infra never-kill inside the sweep). Pure over the process\r\n/// signals so the reap/spare/decline verdict is unit-testable.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn legacy_psyche_should_reap(psyche_id: &str, expected_prog_norm: &str, pid: u32) -> bool {\r\n    if !spt_store::proc::is_process_alive(pid) {\r\n        return false;\r\n    }\r\n    let basename_ok = spt_store::proc::exe_basename(pid)\r\n        .map(|b| spt_runtime::resolve::normalize_basename(&b) == expected_prog_norm)\r\n        .unwrap_or(false);\r\n    if !basename_ok {\r\n        return false; // unreadable basename OR a same-basename sibling ⇒ decline\r\n    }\r\n    spt_store::proc::process_cmdline(pid)\r\n        .map(|cl| cl.contains(psyche_id))\r\n        .unwrap_or(false) // cmdline unreadable ⇒ fail safe (decline)\r\n}\r\n\r\n/// F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP) — bury the\r\n/// residency era's corpse, NOT resurrect its machinery. A box upgraded across F-030 W4\r\n/// can carry a pre-W3 v0.13.x psyche WRAPPER still ALIVE: it registered its `<id>-psyche`\r\n/// READY perch then BLOCKED FOREVER on `spt ready <id>-psyche --once` (W4's nested-ready\r\n/// fix converted the old accidental READY_FAIL self-reap into a silent hang — KH 2.6\r\n/// invisible-loop, one level up). The per-event driver never delivers to a psyche perch,\r\n/// so it lingers idle, no exit, no fault. This sweep is its INTENDED replacement.\r\n///\r\n/// Runs ONCE at brain start (pin 1), BEFORE the first reconcile — so no per-event turn is\r\n/// in flight yet, and any `<id>-psyche` psyche-program process alive at this instant is\r\n/// unambiguously a stranded pre-W3 resident (fratricide closed by TIMING: the F-030 shim\r\n/// is daemon-spawned PER EVENT and its only alive-window is an in-flight resume turn,\r\n/// which cannot exist before the first reconcile). For each self-perch live-agent id it\r\n/// reads the pid the wrapper's ready registration recorded in the nested `<id>-psyche`\r\n/// info.json — a pure F-030 psyche writes NO info.json (custody is a dedicated\r\n/// `psyche-custody.json`, FORK-2), so `read_pid` is `None` for it and the sweep declines,\r\n/// making the info.json-with-pid the exact discriminator of a legacy wrapper.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\npub fn sweep_legacy_resident_psyches(\r\n    owlery: &Path,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n) {\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        sweep_legacy_resident_psyche_for(&id, registered, adapters_dir);\r\n    }\r\n}\r\n\r\n/// Sweep ONE endpoint's stranded legacy-resident psyche (see\r\n/// [`sweep_legacy_resident_psyches`]). Positive-match-gated by\r\n/// [`legacy_psyche_should_reap`]; on a match, tree-kill the wrapper (so any harness\r\n/// children it spawned die with it, not orphaned) THEN clear the stale `<id>-psyche` ready\r\n/// registration (pin 3 residue: the info.json + `ready` marker the wrapper wrote, else a\r\n/// dead-pid phantom ready perch lingers — the REMOTE-TRUTH presence-lie class). Loud,\r\n/// non-fatal.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn sweep_legacy_resident_psyche_for(\r\n    id: &str,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n) {\r\n    let perch = perch::resolve_perch_path(id, ParentHint::Infer);\r\n    let Some(info) = spt_store::info::read_info(&perch) else {\r\n        return;\r\n    };\r\n    if info.state != LIVE_AGENT_STATE {\r\n        return;\r\n    }\r\n    let Some(adapter) = info.adapter.as_deref() else {\r\n        return;\r\n    };\r\n    let Ok(manifest) = spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\r\n    else {\r\n        return;\r\n    };\r\n    let Some(expected) = manifest\r\n        .session\r\n        .psyche_init\r\n        .as_ref()\r\n        .and_then(|role| psyche_program_norm(&role.command))\r\n    else {\r\n        return;\r\n    };\r\n    let psyche_id = format!(\"{id}-psyche\");\r\n    let psyche_perch = perch::resolve_perch_path(&psyche_id, ParentHint::Explicit(id));\r\n    let Some(pid) = spt_store::info::read_pid(&psyche_perch) else {\r\n        return; // no nested info.json pid ⇒ not a legacy ready registration\r\n    };\r\n    if !legacy_psyche_should_reap(&psyche_id, &expected, pid) {\r\n        // DECLINE. Loud ONLY when there is a live pid we chose not to kill (an ambiguous\r\n        // or sibling signal) — never for the common dead-pid / no-orphan case.\r\n        if spt_store::proc::is_process_alive(pid) {\r\n            eprintln!(\r\n                \"LEGACY_PSYCHE_SWEEP_DECLINE:{id} pid={pid}: no positive match \\\r\n                 (basename/cmdline did not confirm the `{psyche_id}` legacy wrapper) — left running\"\r\n            );\r\n        }\r\n        return;\r\n    }\r\n    // Positive match: THIS pid is the stranded pre-W3 `<id>-psyche` wrapper. Tree-kill so\r\n    // its harness descendants die with it rather than orphaning.\r\n    spt_store::proc::kill_pid_tree(pid);\r\n    // Pin 3 residue: clear the stale ready registration the wrapper wrote (info.json +\r\n    // `ready` marker) so no dead-pid phantom ready perch is left behind.\r\n    let _ = std::fs::remove_file(psyche_perch.join(\"info.json\"));\r\n    let _ = std::fs::remove_file(perch::resolve_ready_file(&psyche_id, ParentHint::Explicit(id)));\r\n    eprintln!(\r\n        \"LEGACY_PSYCHE_SWEEP_REAP:{id} pid={pid}: reaped stranded pre-W3 resident psyche \\\r\n         + cleared its stale `{psyche_id}` ready registration\"\r\n    );\r\n}\r\n\r\n/// F-030 W5 ONE-SHOT brain-start GC of stranded `.live-bin` own-copy dirs (design\r\n/// §W5, [`REQ-PSYCHE-LEGACY-RESIDENT-SWEEP`]). The retired resident spawn kept a\r\n/// per-endpoint `<perch>/.live-bin/<prog>` PRIVATE COPY of the psyche binary; the\r\n/// ephemeral per-event turn needs none (it runs from the install-dir/PATH snapshot,\r\n/// image-lock exposure now turn-bounded), so a cross-version upgrade leaves a multi-MB\r\n/// `.live-bin` per pre-W5 endpoint forever. Runs ONCE at brain start AFTER\r\n/// [`sweep_legacy_resident_psyches`] (which kills any wrapper running FROM the image →\r\n/// the dir then unlocks). A still-image-locked dir → F-028 C1 DISPLACE (a locked exe\r\n/// can be MOVED even when it can't be unlinked): rename the dir aside to a fresh\r\n/// `.live-bin.old-N` sibling + best-effort remove; a still-locked displaced dir stays\r\n/// uniquely-named for a later boot's GC. NEVER delete-fail-abort. Also sweeps stale\r\n/// `.live-bin.old*` litter a prior locked displace left behind.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\npub fn gc_live_bin_dirs(owlery: &Path) {\r\n    gc_live_bin_dirs_with(owlery, &|d| std::fs::remove_dir_all(d));\r\n}\r\n\r\n/// [`gc_live_bin_dirs`] over an injected `remove` (the crc_swap injectable-seam\r\n/// pattern) so the image-locked DISPLACE path is unit-testable deterministically\r\n/// without a real OS lock: a unit feeds a `remove` that fails for `.live-bin` and\r\n/// asserts the dir is DISPLACED (renamed aside), never errored/aborted.\r\nfn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n        let Ok(entries) = std::fs::read_dir(&perch) else {\r\n            continue;\r\n        };\r\n        for entry in entries.flatten() {\r\n            let name = entry.file_name();\r\n            let name = name.to_string_lossy();\r\n            // The live own-copy dir + any already-displaced `.live-bin.old*` litter.\r\n            if name != \".live-bin\" && !name.starts_with(\".live-bin.old\") {\r\n                continue;\r\n            }\r\n            let dir = entry.path();\r\n            if !dir.is_dir() {\r\n                continue;\r\n            }\r\n            if remove(&dir).is_ok() {\r\n                continue;\r\n            }\r\n            // Still image-locked. An already-displaced `.old*` just waits for the next\r\n            // boot (uniquely named, never a brick); the LIVE `.live-bin` is displaced now\r\n            // (a locked exe can be MOVED even when it can't be unlinked) so the endpoint's\r\n            // perch no longer carries the stale own-copy in place. NEVER abort.\r\n            if name == \".live-bin\" {\r\n                let displaced = fresh_live_bin_old(&dir);\r\n                match std::fs::rename(&dir, &displaced) {\r\n                    Ok(()) => {\r\n                        let _ = remove(&displaced);\r","truncated":true,"truncatedBy":"lines","totalLines":1575,"totalBytes":13321,"outputLines":245,"outputBytes":13321,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\n…\n    for id in perch::list_self_perch_ids(owlery) {\n…\n        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\r\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\r\n        // yet, so `controllable` may be unset) — skip the gate for it.\r\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n        if !is_unbound && info.controllable != Some(true) {\r\n            continue; // harness-hosted relay / legacy — exempt\r\n        }\r\n        if !has_session {\r\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\r\n            // session → the harness child is gone. CUSTODY GATE first: a\r\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\r\n            // mid-revival — normalizing now would land `suspended` under the\r\n            // incoming bind (which carries rest_state forward by design,\r\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\r\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\r\n                eprintln!(\r\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\r\n                );\r\n                continue;\r\n            }\r\n            // Definitive death → terminal normalize (offline + suspended +\r\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\r\n            // so a bind that lands between our read and this write is never\r\n            // clobbered.\r\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\r\n            // a stale `driven_by = Some` — its broker session (the single writer)\r\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\r\n            // it. The split cleanup above already cleared every no-session row;\r\n            // this belt stays for the same-tick read (info is a pre-cleanup\r\n            // snapshot). RACE-FREE for the same no-live-session reason.\r\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\r\n            if info.driven_by.is_some() {\r\n                let _ = spt_store::info::set_driven_by(&perch, None);\r\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\r\n            }\r\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\r\n            offlined.push(id);\r\n        }\r\n    }\r\n    offlined\r\n}\r\n\r\n/// Query the broker for the set of endpoint ids it currently hosts a session for\r\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\r\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\r\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\r\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\r\n    let reply = brain.sessions().ok()?;\r\n    Some(\r\n        reply\r\n            .sessions\r\n            .into_iter()\r\n            .map(|s| s.endpoint)\r\n            .filter(|e| !e.is_empty())\r\n            .collect(),\r\n    )\r\n}\r\n\r\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\r\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\r\n/// [`normalize_basename`](spt_runtime::resolve::normalize_basename) (lowercase /\r\n/// `.exe`-strip / dot-stem) so it keys the same as a live exe basename. `None` for an\r\n/// empty command. Adapter-AGNOSTIC: the expected program is the MANIFEST-declared psyche\r\n/// command, NEVER a hardcoded adapter name (glue-model boundary).\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn psyche_program_norm(command: &str) -> Option<String> {\r\n    let token = command.split_whitespace().next()?;\r\n    let file = Path::new(token).file_name()?.to_string_lossy().into_owned();\r\n    Some(spt_runtime::resolve::normalize_basename(&file))\r\n}\r\n\r\n/// FAIL-SAFE-DECLINE, positive-match-only guard for a stranded legacy-resident\r\n/// `<id>-psyche` process (F-030 W5, REQ-PSYCHE-LEGACY-RESIDENT-SWEEP, pin 2). Kill IFF\r\n/// ALL THREE hold: (a) `pid` is alive, (b) its exe basename == the adapter's\r\n/// MANIFEST-declared psyche program (`expected_prog_norm`, via `normalize_basename` —\r\n/// never a hardcoded adapter name), AND (c) its command line contains the FULL\r\n/// `<id>-psyche` id (baked into the wrapper argv via `{id}`; a sibling\r\n/// `agent-other-psyche` never contains `agent-psyche`). ANY None — dead pid, unreadable\r\n/// basename, basename mismatch (a same-basename SIBLING), or unreadable cmdline — returns\r\n/// `false`, i.e. DECLINE to reap: a missed orphan is a visible idle process (cheap), a\r\n/// wrong-kill is catastrophic (infra never-kill inside the sweep). Pure over the process\r\n/// signals so the reap/spare/decline verdict is unit-testable.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn legacy_psyche_should_reap(psyche_id: &str, expected_prog_norm: &str, pid: u32) -> bool {\r\n    if !spt_store::proc::is_process_alive(pid) {\r\n        return false;\r\n    }\r\n    let basename_ok = spt_store::proc::exe_basename(pid)\r\n        .map(|b| spt_runtime::resolve::normalize_basename(&b) == expected_prog_norm)\r\n        .unwrap_or(false);\r\n    if !basename_ok {\r\n        return false; // unreadable basename OR a same-basename sibling ⇒ decline\r\n    }\r\n    spt_store::proc::process_cmdline(pid)\r\n        .map(|cl| cl.contains(psyche_id))\r\n        .unwrap_or(false) // cmdline unreadable ⇒ fail safe (decline)\r\n}\r\n\r\n/// F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP) — bury the\r\n/// residency era's corpse, NOT resurrect its machinery. A box upgraded across F-030 W4\r\n/// can carry a pre-W3 v0.13.x psyche WRAPPER still ALIVE: it registered its `<id>-psyche`\r\n/// READY perch then BLOCKED FOREVER on `spt ready <id>-psyche --once` (W4's nested-ready\r\n/// fix converted the old accidental READY_FAIL self-reap into a silent hang — KH 2.6\r\n/// invisible-loop, one level up). The per-event driver never delivers to a psyche perch,\r\n/// so it lingers idle, no exit, no fault. This sweep is its INTENDED replacement.\r\n///\r\n/// Runs ONCE at brain start (pin 1), BEFORE the first reconcile — so no per-event turn is\r\n/// in flight yet, and any `<id>-psyche` psyche-program process alive at this instant is\r\n/// unambiguously a stranded pre-W3 resident (fratricide closed by TIMING: the F-030 shim\r\n/// is daemon-spawned PER EVENT and its only alive-window is an in-flight resume turn,\r\n/// which cannot exist before the first reconcile). For each self-perch live-agent id it\r\n/// reads the pid the wrapper's ready registration recorded in the nested `<id>-psyche`\r\n/// info.json — a pure F-030 psyche writes NO info.json (custody is a dedicated\r\n/// `psyche-custody.json`, FORK-2), so `read_pid` is `None` for it and the sweep declines,\r\n/// making the info.json-with-pid the exact discriminator of a legacy wrapper.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\npub fn sweep_legacy_resident_psyches(\r\n    owlery: &Path,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n) {\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        sweep_legacy_resident_psyche_for(&id, registered, adapters_dir);\r\n    }\r\n}\r\n\r\n/// Sweep ONE endpoint's stranded legacy-resident psyche (see\r\n/// [`sweep_legacy_resident_psyches`]). Positive-match-gated by\r\n/// [`legacy_psyche_should_reap`]; on a match, tree-kill the wrapper (so any harness\r\n/// children it spawned die with it, not orphaned) THEN clear the stale `<id>-psyche` ready\r\n/// registration (pin 3 residue: the info.json + `ready` marker the wrapper wrote, else a\r\n/// dead-pid phantom ready perch lingers — the REMOTE-TRUTH presence-lie class). Loud,\r\n/// non-fatal.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\nfn sweep_legacy_resident_psyche_for(\r\n    id: &str,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n) {\r\n    let perch = perch::resolve_perch_path(id, ParentHint::Infer);\r\n    let Some(info) = spt_store::info::read_info(&perch) else {\r\n        return;\r\n    };\r\n    if info.state != LIVE_AGENT_STATE {\r\n        return;\r\n    }\r\n    let Some(adapter) = info.adapter.as_deref() else {\r\n        return;\r\n    };\r\n    let Ok(manifest) = spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\r\n    else {\r\n        return;\r\n    };\r\n    let Some(expected) = manifest\r\n        .session\r\n        .psyche_init\r\n        .as_ref()\r\n        .and_then(|role| psyche_program_norm(&role.command))\r\n    else {\r\n        return;\r\n    };\r\n    let psyche_id = format!(\"{id}-psyche\");\r\n    let psyche_perch = perch::resolve_perch_path(&psyche_id, ParentHint::Explicit(id));\r\n    let Some(pid) = spt_store::info::read_pid(&psyche_perch) else {\r\n        return; // no nested info.json pid ⇒ not a legacy ready registration\r\n    };\r\n    if !legacy_psyche_should_reap(&psyche_id, &expected, pid) {\r\n        // DECLINE. Loud ONLY when there is a live pid we chose not to kill (an ambiguous\r\n        // or sibling signal) — never for the common dead-pid / no-orphan case.\r\n        if spt_store::proc::is_process_alive(pid) {\r\n            eprintln!(\r\n                \"LEGACY_PSYCHE_SWEEP_DECLINE:{id} pid={pid}: no positive match \\\r\n                 (basename/cmdline did not confirm the `{psyche_id}` legacy wrapper) — left running\"\r\n            );\r\n        }\r\n        return;\r\n    }\r\n    // Positive match: THIS pid is the stranded pre-W3 `<id>-psyche` wrapper. Tree-kill so\r\n    // its harness descendants die with it rather than orphaning.\r\n    spt_store::proc::kill_pid_tree(pid);\r\n    // Pin 3 residue: clear the stale ready registration the wrapper wrote (info.json +\r\n    // `ready` marker) so no dead-pid phantom ready perch is left behind.\r\n    let _ = std::fs::remove_file(psyche_perch.join(\"info.json\"));\r\n    let _ = std::fs::remove_file(perch::resolve_ready_file(&psyche_id, ParentHint::Explicit(id)));\r\n    eprintln!(\r\n        \"LEGACY_PSYCHE_SWEEP_REAP:{id} pid={pid}: reaped stranded pre-W3 resident psyche \\\r\n         + cleared its stale `{psyche_id}` ready registration\"\r\n    );\r\n}\r\n\r\n/// F-030 W5 ONE-SHOT brain-start GC of stranded `.live-bin` own-copy dirs (design\r\n/// §W5, [`REQ-PSYCHE-LEGACY-RESIDENT-SWEEP`]). The retired resident spawn kept a\r\n/// per-endpoint `<perch>/.live-bin/<prog>` PRIVATE COPY of the psyche binary; the\r\n/// ephemeral per-event turn needs none (it runs from the install-dir/PATH snapshot,\r\n/// image-lock exposure now turn-bounded), so a cross-version upgrade leaves a multi-MB\r\n/// `.live-bin` per pre-W5 endpoint forever. Runs ONCE at brain start AFTER\r\n/// [`sweep_legacy_resident_psyches`] (which kills any wrapper running FROM the image →\r\n/// the dir then unlocks). A still-image-locked dir → F-028 C1 DISPLACE (a locked exe\r\n/// can be MOVED even when it can't be unlinked): rename the dir aside to a fresh\r\n/// `.live-bin.old-N` sibling + best-effort remove; a still-locked displaced dir stays\r\n/// uniquely-named for a later boot's GC. NEVER delete-fail-abort. Also sweeps stale\r\n/// `.live-bin.old*` litter a prior locked displace left behind.\r\n// [impl->REQ-PSYCHE-LEGACY-RESIDENT-SWEEP]\r\npub fn gc_live_bin_dirs(owlery: &Path) {\r\n    gc_live_bin_dirs_with(owlery, &|d| std::fs::remove_dir_all(d));\r\n}\r\n\r\n/// [`gc_live_bin_dirs`] over an injected `remove` (the crc_swap injectable-seam\r\n/// pattern) so the image-locked DISPLACE path is unit-testable deterministically\r\n/// without a real OS lock: a unit feeds a `remove` that fails for `.live-bin` and\r\n/// asserts the dir is DISPLACED (renamed aside), never errored/aborted.\r\nfn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n        let Ok(entries) = std::fs::read_dir(&perch) else {\r\n            continue;\r\n        };\r\n        for entry in entries.flatten() {\r\n            let name = entry.file_name();\r\n            let name = name.to_string_lossy();\r\n            // The live own-copy dir + any already-displaced `.live-bin.old*` litter.\r\n            if name != \".live-bin\" && !name.starts_with(\".live-bin.old\") {\r\n                continue;\r\n            }\r\n            let dir = entry.path();\r\n            if !dir.is_dir() {\r\n                continue;\r\n            }\r\n            if remove(&dir).is_ok() {\r\n                continue;\r\n            }\r\n            // Still image-locked. An already-displaced `.old*` just waits for the next\r\n            // boot (uniquely named, never a brick); the LIVE `.live-bin` is displaced now\r\n            // (a locked exe can be MOVED even when it can't be unlinked) so the endpoint's\r\n            // perch no longer carries the stale own-copy in place. NEVER abort.\r\n            if name == \".live-bin\" {\r\n                let displaced = fresh_live_bin_old(&dir);\r\n                match std::fs::rename(&dir, &displaced) {\r\n                    Ok(()) => {\r\n                        let _ = remove(&displaced);\r\n                    }\n…\n                }\n            }\n        }\n    }\n}","startLine":690,"lineNumbers":[690,null,692,null,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,null,1008,1009,1010,1011,1012]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2333,"totalBytes":13321,"outputLines":245,"outputBytes":13321,"shownRange":{"start":759,"end":1003},"nextOffset":1004}}},"isError":false,"timestamp":1784293173224}}
{"type":"message","id":"a26f20e9","parentId":"e3fe2c31","timestamp":"2026-07-17T12:59:41.000Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning live reconcile process**"},{"type":"toolCall","id":"call_MhweJoU1eSVRAvpoEIyta6Li|fc_034a6be5a6696b6c016a5a273c69a881919762f1daafadf343","name":"read","arguments":{"i":"Reading live host core sweep","path":"crates/spt-daemon/src/livehost.rs","selector":"130-360"}},{"type":"toolCall","id":"call_ifznbuETPonyNXQk0qE3ySpO|fc_034a6be5a6696b6c016a5a273c69c88191ae12d719ddb29229","name":"read","arguments":{"i":"Reading liveness cleanup sweep","path":"crates/spt-daemon/src/livehost.rs","selector":"650-820"}},{"type":"toolCall","id":"call_PwtYZ48h5wTrK26TSGUU5rPZ|fc_034a6be5a6696b6c016a5a273c69d481918de3b9ffb59e24bb","name":"read","arguments":{"i":"Reading project writer cycle","path":"crates/spt-daemon/src/projwriter.rs","selector":"590-690"}},{"type":"toolCall","id":"call_L8xFQEbLcp4fJLUsF4wj9j98|fc_034a6be5a6696b6c016a5a273c6b38819187837641c524f7a7","name":"grep","arguments":{"i":"Finding pulse loop work","pattern":"DEFAULT_PULSE_PERIOD|pulse_period|run_pulse_loop|thread::spawn","path":"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/psyche.rs;crates/spt-daemon/src","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":10419,"output":230,"cacheRead":73216,"cacheWrite":0,"totalTokens":83865,"reasoningTokens":14,"cost":{"input":0.052095,"output":0.0069,"cacheRead":0.036608,"cacheWrite":0,"total":0.09560300000000001}},"stopReason":"toolUse","timestamp":1784293173232,"responseId":"resp_034a6be5a6696b6c016a5a2735e43881918342d192d4477371","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27382b908191818fcdda1691293a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWic8ny-cX9lOZ_uHlbnT3ZbFW6cSq9Sv3QoPmfVlKJj6wRHXhUzapgIlvA4EboJcCzEBwxbq1OTqWA-DOq5eBK2hlWDm3La-HwV22P8HSr7Fjy6eBmw6t6dc4vcP0Su0CmIZHPGa2bAaq_BpDbzXVfapfb9XHNF_FetShg1m3fzqtyseGmHURw6MCgzpEVNrjHi5j-_jUCbj2AlxzAP16Z_27aTJN7vtTqQYAkmk3NMtA72WcscCJ3BHtRAJbX86hGJjWBuklsOq0jBP6OYHKMepelnpaLp3T37LrvvVfbXfoTZ6V_Xy3i0zDq4sfKOn9vP4tkfyqJLLf4hw3pTMkNM4im72ECf1bo6bCUWD11e6fnXJErkzC90wwuVKoi7q5T8khDHE0E7R0K5eLmdOwASNizrD3aLrTValMui4FHX0iiLrCgUZ58JJ3FsZ2Pf6O4a2AHQcfNfPewhM3CNgOuQ4kCX6_lfz2V4qxnXIYuPE1Rz5g5OzXcdouu5Ni-eBPHwqHkdM4qm0j65CVfmEeo-peFH5JNn5Bmd5hFXo6dZua4BP6k-xD1JGIXfYbFfY5QN-Pq3k81CoKtZ-nqP_xtiQ_j9Bg9KxBP9k3epXd07_s6ESxL-fOWYQm_jRius1L2eAO7gw_3Veymb4GScq72wT4UM5xW3Mt5W4Q41KO9Lbli1cr5q3GjgA-xdWNfT4oyRjjOWjaJQ1SVlN1gvT4E5mioXvSmOqWdX8YucKvOFUaN39I5Du5k5YzaYOXxuQ26D9yXIdZOpILUnV04gDpMszpE_acx_bUe6IChreFKBNPWCSxwzN9k8eTAgg9fvCM-wClIk5NvxYZZxia4MpjRZO2wu151mRemJMtCiO--3e2bNMjgnP4S3-UsQ1ZHvvui8KnRrxIfNB8NiCY0Kry00UqNeMGwa9mX9NFXtlx7UvHPh8NgNDs3qgr1uB4qG1Xzojadb_YzzN4qXBemtbyGgBtA==","summary":[{"type":"summary_text","text":"**Planning live reconcile process**"}]},{"id":"fc_034a6be5a6696b6c016a5a273c69a881919762f1daafadf343","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading live host core sweep\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":\"130-360\"}","call_id":"call_MhweJoU1eSVRAvpoEIyta6Li","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a273c69c88191ae12d719ddb29229","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading liveness cleanup sweep\",\"path\":\"crates/spt-daemon/src/livehost.rs\",\"selector\":\"650-820\"}","call_id":"call_ifznbuETPonyNXQk0qE3ySpO","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a273c69d481918de3b9ffb59e24bb","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project writer cycle\",\"path\":\"crates/spt-daemon/src/projwriter.rs\",\"selector\":\"590-690\"}","call_id":"call_PwtYZ48h5wTrK26TSGUU5rPZ","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a273c6b38819187837641c524f7a7","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding pulse loop work\",\"pattern\":\"DEFAULT_PULSE_PERIOD|pulse_period|run_pulse_loop|thread::spawn\",\"path\":\"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/psyche.rs;crates/spt-daemon/src\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_L8xFQEbLcp4fJLUsF4wj9j98","name":"grep"}]},"duration":7766.625699996948,"ttft":3015.022699996829,"contextSnapshot":{"promptTokens":83635,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MhweJoU1eSVRAvpoEIyta6Li|fc_034a6be5a6696b6c016a5a273c69a881919762f1daafadf343","toolName":"read","startedAt":"2026-07-17T12:59:41.000Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Reading live host core sweep"},"id":"90c2d879","parentId":"a26f20e9","timestamp":"2026-07-17T12:59:41.000Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ifznbuETPonyNXQk0qE3ySpO|fc_034a6be5a6696b6c016a5a273c69c88191ae12d719ddb29229","toolName":"read","startedAt":"2026-07-17T12:59:41.000Z","args":{"path":"crates/spt-daemon/src/livehost.rs"},"intent":"Reading liveness cleanup sweep"},"id":"f0130b75","parentId":"90c2d879","timestamp":"2026-07-17T12:59:41.000Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PwtYZ48h5wTrK26TSGUU5rPZ|fc_034a6be5a6696b6c016a5a273c69d481918de3b9ffb59e24bb","toolName":"read","startedAt":"2026-07-17T12:59:41.000Z","args":{"path":"crates/spt-daemon/src/projwriter.rs"},"intent":"Reading project writer cycle"},"id":"95c6cfd2","parentId":"f0130b75","timestamp":"2026-07-17T12:59:41.000Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_L8xFQEbLcp4fJLUsF4wj9j98|fc_034a6be5a6696b6c016a5a273c6b38819187837641c524f7a7","toolName":"grep","startedAt":"2026-07-17T12:59:41.000Z","args":{"path":"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/psyche.rs;crates/spt-daemon/src"},"intent":"Finding pulse loop work"},"id":"ad2952ab","parentId":"95c6cfd2","timestamp":"2026-07-17T12:59:41.000Z"}
{"type":"message","id":"c55ac748","parentId":"ad2952ab","timestamp":"2026-07-17T12:59:41.015Z","message":{"role":"toolResult","toolCallId":"call_PwtYZ48h5wTrK26TSGUU5rPZ|fc_034a6be5a6696b6c016a5a273c69d481918de3b9ffb59e24bb","toolName":"read","content":[{"type":"text","text":"fn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n    for anc in dir.ancestors() {\n…\n        if g.is_file() {\n…\n        }\n    }\n    None\n}\n\n/// (mtime epoch-ms, len) of a marker file — the cheap identity stamp.\nfn stamp_of(p: &Path) -> Option<(u64, u64)> {\n    let meta = std::fs::metadata(p).ok()?;\n    let mtime = meta\n        .modified()\n        .ok()?\n        .duration_since(std::time::UNIX_EPOCH)\n        .ok()?\n        .as_millis() as u64;\n    Some((mtime, meta.len()))\n}\n\nfn env_ms(name: &str, default: u64) -> u64 {\n    std::env::var(name)\n        .ok()\n        .and_then(|v| v.parse().ok())\n        .unwrap_or(default)\n}\n\n/// Spawn the brain's index-writer host: ONE thread (single-flight by\n/// construction) that loads the persisted index, runs the boot reconcile\n/// (fingerprint-gated: a warm start with an unchanged generation scans\n/// nothing), then drains + debounces + coalesces the invalidation queue and\n/// runs the periodic full backstop until `stop`. Mirrors\n/// `livehost::spawn_live_host`; the thread dies with the brain and the next\n/// brain rehydrates from the persisted index (ready without warm).\n// [impl->REQ-PROJECT-INDEX-WRITER]\n// [impl->REQ-PROJECT-INDEX-INVALIDATION]\npub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n    std::thread::spawn(move || {\n        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\n        // untouched): rigs that need a writer-silent daemon set it — the\n        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\n        if std::env::var_os(\"SPT_PROJINDEX_DISABLE\").is_some() {\n            return;\n        }\n        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\n        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\n        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\n\n        let mut engine = WriterEngine::new(WriterPaths::production());\n        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\n\n        // Boot reconcile: global but NOT forced — a warm start over an\n        // unchanged store exits without a scan (the cold/warm start gate).\n        let boot = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n        let boot = Coalesced { global: true, ..boot };\n        if let Err(e) = engine.reconcile(&boot, false) {\n            engine.record_failure(e);\n        }\n\n        let mut since_periodic = Duration::ZERO;\n        while !stop.load(Ordering::SeqCst) {\n            // Sleep one poll slice (sliced so a stop lands promptly).\n            let mut left = poll.as_millis() as u64;\n            while left > 0 && !stop.load(Ordering::SeqCst) {\n                let step = left.min(100);\n                std::thread::sleep(Duration::from_millis(step));\n                left -= step;\n            }\n            if stop.load(Ordering::SeqCst) {\n                break;\n            }\n            since_periodic += poll;\n\n            let due_periodic = since_periodic >= periodic;\n            let has_events = projinval::pending_at(&engine.paths.invalidations_dir);\n            if !has_events && !due_periodic {\n                continue;\n            }\n\n            if has_events {\n                // Debounce: let the burst land, then drain it ALL — the\n                // coalescing window (multiple invalidations → one refresh).\n                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\n                std::thread::sleep(debounce);\n                engine.stats.pending_refresh = true;\n                engine.write_stats();\n            }\n            let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\n            if due_periodic {\n                since_periodic = Duration::ZERO;\n            }\n            let req = if due_periodic { Coalesced { global: true, ..req } } else { req };\n            if req.is_empty() && !due_periodic {\n                continue; // a racer consumed it (never happens in production)\n            }\n            if let Err(e) = engine.reconcile(&req, due_periodic) {\n                engine.record_failure(e);\n            }\n        }\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use spt_store::contextstore::ContextStore;\n    use spt_store::projinval::InvalScope;\n    use std::time::Instant;\n…\n}\n\n[Showing lines 589-693 of 1270. Use :694 to continue]"}],"details":{"truncation":{"content":"        }\r\n    }\r\n    None\r\n}\r\n\r\n/// (mtime epoch-ms, len) of a marker file — the cheap identity stamp.\r\nfn stamp_of(p: &Path) -> Option<(u64, u64)> {\r\n    let meta = std::fs::metadata(p).ok()?;\r\n    let mtime = meta\r\n        .modified()\r\n        .ok()?\r\n        .duration_since(std::time::UNIX_EPOCH)\r\n        .ok()?\r\n        .as_millis() as u64;\r\n    Some((mtime, meta.len()))\r\n}\r\n\r\nfn env_ms(name: &str, default: u64) -> u64 {\r\n    std::env::var(name)\r\n        .ok()\r\n        .and_then(|v| v.parse().ok())\r\n        .unwrap_or(default)\r\n}\r\n\r\n/// Spawn the brain's index-writer host: ONE thread (single-flight by\r\n/// construction) that loads the persisted index, runs the boot reconcile\r\n/// (fingerprint-gated: a warm start with an unchanged generation scans\r\n/// nothing), then drains + debounces + coalesces the invalidation queue and\r\n/// runs the periodic full backstop until `stop`. Mirrors\r\n/// `livehost::spawn_live_host`; the thread dies with the brain and the next\r\n/// brain rehydrates from the persisted index (ready without warm).\r\n// [impl->REQ-PROJECT-INDEX-WRITER]\r\n// [impl->REQ-PROJECT-INDEX-INVALIDATION]\r\npub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\r\n        // untouched): rigs that need a writer-silent daemon set it — the\r\n        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\r\n        if std::env::var_os(\"SPT_PROJINDEX_DISABLE\").is_some() {\r\n            return;\r\n        }\r\n        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\r\n        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\r\n        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\r\n\r\n        let mut engine = WriterEngine::new(WriterPaths::production());\r\n        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\r\n\r\n        // Boot reconcile: global but NOT forced — a warm start over an\r\n        // unchanged store exits without a scan (the cold/warm start gate).\r\n        let boot = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\r\n        let boot = Coalesced { global: true, ..boot };\r\n        if let Err(e) = engine.reconcile(&boot, false) {\r\n            engine.record_failure(e);\r\n        }\r\n\r\n        let mut since_periodic = Duration::ZERO;\r\n        while !stop.load(Ordering::SeqCst) {\r\n            // Sleep one poll slice (sliced so a stop lands promptly).\r\n            let mut left = poll.as_millis() as u64;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n            if stop.load(Ordering::SeqCst) {\r\n                break;\r\n            }\r\n            since_periodic += poll;\r\n\r\n            let due_periodic = since_periodic >= periodic;\r\n            let has_events = projinval::pending_at(&engine.paths.invalidations_dir);\r\n            if !has_events && !due_periodic {\r\n                continue;\r\n            }\r\n\r\n            if has_events {\r\n                // Debounce: let the burst land, then drain it ALL — the\r\n                // coalescing window (multiple invalidations → one refresh).\r\n                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\r\n                std::thread::sleep(debounce);\r\n                engine.stats.pending_refresh = true;\r\n                engine.write_stats();\r\n            }\r\n            let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\r\n            if due_periodic {\r\n                since_periodic = Duration::ZERO;\r\n            }\r\n            let req = if due_periodic { Coalesced { global: true, ..req } } else { req };\r\n            if req.is_empty() && !due_periodic {\r\n                continue; // a racer consumed it (never happens in production)\r\n            }\r\n            if let Err(e) = engine.reconcile(&req, due_periodic) {\r\n                engine.record_failure(e);\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use spt_store::contextstore::ContextStore;\r\n    use spt_store::projinval::InvalScope;\r\n    use std::time::Instant;\r","truncated":true,"truncatedBy":"lines","totalLines":682,"totalBytes":4345,"outputLines":105,"outputBytes":4345,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n    for anc in dir.ancestors() {\n…\n        if g.is_file() {\n…\n        }\r\n    }\r\n    None\r\n}\r\n\r\n/// (mtime epoch-ms, len) of a marker file — the cheap identity stamp.\r\nfn stamp_of(p: &Path) -> Option<(u64, u64)> {\r\n    let meta = std::fs::metadata(p).ok()?;\r\n    let mtime = meta\r\n        .modified()\r\n        .ok()?\r\n        .duration_since(std::time::UNIX_EPOCH)\r\n        .ok()?\r\n        .as_millis() as u64;\r\n    Some((mtime, meta.len()))\r\n}\r\n\r\nfn env_ms(name: &str, default: u64) -> u64 {\r\n    std::env::var(name)\r\n        .ok()\r\n        .and_then(|v| v.parse().ok())\r\n        .unwrap_or(default)\r\n}\r\n\r\n/// Spawn the brain's index-writer host: ONE thread (single-flight by\r\n/// construction) that loads the persisted index, runs the boot reconcile\r\n/// (fingerprint-gated: a warm start with an unchanged generation scans\r\n/// nothing), then drains + debounces + coalesces the invalidation queue and\r\n/// runs the periodic full backstop until `stop`. Mirrors\r\n/// `livehost::spawn_live_host`; the thread dies with the brain and the next\r\n/// brain rehydrates from the persisted index (ready without warm).\r\n// [impl->REQ-PROJECT-INDEX-WRITER]\r\n// [impl->REQ-PROJECT-INDEX-INVALIDATION]\r\npub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\r\n    std::thread::spawn(move || {\r\n        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\r\n        // untouched): rigs that need a writer-silent daemon set it — the\r\n        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\r\n        if std::env::var_os(\"SPT_PROJINDEX_DISABLE\").is_some() {\r\n            return;\r\n        }\r\n        let poll = Duration::from_millis(env_ms(\"SPT_PROJINDEX_POLL_MS\", POLL_MS));\r\n        let debounce = Duration::from_millis(env_ms(\"SPT_PROJINDEX_DEBOUNCE_MS\", DEBOUNCE_MS));\r\n        let periodic = Duration::from_millis(env_ms(\"SPT_PROJINDEX_PERIODIC_MS\", PERIODIC_MS));\r\n\r\n        let mut engine = WriterEngine::new(WriterPaths::production());\r\n        engine.write_stats(); // the loaded-not-yet-reconciled truth is visible immediately\r\n\r\n        // Boot reconcile: global but NOT forced — a warm start over an\r\n        // unchanged store exits without a scan (the cold/warm start gate).\r\n        let boot = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\r\n        let boot = Coalesced { global: true, ..boot };\r\n        if let Err(e) = engine.reconcile(&boot, false) {\r\n            engine.record_failure(e);\r\n        }\r\n\r\n        let mut since_periodic = Duration::ZERO;\r\n        while !stop.load(Ordering::SeqCst) {\r\n            // Sleep one poll slice (sliced so a stop lands promptly).\r\n            let mut left = poll.as_millis() as u64;\r\n            while left > 0 && !stop.load(Ordering::SeqCst) {\r\n                let step = left.min(100);\r\n                std::thread::sleep(Duration::from_millis(step));\r\n                left -= step;\r\n            }\r\n            if stop.load(Ordering::SeqCst) {\r\n                break;\r\n            }\r\n            since_periodic += poll;\r\n\r\n            let due_periodic = since_periodic >= periodic;\r\n            let has_events = projinval::pending_at(&engine.paths.invalidations_dir);\r\n            if !has_events && !due_periodic {\r\n                continue;\r\n            }\r\n\r\n            if has_events {\r\n                // Debounce: let the burst land, then drain it ALL — the\r\n                // coalescing window (multiple invalidations → one refresh).\r\n                // [impl->REQ-PROJECT-INDEX-INVALIDATION]\r\n                std::thread::sleep(debounce);\r\n                engine.stats.pending_refresh = true;\r\n                engine.write_stats();\r\n            }\r\n            let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));\r\n            if due_periodic {\r\n                since_periodic = Duration::ZERO;\r\n            }\r\n            let req = if due_periodic { Coalesced { global: true, ..req } } else { req };\r\n            if req.is_empty() && !due_periodic {\r\n                continue; // a racer consumed it (never happens in production)\r\n            }\r\n            if let Err(e) = engine.reconcile(&req, due_periodic) {\r\n                engine.record_failure(e);\r\n            }\r\n        }\r\n    })\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use spt_store::contextstore::ContextStore;\r\n    use spt_store::projinval::InvalScope;\r\n    use std::time::Instant;\r\n…\n}","startLine":581,"lineNumbers":[581,582,null,587,null,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,null,1269]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\projwriter.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1270,"totalBytes":4345,"outputLines":105,"outputBytes":4345,"shownRange":{"start":589,"end":693},"nextOffset":694}}},"isError":false,"timestamp":1784293181014}}
{"type":"message","id":"542f2ca4","parentId":"c55ac748","timestamp":"2026-07-17T12:59:41.022Z","message":{"role":"toolResult","toolCallId":"call_L8xFQEbLcp4fJLUsF4wj9j98|fc_034a6be5a6696b6c016a5a273c6b38819187837641c524f7a7","toolName":"grep","content":[{"type":"text","text":"# crates/spt-daemon/src/\n## livehost.rs\n 3|//!\n*4|//! This is the production caller `run_pulse_loop` lacked: the brain instantiates\n 5|//! a [`BrainLifecycle`] per hosted **live** endpoint and drives its config-paced\n 6|//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of\n 7|//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from\n...\n 636|        let stop = Arc::clone(&stop);\n*637|        std::thread::spawn(move || {\n*638|            lifecycle.run_pulse_loop(Some(&session_id), &stop, reason, |_report| {});\n 639|        })\n 640|    };\n 641|    set.insert(id, HostedLife { stop, thread: handle });\n...\n 1037|pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n*1038|    std::thread::spawn(move || {\n 1039|        let set = Arc::new(LiveSet::new());\n 1040|        {\n 1041|            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n...\n 1159|        DaemonConfig {\n*1160|            pulse_period: Duration::from_millis(15),\n 1161|            ..DaemonConfig::default()\n 1162|        }\n 1163|    }\n...\n 1657|            let b2 = Arc::clone(&broker);\n*1658|            std::thread::spawn(move || {\n 1659|                let _ = b2.serve();\n 1660|            });\n 1661|            let mut brain = {\n## applyhost.rs\n 513|        let serve = Arc::clone(&broker);\n*514|        let handle = std::thread::spawn(move || {\n 515|            let _ = serve.serve();\n 516|        });\n 517|        ServedBroker {\n## autostart.rs\n 133|        let (tx, rx) = mpsc::channel();\n*134|        let handle = std::thread::spawn(move || {\n 135|            replay_startup_endpoints(\"bogus-broker-socket-never-dialed\");\n 136|            let _ = tx.send(());\n 137|        });\n## brain.rs\n 2042|        let brain_handle =\n*2043|            thread::spawn(move || Brain::cold_start(&connect_name, 1).expect(\"brain cold_start\"));\n 2044|\n 2045|        let mut server = listener.accept().expect(\"accept the brain\");\n 2046|        crate::transport::recv_hello(&mut server, Role::Brain).expect(\"stub recv_hello\");\n...\n 2054|        let (feed, frames) = sync_channel::<Envelope>(64);\n*2055|        let server_thread = thread::spawn(move || {\n 2056|            while let Ok(env) = frames.recv() {\n 2057|                if write_frame(&mut send, &env).is_err() {\n 2058|                    break;\n## brainproc.rs\n 189|    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n*190|    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n 191|    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n 192|    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n 193|    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n...\n 237|    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n*238|    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n 239|    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n 240|    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n 241|    // shell waker). Online-only is staged behind the interim `api listen`\n...\n 1129|    let canonical_exe = std::env::current_exe().ok();\n*1130|    let handle = thread::spawn(move || {\n 1131|        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1132|        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1133|        // readiness-only (no old-gen control plane to drain).\n## broker.rs\n 1055|        let writer_blocked = Arc::clone(&write_blocked_since);\n*1056|        let writer = thread::spawn(move || {\n 1057|            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 1058|        });\n 1059|        self.controller = Some(ControllerSink {\n...\n 1245|        let writer =\n*1246|            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1247|        self.viewers.insert(\n 1248|            vid,\n 1249|            ViewerSink {\n...\n 1912|        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1913|        let writer = thread::spawn(move || input_writer(session, rx));\n 1914|        Arc::new(InputWriter {\n 1915|            tx,\n 1916|            backpressure: AtomicBool::new(false),\n...\n 2114|            let sup_endpoint = endpoint_id.to_string();\n*2115|            thread::spawn(move || {\n 2116|                run_inject_worker_supervised(\n 2117|                    sup_child,\n 2118|                    sup_faulted,\n...\n 2945|        let me = Arc::clone(self);\n*2946|        Ok(thread::spawn(move || {\n 2947|            let _ = me.handle_conn(conn);\n 2948|        }))\n 2949|    }\n...\n 3006|        // stays un-reapable as a live-but-wedged writer even under child output.\n*3007|        let writer = thread::spawn(move || for _ in rx.iter() {});\n 3008|        recover_log(&log).controller = Some(ControllerSink {\n 3009|            tx,\n 3010|            send,\n...\n 3756|        let waiter = Arc::clone(&session);\n*3757|        thread::spawn(move || {\n 3758|            if let Ok(status) = waiter.wait() {\n 3759|                let ev = ExitEvent {\n 3760|                    session_id: id,\n...\n 5225|        let mut client = client;\n*5226|        thread::spawn(move || {\n 5227|            let r = read_frame(&mut client).ok();\n 5228|            let _ = tx.send(r);\n 5229|        });\n...\n 5255|            // Empty initial batch (no size/replay needed for this assertion).\n*5256|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 5257|\n 5258|            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 5259|            evicted.store(true, Ordering::Release);\n...\n 5281|            let w_send = Arc::clone(&send);\n*5282|            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 5283|\n 5284|            // A clean teardown: drop tx with the flag still false.\n 5285|            drop(tx);\n...\n 5330|                evicted,\n*5331|                _writer: thread::spawn(|| {}),\n 5332|            },\n 5333|        );\n 5334|\n...\n 5410|            write_blocked_since: Arc::new(Mutex::new(None)),\n*5411|            _writer: thread::spawn(|| {}),\n 5412|        });\n 5413|        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 5414|        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n...\n 5422|                    evicted: Arc::new(AtomicBool::new(false)),\n*5423|                    _writer: thread::spawn(|| {}),\n 5424|                },\n 5425|            );\n 5426|\n...\n 5523|            endpoint: String::new(),\n*5524|            _writer: thread::spawn(|| {}),\n 5525|        };\n 5526|        (w, rx)\n 5527|    }\n...\n 5661|        let f = Arc::clone(&floor);\n*5662|        let _ = thread::spawn(move || {\n 5663|            let _g = f.lock().unwrap();\n 5664|            panic!(\"poison the inject floor\");\n 5665|        })\n...\n 5688|        let s = Arc::clone(&sessions);\n*5689|        let _ = thread::spawn(move || {\n 5690|            let _g = s.lock().unwrap();\n 5691|            panic!(\"poison the sessions map mid-attach\");\n 5692|        })\n...\n 5746|        let l = Arc::clone(&log);\n*5747|        let _ = thread::spawn(move || {\n 5748|            let _g = l.lock().unwrap();\n 5749|            panic!(\"poison the output log mid-append\");\n 5750|        })\n...\n 6423|        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*6424|        let writer = thread::spawn(|| {});\n 6425|        for _ in 0..1000 {\n 6426|            if writer.is_finished() {\n 6427|                break;\n...\n 6465|        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*6466|        let writer = thread::spawn(move || {\n 6467|            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 6468|        });\n 6469|        log.controller = Some(ControllerSink {\n...\n 6503|        let write_blocked_since = Arc::new(Mutex::new(blocked));\n*6504|        let writer = thread::spawn(move || {\n 6505|            let _ = rx.recv(); // parked (live, not finished) until tx drops\n 6506|        });\n 6507|        log.controller = Some(ControllerSink {\n## config.rs\n 4|//! In the no-daemon interim model the pulse cadence was a hard-coded\n*5|//! `spt_live::pulse::DEFAULT_PULSE_PERIOD` (5s). Consolidation (REQ-DAEMON-1)\n 6|//! folds the pulse loop into the brain as a *scheduled* in-process loop whose\n 7|//! period is **durable and configurable**, sourced from a small JSON file under\n 8|//! the spt home (`<spt_home>/daemon.json`) and falling back to the default when\n...\n 21|/// override it per machine.\n*22|pub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\n 23|\n 24|/// Default drop-file precedence protection window (epoch-ms), mirroring the\n 25|/// interim `spt_live` guard. Surfaced here so the one config source owns it.\n...\n 92|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n*93|    pulse_period_ms: Option<u64>,\n 94|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 95|    protection_window_ms: Option<u64>,\n 96|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n...\n 128|/// Resolved daemon configuration. The brain's scheduled loops read their cadence\n*129|/// from `pulse_period`; the drop-ingest guard reads `protection_window_ms`.\n 130|/// (No longer `Copy` — `resources_blurb` carries a `String`; callers clone.)\n 131|#[derive(Debug, Clone, PartialEq, Eq)]\n 132|pub struct DaemonConfig {\n*133|    /// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).\n*134|    pub pulse_period: Duration,\n 135|    /// The drop-file precedence protection window in epoch-ms (6.5).\n 136|    pub protection_window_ms: u64,\n 137|    /// The orphan-watch grace window (B7): the recovery wait before a\n...\n 204|        DaemonConfig {\n*205|            pulse_period: DEFAULT_PULSE_PERIOD,\n 206|            protection_window_ms: DEFAULT_PROTECTION_WINDOW_MS,\n 207|            crash_grace: DEFAULT_CRASH_GRACE,\n 208|            full_auto_update: false, // gated by default (REQ-UPD-4)\n...\n 254|        DaemonConfig {\n*255|            pulse_period: file\n*256|                .pulse_period_ms\n 257|                .map(Duration::from_millis)\n*258|                .unwrap_or(d.pulse_period),\n 259|            protection_window_ms: file.protection_window_ms.unwrap_or(d.protection_window_ms),\n 260|            crash_grace: file\n 261|                .crash_grace_ms\n...\n 302|        let file = DaemonConfigFile {\n*303|            pulse_period_ms: Some(self.pulse_period.as_millis() as u64),\n 304|            protection_window_ms: Some(self.protection_window_ms),\n 305|            crash_grace_ms: Some(self.crash_grace.as_millis() as u64),\n 306|            full_auto_update: Some(self.full_auto_update),\n...\n 362|        assert_eq!(cfg, DaemonConfig::default());\n*363|        assert_eq!(cfg.pulse_period, DEFAULT_PULSE_PERIOD);\n 364|    }\n 365|\n 366|    #[test] // [unit->REQ-DAEMON-1] the pulse period is config-driven, not a constant.\n*367|    fn pulse_period_is_config_driven() {\n 368|        let dir = tempfile::tempdir().unwrap();\n 369|        let path = dir.path().join(\"daemon.json\");\n*370|        std::fs::write(&path, r#\"{\"pulse_period_ms\": 250}\"#).unwrap();\n 371|\n 372|        let cfg = DaemonConfig::load_from(&path);\n*373|        assert_eq!(cfg.pulse_period, Duration::from_millis(250));\n 374|        assert_ne!(\n*375|            cfg.pulse_period, DEFAULT_PULSE_PERIOD,\n 376|            \"must override the default\"\n 377|        );\n 378|        // The unspecified field keeps its default.\n...\n 394|        let cfg = DaemonConfig {\n*395|            pulse_period: Duration::from_millis(750),\n 396|            protection_window_ms: 99,\n 397|            crash_grace: Duration::from_millis(1234),\n 398|            full_auto_update: true,\n...\n 527|        // Unspecified fields keep their defaults.\n*528|        assert_eq!(cfg.pulse_period, DEFAULT_PULSE_PERIOD);\n 529|        // An absent file yields the default grace.\n 530|        assert_eq!(\n 531|            DaemonConfig::load_from(&dir.path().join(\"nope.json\")).crash_grace,\n...\n 576|        // key) loads as empty — forward/back-compat, never a parse failure.\n*577|        std::fs::write(&path, r#\"{\"pulse_period_ms\": 5000}\"#).unwrap();\n 578|        assert!(\n 579|            DaemonConfig::load_from(&path).startup_endpoints.is_empty(),\n 580|            \"a file without the key back-loads as empty, not an error\"\n...\n 599|            let seeded = DaemonConfig {\n*600|                pulse_period: Duration::from_millis(1234),\n 601|                detached_subnets: vec![\"work\".to_string()],\n 602|                ..DaemonConfig::default()\n 603|            };\n## daemon.rs\n 192|                    let serve_broker = Arc::clone(&broker);\n*193|                    thread::spawn(move || {\n 194|                        let _ = serve_broker.serve();\n 195|                    });\n 196|                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n...\n 212|                        let broker = Arc::clone(&broker);\n*213|                        thread::spawn(move || net_retry_attach(broker));\n 214|                    }\n 215|                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\n 216|                    // bring saved startup defaults back up against the broker we\n...\n 220|                    // [impl->REQ-ENDPOINT-AUTOSTART]\n*221|                    thread::spawn(|| {\n 222|                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\n 223|                    });\n 224|                    // The node-local docs server (ADR-0036 §4): broker-side so\n...\n 263|            let hub = Arc::clone(&digest_hub);\n*264|            thread::spawn(move || {\n 265|                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\n 266|            });\n 267|        }\n...\n 277|            let hub = Arc::clone(&drive_hub);\n*278|            thread::spawn(move || {\n 279|                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\n 280|            });\n 281|        }\n...\n 294|            let broker = Arc::clone(broker);\n*295|            thread::spawn(move || {\n 296|                let _ = crate::tunnelhub::serve_tunnel_control(\n 297|                    &crate::endpoint::tunnel_socket_name(),\n 298|                    hub,\n...\n 1704|            let serve_name = name.clone();\n*1705|            thread::spawn(move || {\n 1706|                let _ = serve_seed_control(&serve_name, srv);\n 1707|            });\n 1708|            for _ in 0..400 {\n## deadline.rs\n 39|use crate::brainproc::StartReason;\n*40|use crate::config::DEFAULT_PULSE_PERIOD;\n 41|\n 42|/// The canonical anchor path for a loop key: `<spt_home>/deadline-<key>.json`.\n 43|///\n...\n 73|        }\n*74|        let default_ms = DEFAULT_PULSE_PERIOD.as_millis() as u64;\n 75|        default_ms.max(1)\n 76|    }\n 77|\n...\n 292|        let got = DeadlineAnchor::effective_interval(0);\n*293|        assert_eq!(got, DEFAULT_PULSE_PERIOD.as_millis() as u64);\n 294|        assert!(got > 0, \"the derive must never divide by zero\");\n 295|        // A non-zero interval passes through untouched.\n 296|        assert_eq!(DeadlineAnchor::effective_interval(250), 250);\n## digesthub.rs\n 179|        let hub = Arc::clone(&hub);\n*180|        thread::spawn(move || {\n 181|            let _ = handle_conn(conn, &hub);\n 182|        });\n 183|    }\n## dispatch.rs\n 570|            pool.fetch_add(1, Ordering::Relaxed);\n*571|            thread::spawn(move || {\n 572|                let started = Instant::now();\n 573|                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n 574|                pool.fetch_sub(1, Ordering::Relaxed);\n...\n 1419|) -> thread::JoinHandle<()> {\n*1420|    thread::spawn(move || {\n 1421|        let paths = DispatchPaths::production();\n 1422|        if let Err(e) =\n 1423|            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## drivehub.rs\n 185|        let hub = Arc::clone(&hub);\n*186|        thread::spawn(move || {\n 187|            let _ = handle_conn(conn, &hub);\n 188|        });\n 189|    }\n## effect.rs\n 837|        let j1 = Arc::clone(&j);\n*838|        let blocker = std::thread::spawn(move || {\n 839|            j1.apply_once(k(1, 1), EffectKind::PtyWrite, || {\n 840|                entered_tx.send(()).expect(\"signal entered\");\n 841|                // Block inside the effect — the wedge a non-draining PTY induces.\n...\n 856|        let (done_tx, done_rx) = mpsc::channel::<()>();\n*857|        let second = std::thread::spawn(move || {\n 858|            let o = j2\n 859|                .apply_once(k(1, 2), EffectKind::PtyWrite, || Ok(()))\n 860|                .expect(\"apply_once #2\");\n## lifecycle.rs\n 301|    /// sync side-effect both succeeded; `Some(Err(reason))` ⇒ the turn OR the\n*302|    /// commune-sync failed (a strike — [`run_pulse_loop`] feeds it the failure budget).\n 303|    pub turn_outcome: Option<Result<(), String>>,\n 304|}\n 305|\n...\n 506|    /// The configured pulse period (config-driven, not a constant).\n*507|    pub fn pulse_period(&self) -> Duration {\n*508|        self.cfg.pulse_period\n 509|    }\n 510|\n 511|    /// Base substitution keys spt-core fills for the lifecycle templates.\n...\n 685|    /// absolute-deadline grid, not a phase-relative flat sleep.** The old loop\n*686|    /// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the\n 687|    /// restart instant on every restart. Now the loop rehydrates a\n 688|    /// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session\n 689|    /// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent\n...\n 699|    // [impl->REQ-DAEMON-1]\n*700|    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\n 701|        &self,\n 702|        session_id: Option<&str>,\n 703|        stop: &AtomicBool,\n...\n 709|        let key = session_id.unwrap_or(\"pulse\");\n*710|        let interval_ms = self.cfg.pulse_period.as_millis() as u64;\n 711|        // A disk error must not stop the pulse: degrade to an in-memory anchor at\n 712|        // `now` (fresh-phase, unpersisted) so cadence continues regardless.\n 713|        let anchor = DeadlineAnchor::open(key, interval_ms, reason, now_ms())\n...\n 908|    fn event_turn_timeout(&self) -> Duration {\n*909|        event_turn_timeout_for(self.pulse_period())\n 910|    }\n 911|\n 912|    /// The agent's OWN subnet — the parent endpoint's `home_subnet` (info.json),\n...\n 935|    /// non-zero exit, or the 7.3 null-stdout shape) — a failure is fed the W1 failure\n*936|    /// budget by [`run_pulse_loop`], NEVER a respawn (nothing resident to respawn).\n 937|    ///\n 938|    /// ── PSYCHE-TURN CONTRACT (adapter FREEZE point — perri's `psyche_resume` role) ──\n 939|    ///\n...\n 1108|        // reseed and a plain failure return `Err`, so BOTH count a strike vs the W1 budget\n*1109|        // (`run_pulse_loop` feeds the outcome to `note_turn_outcome`).\n 1110|        // [impl->REQ-PSYCHE-SID-CUSTODY]\n 1111|        match psyche_turn_and_relay(\n 1112|            &runtime, &keys, stdin, reply_to, &psyche_id, &mut ctx, &owlery, timeout,\n...\n 1348|    /// set before any death was observed. `owner_pid` is the supervised harness\n*1349|    /// pid; the poll cadence reuses the configured `pulse_period` (the same\n 1350|    /// scheduled-supervision clock as the pulse loop).\n 1351|    // [impl->REQ-DAEMON-4]\n 1352|    // [impl->REQ-HAZARD-STALE-SIGNOFF-SENTINEL]\n...\n 1370|            }\n*1371|            sleep_interruptible(self.cfg.pulse_period, stop);\n 1372|        }\n 1373|        None\n 1374|    }\n...\n 2303|            let cfg = DaemonConfig {\n*2304|                pulse_period: Duration::from_millis(15),\n 2305|                ..DaemonConfig::default()\n 2306|            };\n 2307|            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n*2308|            assert_eq!(host.pulse_period(), Duration::from_millis(15));\n 2309|\n 2310|            let stop = AtomicBool::new(false);\n 2311|            let ticks = AtomicUsize::new(0);\n...\n 2313|            // loop actually schedules repeated ticks and honors the stop flag.\n*2314|            host.run_pulse_loop(None, &stop, StartReason::Cold, |_| {\n 2315|                if ticks.fetch_add(1, Ordering::Relaxed) + 1 >= 3 {\n 2316|                    stop.store(true, Ordering::Relaxed);\n 2317|                }\n...\n 2335|            let cfg = DaemonConfig {\n*2336|                pulse_period: Duration::from_millis(10),\n 2337|                ..DaemonConfig::default()\n 2338|            };\n 2339|            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n...\n 2342|            let first_bytes: Mutex<Option<Vec<u8>>> = Mutex::new(None);\n*2343|            host.run_pulse_loop(None, &stop, StartReason::Cold, |_| {\n 2344|                let cur = std::fs::read(crate::deadline::anchor_path(\"pulse\"))\n 2345|                    .expect(\"anchor file exists after loop entry\");\n 2346|                let mut slot = first_bytes.lock().unwrap();\n...\n 2370|            let cfg = DaemonConfig {\n*2371|                pulse_period: Duration::from_millis(10),\n 2372|                ..DaemonConfig::default()\n 2373|            };\n 2374|            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n...\n 2379|                let ticks = AtomicUsize::new(0);\n*2380|                host.run_pulse_loop(None, &stop, reason, |_| {\n 2381|                    if ticks.fetch_add(1, Ordering::Relaxed) + 1 >= 2 {\n 2382|                        stop.store(true, Ordering::Relaxed);\n 2383|                    }\n...\n 2633|            let cfg = DaemonConfig {\n*2634|                pulse_period: Duration::from_millis(10),\n 2635|                crash_grace: Duration::from_millis(10),\n 2636|                ..DaemonConfig::default()\n 2637|            };\n...\n 2665|            let cfg = DaemonConfig {\n*2666|                pulse_period: Duration::from_millis(10),\n 2667|                ..DaemonConfig::default()\n 2668|            };\n 2669|            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n## nethost.rs\n 2473|            let sent = Arc::clone(&sent);\n*2474|            std::thread::spawn(move || {\n 2475|                for f in &frames {\n 2476|                    host.send_stream(owner, f, false).expect(\"send\");\n 2477|                    sent.fetch_add(1, AtOrd::Relaxed);\n## projwriter.rs\n 622|pub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n*623|    std::thread::spawn(move || {\n 624|        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\n 625|        // untouched): rigs that need a writer-silent daemon set it — the\n 626|        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\n## seedmap.rs\n 141|        let name = name.to_string();\n*142|        thread::spawn(move || {\n 143|            let _ = handle_conn(conn, &reg, &stop, &name);\n 144|        });\n 145|    }\n...\n 279|    let (tx, rx) = std::sync::mpsc::channel();\n*280|    thread::spawn(move || {\n 281|        let _ = tx.send(ping(&name));\n 282|    });\n 283|    match rx.recv_timeout(bound) {\n...\n 307|    let (tx, rx) = std::sync::mpsc::channel();\n*308|    thread::spawn(move || {\n 309|        let _ = tx.send(connect(&n));\n 310|    });\n 311|    match rx.recv_timeout(bound) {\n...\n 444|        let serve_name = name.clone();\n*445|        std::thread::spawn(move || {\n 446|            let _ = serve_seed_control(&serve_name, srv);\n 447|        });\n 448|        for _ in 0..400 {\n## shellwake.rs\n 526|                let params = *params;\n*527|                std::thread::spawn(move || {\n 528|                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\n 529|                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\n 530|                    });\n...\n 553|pub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n*554|    std::thread::spawn(move || {\n 555|        let set = Arc::new(WakeSet::new());\n 556|        let params = WakeParams::default();\n 557|        while !stop.load(Ordering::SeqCst) {\n## translation.rs\n 272|        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n*273|        let reader = thread::spawn(move || {\n 274|            let buf = BufReader::new(stdout);\n 275|            for line in buf.lines() {\n 276|                let Ok(line) = line else { break }; // child stdout closed\n\n## pump/\n### mod.rs\n 1261|) -> thread::JoinHandle<()> {\n*1262|    thread::spawn(move || {\n 1263|        let paths = PumpPaths::production();\n 1264|        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n 1265|            run_peer_pump(\n...\n 2023|        let serve = std::sync::Arc::clone(&broker);\n*2024|        std::thread::spawn(move || {\n 2025|            let _ = serve.serve();\n 2026|        });\n 2027|        let mut brain = connect(&name).expect(\"brain connects\");\n\nShowing files 1-20 of 22+. Use skip=20 for the next page, or narrow paths/pattern.\n\nSkipped missing paths: crates/spt-daemon/src/psyche.rs"}],"details":{"scopePath":"crates/spt-daemon/src/livehost.rs, crates/spt-daemon/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":100,"fileCount":20,"files":["crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/applyhost.rs","crates/spt-daemon/src/autostart.rs","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/daemon.rs","crates/spt-daemon/src/deadline.rs","crates/spt-daemon/src/digesthub.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/drivehub.rs","crates/spt-daemon/src/effect.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/seedmap.rs","crates/spt-daemon/src/shellwake.rs","crates/spt-daemon/src/translation.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/livehost.rs","count":6},{"path":"crates/spt-daemon/src/applyhost.rs","count":1},{"path":"crates/spt-daemon/src/autostart.rs","count":1},{"path":"crates/spt-daemon/src/brain.rs","count":2},{"path":"crates/spt-daemon/src/brainproc.rs","count":3},{"path":"crates/spt-daemon/src/broker.rs","count":20},{"path":"crates/spt-daemon/src/config.rs","count":20},{"path":"crates/spt-daemon/src/daemon.rs","count":7},{"path":"crates/spt-daemon/src/deadline.rs","count":3},{"path":"crates/spt-daemon/src/digesthub.rs","count":1},{"path":"crates/spt-daemon/src/dispatch.rs","count":2},{"path":"crates/spt-daemon/src/drivehub.rs","count":1},{"path":"crates/spt-daemon/src/effect.rs","count":2},{"path":"crates/spt-daemon/src/lifecycle.rs","count":20},{"path":"crates/spt-daemon/src/nethost.rs","count":1},{"path":"crates/spt-daemon/src/projwriter.rs","count":1},{"path":"crates/spt-daemon/src/pump/mod.rs","count":2},{"path":"crates/spt-daemon/src/seedmap.rs","count":4},{"path":"crates/spt-daemon/src/shellwake.rs","count":2},{"path":"crates/spt-daemon/src/translation.rs","count":1}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# crates/spt-daemon/src/\n## livehost.rs\n    3│//!\n   *4│//! This is the production caller `run_pulse_loop` lacked: the brain instantiates\n    5│//! a [`BrainLifecycle`] per hosted **live** endpoint and drives its config-paced\n    6│//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of\n    7│//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from\n     │...\n  636│        let stop = Arc::clone(&stop);\n *637│        std::thread::spawn(move || {\n *638│            lifecycle.run_pulse_loop(Some(&session_id), &stop, reason, |_report| {});\n  639│        })\n  640│    };\n  641│    set.insert(id, HostedLife { stop, thread: handle });\n     │...\n 1037│pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {\n*1038│    std::thread::spawn(move || {\n 1039│        let set = Arc::new(LiveSet::new());\n 1040│        {\n 1041│            // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):\n     │...\n 1159│        DaemonConfig {\n*1160│            pulse_period: Duration::from_millis(15),\n 1161│            ..DaemonConfig::default()\n 1162│        }\n 1163│    }\n     │...\n 1657│            let b2 = Arc::clone(&broker);\n*1658│            std::thread::spawn(move || {\n 1659│                let _ = b2.serve();\n 1660│            });\n 1661│            let mut brain = {\n## applyhost.rs\n 513│        let serve = Arc::clone(&broker);\n*514│        let handle = std::thread::spawn(move || {\n 515│            let _ = serve.serve();\n 516│        });\n 517│        ServedBroker {\n## autostart.rs\n 133│        let (tx, rx) = mpsc::channel();\n*134│        let handle = std::thread::spawn(move || {\n 135│            replay_startup_endpoints(\"bogus-broker-socket-never-dialed\");\n 136│            let _ = tx.send(());\n 137│        });\n## brain.rs\n 2042│        let brain_handle =\n*2043│            thread::spawn(move || Brain::cold_start(&connect_name, 1).expect(\"brain cold_start\"));\n 2044│\n 2045│        let mut server = listener.accept().expect(\"accept the brain\");\n 2046│        crate::transport::recv_hello(&mut server, Role::Brain).expect(\"stub recv_hello\");\n     │...\n 2054│        let (feed, frames) = sync_channel::<Envelope>(64);\n*2055│        let server_thread = thread::spawn(move || {\n 2056│            while let Ok(env) = frames.recv() {\n 2057│                if write_frame(&mut send, &env).is_err() {\n 2058│                    break;\n## brainproc.rs\n  189│    // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the\n *190│    // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`\n  191│    // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).\n  192│    // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,\n  193│    // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of\n     │...\n  237│    // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller\n *238│    // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at\n  239│    // boot (the rehydrate the no-op above can't do) and every tick — re-hosting\n  240│    // every ONLINE live endpoint from disk (the harness-endpoint mirror of the\n  241│    // shell waker). Online-only is staged behind the interim `api listen`\n     │...\n 1129│    let canonical_exe = std::env::current_exe().ok();\n*1130│    let handle = thread::spawn(move || {\n 1131│        // The DRAINED gate (REQ-UPDATE-PROMOTE-DRAINED) reads broker truth in-process;\n 1132│        // a net-less / bind-failed daemon has no broker (None) → the gate degrades to\n 1133│        // readiness-only (no old-gen control plane to drain).\n## broker.rs\n 1055│        let writer_blocked = Arc::clone(&write_blocked_since);\n*1056│        let writer = thread::spawn(move || {\n 1057│            controller_writer(sid, writer_send, initial, rx, dt, epoch, epoch_gate, writer_blocked)\n 1058│        });\n 1059│        self.controller = Some(ControllerSink {\n     │...\n 1245│        let writer =\n*1246│            thread::spawn(move || viewer_writer(writer_send, session_id, initial, rx, writer_evicted));\n 1247│        self.viewers.insert(\n 1248│            vid,\n 1249│            ViewerSink {\n     │...\n 1912│        let (tx, rx) = sync_channel::<InputRecord>(input_queue_depth());\n*1913│        let writer = thread::spawn(move || input_writer(session, rx));\n 1914│        Arc::new(InputWriter {\n 1915│            tx,\n 1916│            backpressure: AtomicBool::new(false),\n     │...\n 2114│            let sup_endpoint = endpoint_id.to_string();\n*2115│            thread::spawn(move || {\n 2116│                run_inject_worker_supervised(\n 2117│                    sup_child,\n 2118│                    sup_faulted,\n     │...\n 2945│        let me = Arc::clone(self);\n*2946│        Ok(thread::spawn(move || {\n 2947│            let _ = me.handle_conn(conn);\n 2948│        }))\n 2949│    }\n     │...\n 3006│        // stays un-reapable as a live-but-wedged writer even under child output.\n*3007│        let writer = thread::spawn(move || for _ in rx.iter() {});\n 3008│        recover_log(&log).controller = Some(ControllerSink {\n 3009│            tx,\n 3010│            send,\n     │...\n 3756│        let waiter = Arc::clone(&session);\n*3757│        thread::spawn(move || {\n 3758│            if let Ok(status) = waiter.wait() {\n 3759│                let ev = ExitEvent {\n 3760│                    session_id: id,\n     │...\n 5225│        let mut client = client;\n*5226│        thread::spawn(move || {\n 5227│            let r = read_frame(&mut client).ok();\n 5228│            let _ = tx.send(r);\n 5229│        });\n     │...\n 5255│            // Empty initial batch (no size/replay needed for this assertion).\n*5256│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 5257│\n 5258│            // The drain's eviction sequence: mark THEN drop the sink (its `tx`).\n 5259│            evicted.store(true, Ordering::Release);\n     │...\n 5281│            let w_send = Arc::clone(&send);\n*5282│            let writer = thread::spawn(move || viewer_writer(w_send, 7, Vec::new(), rx, w_evicted));\n 5283│\n 5284│            // A clean teardown: drop tx with the flag still false.\n 5285│            drop(tx);\n     │...\n 5330│                evicted,\n*5331│                _writer: thread::spawn(|| {}),\n 5332│            },\n 5333│        );\n 5334│\n     │...\n 5410│            write_blocked_since: Arc::new(Mutex::new(None)),\n*5411│            _writer: thread::spawn(|| {}),\n 5412│        });\n 5413│        // A VIEWER with a generous channel we CAN drain — to prove it stays fed.\n 5414│        let (vsend, _vclient, _vrecv) = controller_socket_pair();\n     │...\n 5422│                    evicted: Arc::new(AtomicBool::new(false)),\n*5423│                    _writer: thread::spawn(|| {}),\n 5424│                },\n 5425│            );\n 5426│\n     │...\n 5523│            endpoint: String::new(),\n*5524│            _writer: thread::spawn(|| {}),\n 5525│        };\n 5526│        (w, rx)\n 5527│    }\n     │...\n 5661│        let f = Arc::clone(&floor);\n*5662│        let _ = thread::spawn(move || {\n 5663│            let _g = f.lock().unwrap();\n 5664│            panic!(\"poison the inject floor\");\n 5665│        })\n     │...\n 5688│        let s = Arc::clone(&sessions);\n*5689│        let _ = thread::spawn(move || {\n 5690│            let _g = s.lock().unwrap();\n 5691│            panic!(\"poison the sessions map mid-attach\");\n 5692│        })\n     │...\n 5746│        let l = Arc::clone(&log);\n*5747│        let _ = thread::spawn(move || {\n 5748│            let _g = l.lock().unwrap();\n 5749│            panic!(\"poison the output log mid-append\");\n 5750│        })\n     │...\n 6423│        let (tx, _rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*6424│        let writer = thread::spawn(|| {});\n 6425│        for _ in 0..1000 {\n 6426│            if writer.is_finished() {\n 6427│                break;\n     │...\n 6465│        let (tx, rx) = sync_channel::<CtrlMsg>(CONTROLLER_CHANNEL_DEPTH);\n*6466│        let writer = thread::spawn(move || {\n 6467│            let _ = rx.recv(); // blocks (idle live controller) until tx drops\n 6468│        });\n 6469│        log.controller = Some(ControllerSink {\n     │...\n 6503│        let write_blocked_since = Arc::new(Mutex::new(blocked));\n*6504│        let writer = thread::spawn(move || {\n 6505│            let _ = rx.recv(); // parked (live, not finished) until tx drops\n 6506│        });\n 6507│        log.controller = Some(ControllerSink {\n## config.rs\n   4│//! In the no-daemon interim model the pulse cadence was a hard-coded\n  *5│//! `spt_live::pulse::DEFAULT_PULSE_PERIOD` (5s). Consolidation (REQ-DAEMON-1)\n   6│//! folds the pulse loop into the brain as a *scheduled* in-process loop whose\n   7│//! period is **durable and configurable**, sourced from a small JSON file under\n   8│//! the spt home (`<spt_home>/daemon.json`) and falling back to the default when\n    │...\n  21│/// override it per machine.\n *22│pub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\n  23│\n  24│/// Default drop-file precedence protection window (epoch-ms), mirroring the\n  25│/// interim `spt_live` guard. Surfaced here so the one config source owns it.\n    │...\n  92│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n *93│    pulse_period_ms: Option<u64>,\n  94│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n  95│    protection_window_ms: Option<u64>,\n  96│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    │...\n 128│/// Resolved daemon configuration. The brain's scheduled loops read their cadence\n*129│/// from `pulse_period`; the drop-ingest guard reads `protection_window_ms`.\n 130│/// (No longer `Copy` — `resources_blurb` carries a `String`; callers clone.)\n 131│#[derive(Debug, Clone, PartialEq, Eq)]\n 132│pub struct DaemonConfig {\n*133│    /// The pulse loop period (config-driven; defaults to [`DEFAULT_PULSE_PERIOD`]).\n*134│    pub pulse_period: Duration,\n 135│    /// The drop-file precedence protection window in epoch-ms (6.5).\n 136│    pub protection_window_ms: u64,\n 137│    /// The orphan-watch grace window (B7): the recovery wait before a\n    │...\n 204│        DaemonConfig {\n*205│            pulse_period: DEFAULT_PULSE_PERIOD,\n 206│            protection_window_ms: DEFAULT_PROTECTION_WINDOW_MS,\n 207│            crash_grace: DEFAULT_CRASH_GRACE,\n 208│            full_auto_update: false, // gated by default (REQ-UPD-4)\n    │...\n 254│        DaemonConfig {\n*255│            pulse_period: file\n*256│                .pulse_period_ms\n 257│                .map(Duration::from_millis)\n*258│                .unwrap_or(d.pulse_period),\n 259│            protection_window_ms: file.protection_window_ms.unwrap_or(d.protection_window_ms),\n 260│            crash_grace: file\n 261│                .crash_grace_ms\n    │...\n 302│        let file = DaemonConfigFile {\n*303│            pulse_period_ms: Some(self.pulse_period.as_millis() as u64),\n 304│            protection_window_ms: Some(self.protection_window_ms),\n 305│            crash_grace_ms: Some(self.crash_grace.as_millis() as u64),\n 306│            full_auto_update: Some(self.full_auto_update),\n    │...\n 362│        assert_eq!(cfg, DaemonConfig::default());\n*363│        assert_eq!(cfg.pulse_period, DEFAULT_PULSE_PERIOD);\n 364│    }\n 365│\n 366│    #[test] // [unit->REQ-DAEMON-1] the pulse period is config-driven, not a constant.\n*367│    fn pulse_period_is_config_driven() {\n 368│        let dir = tempfile::tempdir().unwrap();\n 369│        let path = dir.path().join(\"daemon.json\");\n*370│        std::fs::write(&path, r#\"{\"pulse_period_ms\": 250}\"#).unwrap();\n 371│\n 372│        let cfg = DaemonConfig::load_from(&path);\n*373│        assert_eq!(cfg.pulse_period, Duration::from_millis(250));\n 374│        assert_ne!(\n*375│            cfg.pulse_period, DEFAULT_PULSE_PERIOD,\n 376│            \"must override the default\"\n 377│        );\n 378│        // The unspecified field keeps its default.\n    │...\n 394│        let cfg = DaemonConfig {\n*395│            pulse_period: Duration::from_millis(750),\n 396│            protection_window_ms: 99,\n 397│            crash_grace: Duration::from_millis(1234),\n 398│            full_auto_update: true,\n    │...\n 527│        // Unspecified fields keep their defaults.\n*528│        assert_eq!(cfg.pulse_period, DEFAULT_PULSE_PERIOD);\n 529│        // An absent file yields the default grace.\n 530│        assert_eq!(\n 531│            DaemonConfig::load_from(&dir.path().join(\"nope.json\")).crash_grace,\n    │...\n 576│        // key) loads as empty — forward/back-compat, never a parse failure.\n*577│        std::fs::write(&path, r#\"{\"pulse_period_ms\": 5000}\"#).unwrap();\n 578│        assert!(\n 579│            DaemonConfig::load_from(&path).startup_endpoints.is_empty(),\n 580│            \"a file without the key back-loads as empty, not an error\"\n    │...\n 599│            let seeded = DaemonConfig {\n*600│                pulse_period: Duration::from_millis(1234),\n 601│                detached_subnets: vec![\"work\".to_string()],\n 602│                ..DaemonConfig::default()\n 603│            };\n## daemon.rs\n  192│                    let serve_broker = Arc::clone(&broker);\n *193│                    thread::spawn(move || {\n  194│                        let _ = serve_broker.serve();\n  195│                    });\n  196│                // Inbound net dispatch + outbound peer pump (D9-1) now run in\n     │...\n  212│                        let broker = Arc::clone(&broker);\n *213│                        thread::spawn(move || net_retry_attach(broker));\n  214│                    }\n  215│                    // Endpoint autostart replay (F-038 W5, REQ-ENDPOINT-AUTOSTART):\n  216│                    // bring saved startup defaults back up against the broker we\n     │...\n  220│                    // [impl->REQ-ENDPOINT-AUTOSTART]\n *221│                    thread::spawn(|| {\n  222│                        crate::autostart::replay_startup_endpoints(&broker_socket_name());\n  223│                    });\n  224│                    // The node-local docs server (ADR-0036 §4): broker-side so\n     │...\n  263│            let hub = Arc::clone(&digest_hub);\n *264│            thread::spawn(move || {\n  265│                let _ = digesthub::serve_digest_control(&digest_socket_name(), hub);\n  266│            });\n  267│        }\n     │...\n  277│            let hub = Arc::clone(&drive_hub);\n *278│            thread::spawn(move || {\n  279│                let _ = crate::drivehub::serve_drive_control(&drive_socket_name(), hub);\n  280│            });\n  281│        }\n     │...\n  294│            let broker = Arc::clone(broker);\n *295│            thread::spawn(move || {\n  296│                let _ = crate::tunnelhub::serve_tunnel_control(\n  297│                    &crate::endpoint::tunnel_socket_name(),\n  298│                    hub,\n     │...\n 1704│            let serve_name = name.clone();\n*1705│            thread::spawn(move || {\n 1706│                let _ = serve_seed_control(&serve_name, srv);\n 1707│            });\n 1708│            for _ in 0..400 {\n## deadline.rs\n  39│use crate::brainproc::StartReason;\n *40│use crate::config::DEFAULT_PULSE_PERIOD;\n  41│\n  42│/// The canonical anchor path for a loop key: `<spt_home>/deadline-<key>.json`.\n  43│///\n    │...\n  73│        }\n *74│        let default_ms = DEFAULT_PULSE_PERIOD.as_millis() as u64;\n  75│        default_ms.max(1)\n  76│    }\n  77│\n    │...\n 292│        let got = DeadlineAnchor::effective_interval(0);\n*293│        assert_eq!(got, DEFAULT_PULSE_PERIOD.as_millis() as u64);\n 294│        assert!(got > 0, \"the derive must never divide by zero\");\n 295│        // A non-zero interval passes through untouched.\n 296│        assert_eq!(DeadlineAnchor::effective_interval(250), 250);\n## digesthub.rs\n 179│        let hub = Arc::clone(&hub);\n*180│        thread::spawn(move || {\n 181│            let _ = handle_conn(conn, &hub);\n 182│        });\n 183│    }\n## dispatch.rs\n  570│            pool.fetch_add(1, Ordering::Relaxed);\n *571│            thread::spawn(move || {\n  572│                let started = Instant::now();\n  573│                let report = worker(&name, stream_id, &origin, floor_seq, finished, &p, &reg);\n  574│                pool.fetch_sub(1, Ordering::Relaxed);\n     │...\n 1419│) -> thread::JoinHandle<()> {\n*1420│    thread::spawn(move || {\n 1421│        let paths = DispatchPaths::production();\n 1422│        if let Err(e) =\n 1423│            run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)\n## drivehub.rs\n 185│        let hub = Arc::clone(&hub);\n*186│        thread::spawn(move || {\n 187│            let _ = handle_conn(conn, &hub);\n 188│        });\n 189│    }\n## effect.rs\n 837│        let j1 = Arc::clone(&j);\n*838│        let blocker = std::thread::spawn(move || {\n 839│            j1.apply_once(k(1, 1), EffectKind::PtyWrite, || {\n 840│                entered_tx.send(()).expect(\"signal entered\");\n 841│                // Block inside the effect — the wedge a non-draining PTY induces.\n    │...\n 856│        let (done_tx, done_rx) = mpsc::channel::<()>();\n*857│        let second = std::thread::spawn(move || {\n 858│            let o = j2\n 859│                .apply_once(k(1, 2), EffectKind::PtyWrite, || Ok(()))\n 860│                .expect(\"apply_once #2\");\n## lifecycle.rs\n  301│    /// sync side-effect both succeeded; `Some(Err(reason))` ⇒ the turn OR the\n *302│    /// commune-sync failed (a strike — [`run_pulse_loop`] feeds it the failure budget).\n  303│    pub turn_outcome: Option<Result<(), String>>,\n  304│}\n  305│\n     │...\n  506│    /// The configured pulse period (config-driven, not a constant).\n *507│    pub fn pulse_period(&self) -> Duration {\n *508│        self.cfg.pulse_period\n  509│    }\n  510│\n  511│    /// Base substitution keys spt-core fills for the lifecycle templates.\n     │...\n  685│    /// absolute-deadline grid, not a phase-relative flat sleep.** The old loop\n *686│    /// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the\n  687│    /// restart instant on every restart. Now the loop rehydrates a\n  688│    /// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session\n  689│    /// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent\n     │...\n  699│    // [impl->REQ-DAEMON-1]\n *700│    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\n  701│        &self,\n  702│        session_id: Option<&str>,\n  703│        stop: &AtomicBool,\n     │...\n  709│        let key = session_id.unwrap_or(\"pulse\");\n *710│        let interval_ms = self.cfg.pulse_period.as_millis() as u64;\n  711│        // A disk error must not stop the pulse: degrade to an in-memory anchor at\n  712│        // `now` (fresh-phase, unpersisted) so cadence continues regardless.\n  713│        let anchor = DeadlineAnchor::open(key, interval_ms, reason, now_ms())\n     │...\n  908│    fn event_turn_timeout(&self) -> Duration {\n *909│        event_turn_timeout_for(self.pulse_period())\n  910│    }\n  911│\n  912│    /// The agent's OWN subnet — the parent endpoint's `home_subnet` (info.json),\n     │...\n  935│    /// non-zero exit, or the 7.3 null-stdout shape) — a failure is fed the W1 failure\n *936│    /// budget by [`run_pulse_loop`], NEVER a respawn (nothing resident to respawn).\n  937│    ///\n  938│    /// ── PSYCHE-TURN CONTRACT (adapter FREEZE point — perri's `psyche_resume` role) ──\n  939│    ///\n     │...\n 1108│        // reseed and a plain failure return `Err`, so BOTH count a strike vs the W1 budget\n*1109│        // (`run_pulse_loop` feeds the outcome to `note_turn_outcome`).\n 1110│        // [impl->REQ-PSYCHE-SID-CUSTODY]\n 1111│        match psyche_turn_and_relay(\n 1112│            &runtime, &keys, stdin, reply_to, &psyche_id, &mut ctx, &owlery, timeout,\n     │...\n 1348│    /// set before any death was observed. `owner_pid` is the supervised harness\n*1349│    /// pid; the poll cadence reuses the configured `pulse_period` (the same\n 1350│    /// scheduled-supervision clock as the pulse loop).\n 1351│    // [impl->REQ-DAEMON-4]\n 1352│    // [impl->REQ-HAZARD-STALE-SIGNOFF-SENTINEL]\n     │...\n 1370│            }\n*1371│            sleep_interruptible(self.cfg.pulse_period, stop);\n 1372│        }\n 1373│        None\n 1374│    }\n     │...\n 2303│            let cfg = DaemonConfig {\n*2304│                pulse_period: Duration::from_millis(15),\n 2305│                ..DaemonConfig::default()\n 2306│            };\n 2307│            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n*2308│            assert_eq!(host.pulse_period(), Duration::from_millis(15));\n 2309│\n 2310│            let stop = AtomicBool::new(false);\n 2311│            let ticks = AtomicUsize::new(0);\n     │...\n 2313│            // loop actually schedules repeated ticks and honors the stop flag.\n*2314│            host.run_pulse_loop(None, &stop, StartReason::Cold, |_| {\n 2315│                if ticks.fetch_add(1, Ordering::Relaxed) + 1 >= 3 {\n 2316│                    stop.store(true, Ordering::Relaxed);\n 2317│                }\n     │...\n 2335│            let cfg = DaemonConfig {\n*2336│                pulse_period: Duration::from_millis(10),\n 2337│                ..DaemonConfig::default()\n 2338│            };\n 2339│            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n     │...\n 2342│            let first_bytes: Mutex<Option<Vec<u8>>> = Mutex::new(None);\n*2343│            host.run_pulse_loop(None, &stop, StartReason::Cold, |_| {\n 2344│                let cur = std::fs::read(crate::deadline::anchor_path(\"pulse\"))\n 2345│                    .expect(\"anchor file exists after loop entry\");\n 2346│                let mut slot = first_bytes.lock().unwrap();\n     │...\n 2370│            let cfg = DaemonConfig {\n*2371│                pulse_period: Duration::from_millis(10),\n 2372│                ..DaemonConfig::default()\n 2373│            };\n 2374│            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n     │...\n 2379│                let ticks = AtomicUsize::new(0);\n*2380│                host.run_pulse_loop(None, &stop, reason, |_| {\n 2381│                    if ticks.fetch_add(1, Ordering::Relaxed) + 1 >= 2 {\n 2382│                        stop.store(true, Ordering::Relaxed);\n 2383│                    }\n     │...\n 2633│            let cfg = DaemonConfig {\n*2634│                pulse_period: Duration::from_millis(10),\n 2635│                crash_grace: Duration::from_millis(10),\n 2636│                ..DaemonConfig::default()\n 2637│            };\n     │...\n 2665│            let cfg = DaemonConfig {\n*2666│                pulse_period: Duration::from_millis(10),\n 2667│                ..DaemonConfig::default()\n 2668│            };\n 2669│            let host = BrainLifecycle::with_config(&manifest, \"doyle\", cfg).expect(\"live host\");\n## nethost.rs\n 2473│            let sent = Arc::clone(&sent);\n*2474│            std::thread::spawn(move || {\n 2475│                for f in &frames {\n 2476│                    host.send_stream(owner, f, false).expect(\"send\");\n 2477│                    sent.fetch_add(1, AtOrd::Relaxed);\n## projwriter.rs\n 622│pub fn spawn_index_writer(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n*623│    std::thread::spawn(move || {\n 624│        // TEST-ONLY isolation valve (runtime env, DEFAULT unset = production\n 625│        // untouched): rigs that need a writer-silent daemon set it — the\n 626│        // SPT_LIVEHOST_RECONCILE_DISABLE precedent.\n## seedmap.rs\n 141│        let name = name.to_string();\n*142│        thread::spawn(move || {\n 143│            let _ = handle_conn(conn, &reg, &stop, &name);\n 144│        });\n 145│    }\n    │...\n 279│    let (tx, rx) = std::sync::mpsc::channel();\n*280│    thread::spawn(move || {\n 281│        let _ = tx.send(ping(&name));\n 282│    });\n 283│    match rx.recv_timeout(bound) {\n    │...\n 307│    let (tx, rx) = std::sync::mpsc::channel();\n*308│    thread::spawn(move || {\n 309│        let _ = tx.send(connect(&n));\n 310│    });\n 311│    match rx.recv_timeout(bound) {\n    │...\n 444│        let serve_name = name.clone();\n*445│        std::thread::spawn(move || {\n 446│            let _ = serve_seed_control(&serve_name, srv);\n 447│        });\n 448│        for _ in 0..400 {\n## shellwake.rs\n 526│                let params = *params;\n*527│                std::thread::spawn(move || {\n 528│                    watcher_run(&owlery, &owner, &shell_id, &tokens, &params, &stop, || {\n 529│                        resolve_wake(&owlery, &owner, &shell_id, &adapter_name, &shell)\n 530│                    });\n    │...\n 553│pub fn spawn_wake_host(stop: Arc<AtomicBool>) -> JoinHandle<()> {\n*554│    std::thread::spawn(move || {\n 555│        let set = Arc::new(WakeSet::new());\n 556│        let params = WakeParams::default();\n 557│        while !stop.load(Ordering::SeqCst) {\n## translation.rs\n 272│        let stdin = child.stdin.take().expect(\"stdin piped at spawn\");\n*273│        let reader = thread::spawn(move || {\n 274│            let buf = BufReader::new(stdout);\n 275│            for line in buf.lines() {\n 276│                let Ok(line) = line else { break }; // child stdout closed\n\n## pump/\n### mod.rs\n 1261│) -> thread::JoinHandle<()> {\n*1262│    thread::spawn(move || {\n 1263│        let paths = PumpPaths::production();\n 1264│        supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {\n 1265│            run_peer_pump(\n     │...\n 2023│        let serve = std::sync::Arc::clone(&broker);\n*2024│        std::thread::spawn(move || {\n 2025│            let _ = serve.serve();\n 2026│        });\n 2027│        let mut brain = connect(&name).expect(\"brain connects\");","missingPaths":["crates/spt-daemon/src/psyche.rs"]},"isError":false,"timestamp":1784293181022}}
{"type":"message","id":"4c15831b","parentId":"542f2ca4","timestamp":"2026-07-17T12:59:41.043Z","message":{"role":"toolResult","toolCallId":"call_MhweJoU1eSVRAvpoEIyta6Li|fc_034a6be5a6696b6c016a5a273c69a881919762f1daafadf343","toolName":"read","content":[{"type":"text","text":"impl LiveSet {\n…\n    fn stop_host(&self, id: &str) {\n…\n        if let Some(h) = handle {\n…\n        }\n    }\n}\n\n/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\n/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\n///\n/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\n///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\n/// - **host** (online ∧ ¬tabled) — spawn the Psyche + start the driver.\n/// - **leave-alone** (online ∧ tabled).\n///\n/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are\n/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.\n// [impl->REQ-DAEMON-1]\npub fn reconcile_once(\n    owlery: &Path,\n    registered: &[(AdapterRecord, Manifest)],\n    adapters_dir: &Path,\n    set: &Arc<LiveSet>,\n    cfg: &DaemonConfig,\n    reason: StartReason,\n) {\n    // Stop side first: hosted endpoints that DEFINITIVELY left the online set —\n    // trip the flag, join, de-table. Un-host on a definitive departure ONLY, never\n    // on a TRANSIENT read failure (M11-W0.4 (ii)): a momentarily-unreadable\n    // info.json must not stop+respawn the driver (Psyche churn on a disk blip). The\n    // discriminator is the perch DIR:\n    //   - dir gone        → torn down (teardown removed the perch) → un-host;\n    //   - dir present, read_info Some(status≠online) → signed-off/offline → un-host;\n    //   - dir present, read_info None (transient/torn read) → LEAVE the driver, retry.\n    // [impl->REQ-DAEMON-1]\n    for id in set.ids() {\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n        let unhost = if !perch.exists() {\n            true // the perch dir is gone — torn down\n        } else {\n            match spt_store::info::read_info(&perch) {\n                Some(info) => info.status.as_deref() != Some(STATUS_ONLINE),\n                None => false, // dir present but unreadable: transient → keep hosting\n            }\n        };\n        if unhost {\n            set.stop_host(&id);\n            continue;\n        }\n        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\n        // with the resident psyche (a psyche is now a bounded per-event turn, not a\n        // process to confirm resident / rate-limit / reap). A psyche that cannot work\n        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\n        // stamps `psyche_host_error` on the PARENT — psyche fields only, NEVER the\n        // parent's ready/hosted state), never by un-hosting this online endpoint. This\n        // clean insertion seam is where a future wake-resume leg slots in\n        // (REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION / REQ-HAZARD-THRASH-GUARD-BLIND).\n        // [impl->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION]\n    }\n\n    // Start side: every online live endpoint not yet hosted.\n    for id in perch::list_self_perch_ids(owlery) {\n        if set.contains(&id) {\n            continue; // already hosted (leave-alone)\n        }\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n        let Some(info) = spt_store::info::read_info(&perch) else {\n            continue;\n        };\n        if info.state != LIVE_AGENT_STATE {\n            continue; // not a live agent (ready_agent etc.)\n        }\n        // ONLINE → host the pulse driver (existing path). NOT online but rest\n        // intent Active → the A-2 wake-resume leg: resume the harness from the last\n        // ledger session so a woken-but-unbound endpoint actually comes up.\n        if info.status.as_deref() != Some(STATUS_ONLINE) {\n            resume_woken_endpoint(&perch, &id, &info, registered, adapters_dir);\n            continue;\n        }\n        let Some(adapter) = info.adapter.as_deref() else {\n            continue; // adapterless endpoint — never live-capable\n        };\n        let manifest = match spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\n        {\n            Ok(m) => m,\n            Err(_) => {\n                // FOLD-IN (A-2, REQ-WAKE-RESUME-LEG): a deregistered adapter on an\n                // online endpoint was silently skipped — the SAME silent host-failure\n                // class the resume leg fixes. Stamp the loud host_error REPORT (never\n                // status — the field is a report, not a liveness input).\n                // [impl->REQ-WAKE-RESUME-LEG]\n                let _ = spt_store::info::set_host_error(\n                    &perch,\n                    Some(&format!(\n                        \"adapter '{adapter}' is not a registered/active adapter on this \\\n                         node — register it (spt adapter add)\"\n                    )),\n                );\n                continue;\n            }\n        };\n        // [impl->REQ-INSTALL-11] resolve the Psyche role program against the\n        // adapter install dir — the registry record's precise `source_dir`, the\n        // same dir Feature E's api seam uses (mod.rs::resolve_ctx_manifest). The\n        // daemon-host site is the heir to the retired in-process spawn's\n        // install-dir resolution: without it the daemon-hosted Psyche resolves a\n        // copy-mode psyche binary only via PATH, not its install dir.\n        let parent = adapter.split(':').next().unwrap_or(adapter);\n        let install_dir = registered\n            .iter()\n            .find(|(rec, _)| rec.name == parent)\n            .map(|(rec, _)| std::path::PathBuf::from(&rec.source_dir));\n        let Some(lifecycle) =\n            BrainLifecycle::with_config_in(&manifest, &id, cfg.clone(), install_dir.as_deref())\n        else {\n            continue; // manifest declares no [session.psyche_init]\n        };\n        // Successful host → clear any stale host_error (a recovered endpoint shows\n        // clean; doyle A-2 bind: cleared on a successful host/bind).\n        let _ = spt_store::info::set_host_error(&perch, None);\n        host_one(set, &id, lifecycle, info.session_id, reason);\n    }\n\n    // Worker reap GC (W-3, REQ-WORKER-REAP) — the PRIMARY collector of the leaked\n    // OFFLINE worker rows: each pass, reap every parent's REAPABLE nested workers\n    // (drained soft-stops, TTL-expired stale ready rows, and orphans whose parent\n    // session died). This is what actually clears a `SubagentStop`-never-fired leak.\n    reap_orphaned_workers(owlery, cfg);\n\n    // Parked-idle re-offer belt (W5, REQ-IDLE-PARKED-DELIVERY): a message QUEUED to an\n    // ALREADY-idle spt-hosted endpoint never gets an ACTIVE→IDLE edge, so the F-023\n    // idle-edge drain never fires for it — it parks forever (doyle's GO sat delivered=0\n    // in the spool while the endpoint showed ONLINE). Piggyback THIS pulse tick (no new\n    // loop): re-offer any parked rows to each already-idle inject target. `native=false`,\n    // so the broker's activity gate still owns *when* — a still-ACTIVE-viewed endpoint\n    // just re-releases and retries next tick; the primary send-time drain is the fast\n    // path, this belt is the guarantee. [impl->REQ-IDLE-PARKED-DELIVERY]\n    for id in perch::list_self_perch_ids(owlery) {\n        if crate::inject::has_parked_idle_spool(&id, owlery) {\n            let _ = crate::inject::drain_idle_spool(&id, owlery);\n        }\n    }\n}\n\n/// Reap every top-level parent's REAPABLE nested workers (W-3, REQ-WORKER-REAP) —\n/// the reconcile-cadence GC. Parent liveness is the ONE 2.5 resolver\n/// ([`is_perch_alive`]), NEVER the worker's dead-by-design pid; the TTL is the\n/// clamped `worker_reap_ttl` knob. Best-effort + idempotent: a reap this pass missed\n/// (transient false-dead within the orphan grace) reaps on the next.\n// [impl->REQ-WORKER-REAP]\nfn reap_orphaned_workers(owlery: &Path, cfg: &DaemonConfig) {\n    let ttl = spt_store::worker_reap::clamp_reap_ttl(cfg.worker_reap_ttl_secs);\n    let now = spt_store::worker_reap::now_secs();\n    for id in perch::list_self_perch_ids(owlery) {\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n        let parent_alive = spt_store::liveness::is_perch_alive(&perch);\n        let reaped = spt_store::worker_reap::reap_workers_in(owlery, &id, parent_alive, ttl, now);\n        for w in reaped {\n            eprintln!(\"WORKER_REAPED:{w} (parent {id}, alive={parent_alive})\");\n        }\n    }\n}\n\n/// The custody marker recording the pid of an in-flight wake-resume spawn (A-2).\n/// **Custody-only** — the F-030 nested-record discipline: it guards the boot\n/// window against a double-launch and enables a crashed-pre-bind retry, and is\n/// NEVER a liveness input (neither `liveness` nor the A-1 effective-state\n/// derivation reads it; `status=online` is what closes the resume gate).\nconst RESUME_PID_FILE: &str = \"resume.pid\";\n\nfn read_resume_pid(perch: &Path) -> Option<u32> {\n    std::fs::read_to_string(perch.join(RESUME_PID_FILE))\n        .ok()\n        .and_then(|s| s.trim().parse::<u32>().ok())\n        .filter(|&p| p != 0)\n}\n\n/// The pure wake-resume decision for one not-online live-agent perch (A-2). Pure\n/// over the observable inputs so the whole table is a unit test; the caller does\n/// the IO (spawn / pid record / host_error stamp).\n#[derive(Debug, PartialEq, Eq)]\nenum ResumeAction {\n    /// Not woken (genuinely suspended/dormant, or interim status-absent) — leave alone.\n    Skip,\n    /// A resume is already in flight (its pid probes alive) — stand down (no double-launch).\n    StandDown,\n    /// Woken, but nothing to resume from (no ledger row / no adapter) — benign, loud, no spawn.\n    NoResumeMaterial,\n    /// Woken, but the recorded adapter is not registered — refuse loud (host_error), no spawn.\n    Refuse(String),\n    /// Resume the harness from `session_id` under `adapter`.\n    Resume { session_id: String, adapter: String },\n}\n\n// [impl->REQ-WAKE-RESUME-LEG]\nfn decide_resume(\n    rest_state: Option<crate::resting::RestState>,\n    resume_pid_alive: bool,\n    last_sid: Option<&str>,\n    recorded_adapter: Option<&str>,\n    adapter_registered: bool,\n) -> ResumeAction {\n    use crate::resting::RestState;\n    if rest_state != Some(RestState::Active) {\n        return ResumeAction::Skip; // not woken — a suspended/dormant/interim perch is left alone\n    }\n    if resume_pid_alive {\n        return ResumeAction::StandDown; // a resume spawn is already booting toward its bind\n    }\n    let (Some(sid), Some(adapter)) = (last_sid, recorded_adapter) else {\n        return ResumeAction::NoResumeMaterial; // woken but no session/adapter to resume from\n    };\n    if !adapter_registered {\n        return ResumeAction::Refuse(format!(\n            \"recorded session adapter '{adapter}' is not a registered/active adapter on this \\\n             node — register it (spt adapter add)\"\n        ));\n    }\n    ResumeAction::Resume {\n        session_id: sid.to_string(),\n        adapter: adapter.to_string(),\n    }\n}\n\n/// A-2 wake-resume leg (REQ-WAKE-RESUME-LEG, ADR-0033): a live-agent perch whose\n/// rest INTENT is Active but whose harness session is cold (status ≠ online) gets\n/// its harness RESUMED from the last ledger session, under the RECORDED adapter\n/// (D-2), mirroring `shellwake::resolve_wake`. This is the daemon LIFT of the thin\n/// `spt wake` edge (ADR-0033: the CLI writes intent, the daemon does the work). It\n/// NEVER stamps `status` — the resumed harness self-binds → online, and the next\n/// reconcile tick hosts its pulse driver. Psyche is untouched (per-event, W3).\n// [impl->REQ-WAKE-RESUME-LEG]\nfn resume_woken_endpoint(\n    perch: &Path,\n    id: &str,\n    info: &spt_store::info::InfoJson,\n    registered: &[(AdapterRecord, Manifest)],\n…\n) {\n…\n}\n\n[Showing lines 129-363 of 2333. Use :364 to continue]"}],"details":{"truncation":{"content":"        }\r\n    }\r\n}\r\n\r\n/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\r\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\r\n/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\r\n///\r\n/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\r\n///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\r\n/// - **host** (online ∧ ¬tabled) — spawn the Psyche + start the driver.\r\n/// - **leave-alone** (online ∧ tabled).\r\n///\r\n/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are\r\n/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.\r\n// [impl->REQ-DAEMON-1]\r\npub fn reconcile_once(\r\n    owlery: &Path,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n    set: &Arc<LiveSet>,\r\n    cfg: &DaemonConfig,\r\n    reason: StartReason,\r\n) {\r\n    // Stop side first: hosted endpoints that DEFINITIVELY left the online set —\r\n    // trip the flag, join, de-table. Un-host on a definitive departure ONLY, never\r\n    // on a TRANSIENT read failure (M11-W0.4 (ii)): a momentarily-unreadable\r\n    // info.json must not stop+respawn the driver (Psyche churn on a disk blip). The\r\n    // discriminator is the perch DIR:\r\n    //   - dir gone        → torn down (teardown removed the perch) → un-host;\r\n    //   - dir present, read_info Some(status≠online) → signed-off/offline → un-host;\r\n    //   - dir present, read_info None (transient/torn read) → LEAVE the driver, retry.\r\n    // [impl->REQ-DAEMON-1]\r\n    for id in set.ids() {\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let unhost = if !perch.exists() {\r\n            true // the perch dir is gone — torn down\r\n        } else {\r\n            match spt_store::info::read_info(&perch) {\r\n                Some(info) => info.status.as_deref() != Some(STATUS_ONLINE),\r\n                None => false, // dir present but unreadable: transient → keep hosting\r\n            }\r\n        };\r\n        if unhost {\r\n            set.stop_host(&id);\r\n            continue;\r\n        }\r\n        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\r\n        // with the resident psyche (a psyche is now a bounded per-event turn, not a\r\n        // process to confirm resident / rate-limit / reap). A psyche that cannot work\r\n        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\r\n        // stamps `psyche_host_error` on the PARENT — psyche fields only, NEVER the\r\n        // parent's ready/hosted state), never by un-hosting this online endpoint. This\r\n        // clean insertion seam is where a future wake-resume leg slots in\r\n        // (REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION / REQ-HAZARD-THRASH-GUARD-BLIND).\r\n        // [impl->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION]\r\n    }\r\n\r\n    // Start side: every online live endpoint not yet hosted.\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        if set.contains(&id) {\r\n            continue; // already hosted (leave-alone)\r\n        }\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let Some(info) = spt_store::info::read_info(&perch) else {\r\n            continue;\r\n        };\r\n        if info.state != LIVE_AGENT_STATE {\r\n            continue; // not a live agent (ready_agent etc.)\r\n        }\r\n        // ONLINE → host the pulse driver (existing path). NOT online but rest\r\n        // intent Active → the A-2 wake-resume leg: resume the harness from the last\r\n        // ledger session so a woken-but-unbound endpoint actually comes up.\r\n        if info.status.as_deref() != Some(STATUS_ONLINE) {\r\n            resume_woken_endpoint(&perch, &id, &info, registered, adapters_dir);\r\n            continue;\r\n        }\r\n        let Some(adapter) = info.adapter.as_deref() else {\r\n            continue; // adapterless endpoint — never live-capable\r\n        };\r\n        let manifest = match spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\r\n        {\r\n            Ok(m) => m,\r\n            Err(_) => {\r\n                // FOLD-IN (A-2, REQ-WAKE-RESUME-LEG): a deregistered adapter on an\r\n                // online endpoint was silently skipped — the SAME silent host-failure\r\n                // class the resume leg fixes. Stamp the loud host_error REPORT (never\r\n                // status — the field is a report, not a liveness input).\r\n                // [impl->REQ-WAKE-RESUME-LEG]\r\n                let _ = spt_store::info::set_host_error(\r\n                    &perch,\r\n                    Some(&format!(\r\n                        \"adapter '{adapter}' is not a registered/active adapter on this \\\r\n                         node — register it (spt adapter add)\"\r\n                    )),\r\n                );\r\n                continue;\r\n            }\r\n        };\r\n        // [impl->REQ-INSTALL-11] resolve the Psyche role program against the\r\n        // adapter install dir — the registry record's precise `source_dir`, the\r\n        // same dir Feature E's api seam uses (mod.rs::resolve_ctx_manifest). The\r\n        // daemon-host site is the heir to the retired in-process spawn's\r\n        // install-dir resolution: without it the daemon-hosted Psyche resolves a\r\n        // copy-mode psyche binary only via PATH, not its install dir.\r\n        let parent = adapter.split(':').next().unwrap_or(adapter);\r\n        let install_dir = registered\r\n            .iter()\r\n            .find(|(rec, _)| rec.name == parent)\r\n            .map(|(rec, _)| std::path::PathBuf::from(&rec.source_dir));\r\n        let Some(lifecycle) =\r\n            BrainLifecycle::with_config_in(&manifest, &id, cfg.clone(), install_dir.as_deref())\r\n        else {\r\n            continue; // manifest declares no [session.psyche_init]\r\n        };\r\n        // Successful host → clear any stale host_error (a recovered endpoint shows\r\n        // clean; doyle A-2 bind: cleared on a successful host/bind).\r\n        let _ = spt_store::info::set_host_error(&perch, None);\r\n        host_one(set, &id, lifecycle, info.session_id, reason);\r\n    }\r\n\r\n    // Worker reap GC (W-3, REQ-WORKER-REAP) — the PRIMARY collector of the leaked\r\n    // OFFLINE worker rows: each pass, reap every parent's REAPABLE nested workers\r\n    // (drained soft-stops, TTL-expired stale ready rows, and orphans whose parent\r\n    // session died). This is what actually clears a `SubagentStop`-never-fired leak.\r\n    reap_orphaned_workers(owlery, cfg);\r\n\r\n    // Parked-idle re-offer belt (W5, REQ-IDLE-PARKED-DELIVERY): a message QUEUED to an\r\n    // ALREADY-idle spt-hosted endpoint never gets an ACTIVE→IDLE edge, so the F-023\r\n    // idle-edge drain never fires for it — it parks forever (doyle's GO sat delivered=0\r\n    // in the spool while the endpoint showed ONLINE). Piggyback THIS pulse tick (no new\r\n    // loop): re-offer any parked rows to each already-idle inject target. `native=false`,\r\n    // so the broker's activity gate still owns *when* — a still-ACTIVE-viewed endpoint\r\n    // just re-releases and retries next tick; the primary send-time drain is the fast\r\n    // path, this belt is the guarantee. [impl->REQ-IDLE-PARKED-DELIVERY]\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        if crate::inject::has_parked_idle_spool(&id, owlery) {\r\n            let _ = crate::inject::drain_idle_spool(&id, owlery);\r\n        }\r\n    }\r\n}\r\n\r\n/// Reap every top-level parent's REAPABLE nested workers (W-3, REQ-WORKER-REAP) —\r\n/// the reconcile-cadence GC. Parent liveness is the ONE 2.5 resolver\r\n/// ([`is_perch_alive`]), NEVER the worker's dead-by-design pid; the TTL is the\r\n/// clamped `worker_reap_ttl` knob. Best-effort + idempotent: a reap this pass missed\r\n/// (transient false-dead within the orphan grace) reaps on the next.\r\n// [impl->REQ-WORKER-REAP]\r\nfn reap_orphaned_workers(owlery: &Path, cfg: &DaemonConfig) {\r\n    let ttl = spt_store::worker_reap::clamp_reap_ttl(cfg.worker_reap_ttl_secs);\r\n    let now = spt_store::worker_reap::now_secs();\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n        let parent_alive = spt_store::liveness::is_perch_alive(&perch);\r\n        let reaped = spt_store::worker_reap::reap_workers_in(owlery, &id, parent_alive, ttl, now);\r\n        for w in reaped {\r\n            eprintln!(\"WORKER_REAPED:{w} (parent {id}, alive={parent_alive})\");\r\n        }\r\n    }\r\n}\r\n\r\n/// The custody marker recording the pid of an in-flight wake-resume spawn (A-2).\r\n/// **Custody-only** — the F-030 nested-record discipline: it guards the boot\r\n/// window against a double-launch and enables a crashed-pre-bind retry, and is\r\n/// NEVER a liveness input (neither `liveness` nor the A-1 effective-state\r\n/// derivation reads it; `status=online` is what closes the resume gate).\r\nconst RESUME_PID_FILE: &str = \"resume.pid\";\r\n\r\nfn read_resume_pid(perch: &Path) -> Option<u32> {\r\n    std::fs::read_to_string(perch.join(RESUME_PID_FILE))\r\n        .ok()\r\n        .and_then(|s| s.trim().parse::<u32>().ok())\r\n        .filter(|&p| p != 0)\r\n}\r\n\r\n/// The pure wake-resume decision for one not-online live-agent perch (A-2). Pure\r\n/// over the observable inputs so the whole table is a unit test; the caller does\r\n/// the IO (spawn / pid record / host_error stamp).\r\n#[derive(Debug, PartialEq, Eq)]\r\nenum ResumeAction {\r\n    /// Not woken (genuinely suspended/dormant, or interim status-absent) — leave alone.\r\n    Skip,\r\n    /// A resume is already in flight (its pid probes alive) — stand down (no double-launch).\r\n    StandDown,\r\n    /// Woken, but nothing to resume from (no ledger row / no adapter) — benign, loud, no spawn.\r\n    NoResumeMaterial,\r\n    /// Woken, but the recorded adapter is not registered — refuse loud (host_error), no spawn.\r\n    Refuse(String),\r\n    /// Resume the harness from `session_id` under `adapter`.\r\n    Resume { session_id: String, adapter: String },\r\n}\r\n\r\n// [impl->REQ-WAKE-RESUME-LEG]\r\nfn decide_resume(\r\n    rest_state: Option<crate::resting::RestState>,\r\n    resume_pid_alive: bool,\r\n    last_sid: Option<&str>,\r\n    recorded_adapter: Option<&str>,\r\n    adapter_registered: bool,\r\n) -> ResumeAction {\r\n    use crate::resting::RestState;\r\n    if rest_state != Some(RestState::Active) {\r\n        return ResumeAction::Skip; // not woken — a suspended/dormant/interim perch is left alone\r\n    }\r\n    if resume_pid_alive {\r\n        return ResumeAction::StandDown; // a resume spawn is already booting toward its bind\r\n    }\r\n    let (Some(sid), Some(adapter)) = (last_sid, recorded_adapter) else {\r\n        return ResumeAction::NoResumeMaterial; // woken but no session/adapter to resume from\r\n    };\r\n    if !adapter_registered {\r\n        return ResumeAction::Refuse(format!(\r\n            \"recorded session adapter '{adapter}' is not a registered/active adapter on this \\\r\n             node — register it (spt adapter add)\"\r\n        ));\r\n    }\r\n    ResumeAction::Resume {\r\n        session_id: sid.to_string(),\r\n        adapter: adapter.to_string(),\r\n    }\r\n}\r\n\r\n/// A-2 wake-resume leg (REQ-WAKE-RESUME-LEG, ADR-0033): a live-agent perch whose\r\n/// rest INTENT is Active but whose harness session is cold (status ≠ online) gets\r\n/// its harness RESUMED from the last ledger session, under the RECORDED adapter\r\n/// (D-2), mirroring `shellwake::resolve_wake`. This is the daemon LIFT of the thin\r\n/// `spt wake` edge (ADR-0033: the CLI writes intent, the daemon does the work). It\r\n/// NEVER stamps `status` — the resumed harness self-binds → online, and the next\r\n/// reconcile tick hosts its pulse driver. Psyche is untouched (per-event, W3).\r\n// [impl->REQ-WAKE-RESUME-LEG]\r\nfn resume_woken_endpoint(\r\n    perch: &Path,\r\n    id: &str,\r\n    info: &spt_store::info::InfoJson,\r\n    registered: &[(AdapterRecord, Manifest)],\r","truncated":true,"truncatedBy":"lines","totalLines":2205,"totalBytes":11944,"outputLines":235,"outputBytes":11944,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"impl LiveSet {\n…\n    fn stop_host(&self, id: &str) {\n…\n        if let Some(h) = handle {\n…\n        }\r\n    }\r\n}\r\n\r\n/// One reconcile sweep — the brain's live host-set invariant holder, run at boot\r\n/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the\r\n/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):\r\n///\r\n/// - **un-host** (tabled ∧ ¬online) — stop the driver + de-table (exit guard: a\r\n///   signed-off / removed endpoint must not keep pulsing — thread + dead-agent leak).\r\n/// - **host** (online ∧ ¬tabled) — spawn the Psyche + start the driver.\r\n/// - **leave-alone** (online ∧ tabled).\r\n///\r\n/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are\r\n/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.\r\n// [impl->REQ-DAEMON-1]\r\npub fn reconcile_once(\r\n    owlery: &Path,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n    adapters_dir: &Path,\r\n    set: &Arc<LiveSet>,\r\n    cfg: &DaemonConfig,\r\n    reason: StartReason,\r\n) {\r\n    // Stop side first: hosted endpoints that DEFINITIVELY left the online set —\r\n    // trip the flag, join, de-table. Un-host on a definitive departure ONLY, never\r\n    // on a TRANSIENT read failure (M11-W0.4 (ii)): a momentarily-unreadable\r\n    // info.json must not stop+respawn the driver (Psyche churn on a disk blip). The\r\n    // discriminator is the perch DIR:\r\n    //   - dir gone        → torn down (teardown removed the perch) → un-host;\r\n    //   - dir present, read_info Some(status≠online) → signed-off/offline → un-host;\r\n    //   - dir present, read_info None (transient/torn read) → LEAVE the driver, retry.\r\n    // [impl->REQ-DAEMON-1]\r\n    for id in set.ids() {\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let unhost = if !perch.exists() {\r\n            true // the perch dir is gone — torn down\r\n        } else {\r\n            match spt_store::info::read_info(&perch) {\r\n                Some(info) => info.status.as_deref() != Some(STATUS_ONLINE),\r\n                None => false, // dir present but unreadable: transient → keep hosting\r\n            }\r\n        };\r\n        if unhost {\r\n            set.stop_host(&id);\r\n            continue;\r\n        }\r\n        // F-030 W3: the residency-confirm + thrash-detect + orphan-reap arms retired\r\n        // with the resident psyche (a psyche is now a bounded per-event turn, not a\r\n        // process to confirm resident / rate-limit / reap). A psyche that cannot work\r\n        // is surfaced by the W1 per-event turn-failure budget (`note_turn_outcome`\r\n        // stamps `psyche_host_error` on the PARENT — psyche fields only, NEVER the\r\n        // parent's ready/hosted state), never by un-hosting this online endpoint. This\r\n        // clean insertion seam is where a future wake-resume leg slots in\r\n        // (REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION / REQ-HAZARD-THRASH-GUARD-BLIND).\r\n        // [impl->REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION]\r\n    }\r\n\r\n    // Start side: every online live endpoint not yet hosted.\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        if set.contains(&id) {\r\n            continue; // already hosted (leave-alone)\r\n        }\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let Some(info) = spt_store::info::read_info(&perch) else {\r\n            continue;\r\n        };\r\n        if info.state != LIVE_AGENT_STATE {\r\n            continue; // not a live agent (ready_agent etc.)\r\n        }\r\n        // ONLINE → host the pulse driver (existing path). NOT online but rest\r\n        // intent Active → the A-2 wake-resume leg: resume the harness from the last\r\n        // ledger session so a woken-but-unbound endpoint actually comes up.\r\n        if info.status.as_deref() != Some(STATUS_ONLINE) {\r\n            resume_woken_endpoint(&perch, &id, &info, registered, adapters_dir);\r\n            continue;\r\n        }\r\n        let Some(adapter) = info.adapter.as_deref() else {\r\n            continue; // adapterless endpoint — never live-capable\r\n        };\r\n        let manifest = match spt_runtime::registry::resolve_option_in(registered, adapters_dir, adapter)\r\n        {\r\n            Ok(m) => m,\r\n            Err(_) => {\r\n                // FOLD-IN (A-2, REQ-WAKE-RESUME-LEG): a deregistered adapter on an\r\n                // online endpoint was silently skipped — the SAME silent host-failure\r\n                // class the resume leg fixes. Stamp the loud host_error REPORT (never\r\n                // status — the field is a report, not a liveness input).\r\n                // [impl->REQ-WAKE-RESUME-LEG]\r\n                let _ = spt_store::info::set_host_error(\r\n                    &perch,\r\n                    Some(&format!(\r\n                        \"adapter '{adapter}' is not a registered/active adapter on this \\\r\n                         node — register it (spt adapter add)\"\r\n                    )),\r\n                );\r\n                continue;\r\n            }\r\n        };\r\n        // [impl->REQ-INSTALL-11] resolve the Psyche role program against the\r\n        // adapter install dir — the registry record's precise `source_dir`, the\r\n        // same dir Feature E's api seam uses (mod.rs::resolve_ctx_manifest). The\r\n        // daemon-host site is the heir to the retired in-process spawn's\r\n        // install-dir resolution: without it the daemon-hosted Psyche resolves a\r\n        // copy-mode psyche binary only via PATH, not its install dir.\r\n        let parent = adapter.split(':').next().unwrap_or(adapter);\r\n        let install_dir = registered\r\n            .iter()\r\n            .find(|(rec, _)| rec.name == parent)\r\n            .map(|(rec, _)| std::path::PathBuf::from(&rec.source_dir));\r\n        let Some(lifecycle) =\r\n            BrainLifecycle::with_config_in(&manifest, &id, cfg.clone(), install_dir.as_deref())\r\n        else {\r\n            continue; // manifest declares no [session.psyche_init]\r\n        };\r\n        // Successful host → clear any stale host_error (a recovered endpoint shows\r\n        // clean; doyle A-2 bind: cleared on a successful host/bind).\r\n        let _ = spt_store::info::set_host_error(&perch, None);\r\n        host_one(set, &id, lifecycle, info.session_id, reason);\r\n    }\r\n\r\n    // Worker reap GC (W-3, REQ-WORKER-REAP) — the PRIMARY collector of the leaked\r\n    // OFFLINE worker rows: each pass, reap every parent's REAPABLE nested workers\r\n    // (drained soft-stops, TTL-expired stale ready rows, and orphans whose parent\r\n    // session died). This is what actually clears a `SubagentStop`-never-fired leak.\r\n    reap_orphaned_workers(owlery, cfg);\r\n\r\n    // Parked-idle re-offer belt (W5, REQ-IDLE-PARKED-DELIVERY): a message QUEUED to an\r\n    // ALREADY-idle spt-hosted endpoint never gets an ACTIVE→IDLE edge, so the F-023\r\n    // idle-edge drain never fires for it — it parks forever (doyle's GO sat delivered=0\r\n    // in the spool while the endpoint showed ONLINE). Piggyback THIS pulse tick (no new\r\n    // loop): re-offer any parked rows to each already-idle inject target. `native=false`,\r\n    // so the broker's activity gate still owns *when* — a still-ACTIVE-viewed endpoint\r\n    // just re-releases and retries next tick; the primary send-time drain is the fast\r\n    // path, this belt is the guarantee. [impl->REQ-IDLE-PARKED-DELIVERY]\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        if crate::inject::has_parked_idle_spool(&id, owlery) {\r\n            let _ = crate::inject::drain_idle_spool(&id, owlery);\r\n        }\r\n    }\r\n}\r\n\r\n/// Reap every top-level parent's REAPABLE nested workers (W-3, REQ-WORKER-REAP) —\r\n/// the reconcile-cadence GC. Parent liveness is the ONE 2.5 resolver\r\n/// ([`is_perch_alive`]), NEVER the worker's dead-by-design pid; the TTL is the\r\n/// clamped `worker_reap_ttl` knob. Best-effort + idempotent: a reap this pass missed\r\n/// (transient false-dead within the orphan grace) reaps on the next.\r\n// [impl->REQ-WORKER-REAP]\r\nfn reap_orphaned_workers(owlery: &Path, cfg: &DaemonConfig) {\r\n    let ttl = spt_store::worker_reap::clamp_reap_ttl(cfg.worker_reap_ttl_secs);\r\n    let now = spt_store::worker_reap::now_secs();\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n        let parent_alive = spt_store::liveness::is_perch_alive(&perch);\r\n        let reaped = spt_store::worker_reap::reap_workers_in(owlery, &id, parent_alive, ttl, now);\r\n        for w in reaped {\r\n            eprintln!(\"WORKER_REAPED:{w} (parent {id}, alive={parent_alive})\");\r\n        }\r\n    }\r\n}\r\n\r\n/// The custody marker recording the pid of an in-flight wake-resume spawn (A-2).\r\n/// **Custody-only** — the F-030 nested-record discipline: it guards the boot\r\n/// window against a double-launch and enables a crashed-pre-bind retry, and is\r\n/// NEVER a liveness input (neither `liveness` nor the A-1 effective-state\r\n/// derivation reads it; `status=online` is what closes the resume gate).\r\nconst RESUME_PID_FILE: &str = \"resume.pid\";\r\n\r\nfn read_resume_pid(perch: &Path) -> Option<u32> {\r\n    std::fs::read_to_string(perch.join(RESUME_PID_FILE))\r\n        .ok()\r\n        .and_then(|s| s.trim().parse::<u32>().ok())\r\n        .filter(|&p| p != 0)\r\n}\r\n\r\n/// The pure wake-resume decision for one not-online live-agent perch (A-2). Pure\r\n/// over the observable inputs so the whole table is a unit test; the caller does\r\n/// the IO (spawn / pid record / host_error stamp).\r\n#[derive(Debug, PartialEq, Eq)]\r\nenum ResumeAction {\r\n    /// Not woken (genuinely suspended/dormant, or interim status-absent) — leave alone.\r\n    Skip,\r\n    /// A resume is already in flight (its pid probes alive) — stand down (no double-launch).\r\n    StandDown,\r\n    /// Woken, but nothing to resume from (no ledger row / no adapter) — benign, loud, no spawn.\r\n    NoResumeMaterial,\r\n    /// Woken, but the recorded adapter is not registered — refuse loud (host_error), no spawn.\r\n    Refuse(String),\r\n    /// Resume the harness from `session_id` under `adapter`.\r\n    Resume { session_id: String, adapter: String },\r\n}\r\n\r\n// [impl->REQ-WAKE-RESUME-LEG]\r\nfn decide_resume(\r\n    rest_state: Option<crate::resting::RestState>,\r\n    resume_pid_alive: bool,\r\n    last_sid: Option<&str>,\r\n    recorded_adapter: Option<&str>,\r\n    adapter_registered: bool,\r\n) -> ResumeAction {\r\n    use crate::resting::RestState;\r\n    if rest_state != Some(RestState::Active) {\r\n        return ResumeAction::Skip; // not woken — a suspended/dormant/interim perch is left alone\r\n    }\r\n    if resume_pid_alive {\r\n        return ResumeAction::StandDown; // a resume spawn is already booting toward its bind\r\n    }\r\n    let (Some(sid), Some(adapter)) = (last_sid, recorded_adapter) else {\r\n        return ResumeAction::NoResumeMaterial; // woken but no session/adapter to resume from\r\n    };\r\n    if !adapter_registered {\r\n        return ResumeAction::Refuse(format!(\r\n            \"recorded session adapter '{adapter}' is not a registered/active adapter on this \\\r\n             node — register it (spt adapter add)\"\r\n        ));\r\n    }\r\n    ResumeAction::Resume {\r\n        session_id: sid.to_string(),\r\n        adapter: adapter.to_string(),\r\n    }\r\n}\r\n\r\n/// A-2 wake-resume leg (REQ-WAKE-RESUME-LEG, ADR-0033): a live-agent perch whose\r\n/// rest INTENT is Active but whose harness session is cold (status ≠ online) gets\r\n/// its harness RESUMED from the last ledger session, under the RECORDED adapter\r\n/// (D-2), mirroring `shellwake::resolve_wake`. This is the daemon LIFT of the thin\r\n/// `spt wake` edge (ADR-0033: the CLI writes intent, the daemon does the work). It\r\n/// NEVER stamps `status` — the resumed harness self-binds → online, and the next\r\n/// reconcile tick hosts its pulse driver. Psyche is untouched (per-event, W3).\r\n// [impl->REQ-WAKE-RESUME-LEG]\r\nfn resume_woken_endpoint(\r\n    perch: &Path,\r\n    id: &str,\r\n    info: &spt_store::info::InfoJson,\r\n    registered: &[(AdapterRecord, Manifest)],\r\n…\n) {\n…\n}","startLine":70,"lineNumbers":[70,null,117,null,122,null,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,null,365,null,413]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2333,"totalBytes":11944,"outputLines":235,"outputBytes":11944,"shownRange":{"start":129,"end":363},"nextOffset":364}}},"isError":false,"timestamp":1784293181043}}
{"type":"message","id":"07d8e1f9","parentId":"4c15831b","timestamp":"2026-07-17T12:59:41.058Z","message":{"role":"toolResult","toolCallId":"call_ifznbuETPonyNXQk0qE3ySpO|fc_034a6be5a6696b6c016a5a273c69c88191ae12d719ddb29229","toolName":"read","content":[{"type":"text","text":"/// (`advertise_local` → Offline): same crash-robust, self-healing-next-tick shape.\n///\n/// `live_sessions` is the set of endpoint ids the broker currently hosts a PTY\n/// session for ([`crate::msg::SessionsReply`] via `KIND_SESSIONS`). A perch that\n/// is online + controllable but ABSENT from it has a dead/exited harness → mark it\n/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and\n/// the start-side stops re-hosting it.\n///\n/// **Controllable gate (load-bearing):** only `controllable == Some(true)`\n/// (spt-hosted, broker-PTY) perches are reconciled here. A HARNESS-HOSTED relay\n/// live agent (`api listen`, `controllable == Some(false)`) is legitimately online\n/// with NO broker session (its liveness is the relay + ready marker), so it is\n/// NEVER marked offline by this pass. A `controllable == None` perch (legacy /\n/// dead-psyche like wall-a) is also exempt here — its liveness/phantom class is\n/// not the broker-session arm's concern. (The former residency-confirm arm that\n/// once handled it was retired with the resident-Psyche model in F-030; a\n/// genuinely stranded pre-upgrade resident is now reaped by the one-shot\n/// legacy-resident sweep at brain start.)\n///\n/// The caller passes `live_sessions` ONLY when the broker is reachable (it runs\n/// this from boot tick 1 — the B5 boot-gate — so a phantom is never revived, and\n/// SKIPS the pass entirely when the broker is unreachable so a transient hiccup\n/// never mass-offlines). Returns the ids it marked offline.\n// [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\n/// The legacy-hybrid self-heal decision (ADR-0041 decision 1), pure over its\n/// observables so the whole table is a unit test. A NON-live-agent row is due\n/// for a terminal heal exactly when it reads `status=online` (the immortal\n/// stamp no reader pid-probes), was born by the listen path\n/// (`controllable == Some(false)` — a gateway `None` or daemon-hosted\n/// `Some(true)` row is somebody else's liveness model), and its recorded\n/// NUMERIC pid probes DEAD (`Some(false)`). A BUSY/absent pid (`None`) is never\n/// guessed at — conservative, next tick retries.\n// [impl->REQ-ENDPOINT-ONLINE-TRUTH]\nfn hybrid_self_heal_due(\n    status: Option<&str>,\n    controllable: Option<bool>,\n    pid_alive: Option<bool>,\n) -> bool {\n    status == Some(STATUS_ONLINE) && controllable == Some(false) && pid_alive == Some(false)\n}\n\npub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\n    let mut offlined = Vec::new();\n    for id in perch::list_self_perch_ids(owlery) {\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\n        let Some(info) = spt_store::info::read_info(&perch) else {\n            continue;\n        };\n        let has_session = live_sessions.contains(&id);\n\n        // Control cleanup SPLIT from offline classification (ADR-0041 decision 2,\n        // supersedes the narrower B3 REQ-PRESENCE-CONTROL-REAP-ON-EXIT gate): an\n        // endpoint ABSENT from session truth carries NO control stamps — cleared\n        // for EVERY row regardless of `state` or `controllable`, so a\n        // classification quirk (ready_agent hybrid, legacy `None`, relay) can\n        // never shield stale `controlled`/`driven_by`/`viewer_count` (the sticky\n        // stamp that survived clean-exit AND a daemon restart — perri F-b).\n        // All THREE fields clear (decision 4's no-session rule) — `attached_node`\n        // derives from them, so this clears it too. Divergence-gated: rows with\n        // nothing set (the common case, e.g. a relay that never carries stamps)\n        // write nothing. RACE-FREE: with no live session there is no controller\n        // to re-stamp concurrently (the broker single-writer invariant is\n        // uncontended). This is also the BOOT-TIME sweep (path iv): the caller\n        // runs the reconcile from boot tick 1.\n        // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\n        // [impl->REQ-CONTROL-STAMP-CONVERGENCE]\n        // [impl->REQ-PRESENCE-CONTROL-REAP-ON-EXIT]\n        if !has_session\n            && (info.controlled || info.driven_by.is_some() || info.viewer_count.is_some())\n        {\n            let _ = spt_store::info::set_controlled(&perch, false);\n            let _ = spt_store::info::set_driven_by(&perch, None);\n            let _ = spt_store::info::set_viewer_count(&perch, 0);\n            eprintln!(\n                \"CONTROL_REAP_NO_SESSION:{id}: cleared stale controlled/driven_by/viewer_count (no broker session)\"\n            );\n        }\n\n        if info.state != LIVE_AGENT_STATE {\n            // Legacy hybrid self-heal (ADR-0041 decision 1): a row that is NOT a\n            // live agent yet reads `status=online` was born under the pre-W2\n            // capability-only creator stamp (ready_agent/controllable=false).\n            // Its liveness truth is its recorded listener pid — a DEAD numeric\n            // pid means the row is an immortal phantom (`is_perch_alive` trusts\n            // `status=online` and never pid-probes it, so no reader ever heals\n            // it). Normalize it terminally, CAS-guarded on the observed session.\n            // Runs ONLY under a SUCCESSFUL broker query (the caller gates the\n            // whole pass), never on a broker hiccup.\n            // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\n            let pid_alive = spt_store::info::read_pid(&perch)\n                .map(spt_store::proc::is_process_alive);\n            if hybrid_self_heal_due(\n                info.status.as_deref(),\n                info.controllable,\n                pid_alive,\n            ) {\n                BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\n                eprintln!(\n                    \"HYBRID_SELFHEAL_OFFLINE:{id}: non-live-agent row was online with a dead pid\"\n                );\n                offlined.push(id);\n            }\n            continue; // not a live agent — offline classification below is not its model\n        }\n\n        let status = info.status.as_deref();\n        let is_unbound = status == Some(STATUS_UNBOUND);\n        if status != Some(STATUS_ONLINE) && !is_unbound {\n            continue; // already offline / interim (status-absent) — presence unchanged\n        }\n        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\n        // yet, so `controllable` may be unset) — skip the gate for it.\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\n        if !is_unbound && info.controllable != Some(true) {\n            continue; // harness-hosted relay / legacy — exempt\n        }\n        if !has_session {\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\n            // session → the harness child is gone. CUSTODY GATE first: a\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\n            // mid-revival — normalizing now would land `suspended` under the\n            // incoming bind (which carries rest_state forward by design,\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\n                eprintln!(\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\n                );\n                continue;\n            }\n            // Definitive death → terminal normalize (offline + suspended +\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\n            // so a bind that lands between our read and this write is never\n            // clobbered.\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\n            // a stale `driven_by = Some` — its broker session (the single writer)\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\n            // it. The split cleanup above already cleared every no-session row;\n            // this belt stays for the same-tick read (info is a pre-cleanup\n            // snapshot). RACE-FREE for the same no-live-session reason.\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\n            if info.driven_by.is_some() {\n                let _ = spt_store::info::set_driven_by(&perch, None);\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\n            }\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\n            offlined.push(id);\n        }\n    }\n    offlined\n}\n\n/// Query the broker for the set of endpoint ids it currently hosts a session for\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\n    let reply = brain.sessions().ok()?;\n    Some(\n        reply\n            .sessions\n            .into_iter()\n            .map(|s| s.endpoint)\n            .filter(|e| !e.is_empty())\n            .collect(),\n    )\n}\n\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\n\n[Showing lines 649-823 of 2333. Use :824 to continue]"}],"details":{"truncation":{"content":"/// (`advertise_local` → Offline): same crash-robust, self-healing-next-tick shape.\r\n///\r\n/// `live_sessions` is the set of endpoint ids the broker currently hosts a PTY\r\n/// session for ([`crate::msg::SessionsReply`] via `KIND_SESSIONS`). A perch that\r\n/// is online + controllable but ABSENT from it has a dead/exited harness → mark it\r\n/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and\r\n/// the start-side stops re-hosting it.\r\n///\r\n/// **Controllable gate (load-bearing):** only `controllable == Some(true)`\r\n/// (spt-hosted, broker-PTY) perches are reconciled here. A HARNESS-HOSTED relay\r\n/// live agent (`api listen`, `controllable == Some(false)`) is legitimately online\r\n/// with NO broker session (its liveness is the relay + ready marker), so it is\r\n/// NEVER marked offline by this pass. A `controllable == None` perch (legacy /\r\n/// dead-psyche like wall-a) is also exempt here — its liveness/phantom class is\r\n/// not the broker-session arm's concern. (The former residency-confirm arm that\r\n/// once handled it was retired with the resident-Psyche model in F-030; a\r\n/// genuinely stranded pre-upgrade resident is now reaped by the one-shot\r\n/// legacy-resident sweep at brain start.)\r\n///\r\n/// The caller passes `live_sessions` ONLY when the broker is reachable (it runs\r\n/// this from boot tick 1 — the B5 boot-gate — so a phantom is never revived, and\r\n/// SKIPS the pass entirely when the broker is unreachable so a transient hiccup\r\n/// never mass-offlines). Returns the ids it marked offline.\r\n// [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\r\n/// The legacy-hybrid self-heal decision (ADR-0041 decision 1), pure over its\r\n/// observables so the whole table is a unit test. A NON-live-agent row is due\r\n/// for a terminal heal exactly when it reads `status=online` (the immortal\r\n/// stamp no reader pid-probes), was born by the listen path\r\n/// (`controllable == Some(false)` — a gateway `None` or daemon-hosted\r\n/// `Some(true)` row is somebody else's liveness model), and its recorded\r\n/// NUMERIC pid probes DEAD (`Some(false)`). A BUSY/absent pid (`None`) is never\r\n/// guessed at — conservative, next tick retries.\r\n// [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\nfn hybrid_self_heal_due(\r\n    status: Option<&str>,\r\n    controllable: Option<bool>,\r\n    pid_alive: Option<bool>,\r\n) -> bool {\r\n    status == Some(STATUS_ONLINE) && controllable == Some(false) && pid_alive == Some(false)\r\n}\r\n\r\npub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\r\n    let mut offlined = Vec::new();\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let Some(info) = spt_store::info::read_info(&perch) else {\r\n            continue;\r\n        };\r\n        let has_session = live_sessions.contains(&id);\r\n\r\n        // Control cleanup SPLIT from offline classification (ADR-0041 decision 2,\r\n        // supersedes the narrower B3 REQ-PRESENCE-CONTROL-REAP-ON-EXIT gate): an\r\n        // endpoint ABSENT from session truth carries NO control stamps — cleared\r\n        // for EVERY row regardless of `state` or `controllable`, so a\r\n        // classification quirk (ready_agent hybrid, legacy `None`, relay) can\r\n        // never shield stale `controlled`/`driven_by`/`viewer_count` (the sticky\r\n        // stamp that survived clean-exit AND a daemon restart — perri F-b).\r\n        // All THREE fields clear (decision 4's no-session rule) — `attached_node`\r\n        // derives from them, so this clears it too. Divergence-gated: rows with\r\n        // nothing set (the common case, e.g. a relay that never carries stamps)\r\n        // write nothing. RACE-FREE: with no live session there is no controller\r\n        // to re-stamp concurrently (the broker single-writer invariant is\r\n        // uncontended). This is also the BOOT-TIME sweep (path iv): the caller\r\n        // runs the reconcile from boot tick 1.\r\n        // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\n        // [impl->REQ-CONTROL-STAMP-CONVERGENCE]\r\n        // [impl->REQ-PRESENCE-CONTROL-REAP-ON-EXIT]\r\n        if !has_session\r\n            && (info.controlled || info.driven_by.is_some() || info.viewer_count.is_some())\r\n        {\r\n            let _ = spt_store::info::set_controlled(&perch, false);\r\n            let _ = spt_store::info::set_driven_by(&perch, None);\r\n            let _ = spt_store::info::set_viewer_count(&perch, 0);\r\n            eprintln!(\r\n                \"CONTROL_REAP_NO_SESSION:{id}: cleared stale controlled/driven_by/viewer_count (no broker session)\"\r\n            );\r\n        }\r\n\r\n        if info.state != LIVE_AGENT_STATE {\r\n            // Legacy hybrid self-heal (ADR-0041 decision 1): a row that is NOT a\r\n            // live agent yet reads `status=online` was born under the pre-W2\r\n            // capability-only creator stamp (ready_agent/controllable=false).\r\n            // Its liveness truth is its recorded listener pid — a DEAD numeric\r\n            // pid means the row is an immortal phantom (`is_perch_alive` trusts\r\n            // `status=online` and never pid-probes it, so no reader ever heals\r\n            // it). Normalize it terminally, CAS-guarded on the observed session.\r\n            // Runs ONLY under a SUCCESSFUL broker query (the caller gates the\r\n            // whole pass), never on a broker hiccup.\r\n            // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\n            let pid_alive = spt_store::info::read_pid(&perch)\r\n                .map(spt_store::proc::is_process_alive);\r\n            if hybrid_self_heal_due(\r\n                info.status.as_deref(),\r\n                info.controllable,\r\n                pid_alive,\r\n            ) {\r\n                BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n                eprintln!(\r\n                    \"HYBRID_SELFHEAL_OFFLINE:{id}: non-live-agent row was online with a dead pid\"\r\n                );\r\n                offlined.push(id);\r\n            }\r\n            continue; // not a live agent — offline classification below is not its model\r\n        }\r\n\r\n        let status = info.status.as_deref();\r\n        let is_unbound = status == Some(STATUS_UNBOUND);\r\n        if status != Some(STATUS_ONLINE) && !is_unbound {\r\n            continue; // already offline / interim (status-absent) — presence unchanged\r\n        }\r\n        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\r\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\r\n        // yet, so `controllable` may be unset) — skip the gate for it.\r\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n        if !is_unbound && info.controllable != Some(true) {\r\n            continue; // harness-hosted relay / legacy — exempt\r\n        }\r\n        if !has_session {\r\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\r\n            // session → the harness child is gone. CUSTODY GATE first: a\r\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\r\n            // mid-revival — normalizing now would land `suspended` under the\r\n            // incoming bind (which carries rest_state forward by design,\r\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\r\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\r\n                eprintln!(\r\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\r\n                );\r\n                continue;\r\n            }\r\n            // Definitive death → terminal normalize (offline + suspended +\r\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\r\n            // so a bind that lands between our read and this write is never\r\n            // clobbered.\r\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\r\n            // a stale `driven_by = Some` — its broker session (the single writer)\r\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\r\n            // it. The split cleanup above already cleared every no-session row;\r\n            // this belt stays for the same-tick read (info is a pre-cleanup\r\n            // snapshot). RACE-FREE for the same no-live-session reason.\r\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\r\n            if info.driven_by.is_some() {\r\n                let _ = spt_store::info::set_driven_by(&perch, None);\r\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\r\n            }\r\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\r\n            offlined.push(id);\r\n        }\r\n    }\r\n    offlined\r\n}\r\n\r\n/// Query the broker for the set of endpoint ids it currently hosts a session for\r\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\r\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\r\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\r\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\r\n    let reply = brain.sessions().ok()?;\r\n    Some(\r\n        reply\r\n            .sessions\r\n            .into_iter()\r\n            .map(|s| s.endpoint)\r\n            .filter(|e| !e.is_empty())\r\n            .collect(),\r\n    )\r\n}\r\n\r\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\r\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\r","truncated":true,"truncatedBy":"lines","totalLines":1685,"totalBytes":9900,"outputLines":175,"outputBytes":9900,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// (`advertise_local` → Offline): same crash-robust, self-healing-next-tick shape.\r\n///\r\n/// `live_sessions` is the set of endpoint ids the broker currently hosts a PTY\r\n/// session for ([`crate::msg::SessionsReply`] via `KIND_SESSIONS`). A perch that\r\n/// is online + controllable but ABSENT from it has a dead/exited harness → mark it\r\n/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and\r\n/// the start-side stops re-hosting it.\r\n///\r\n/// **Controllable gate (load-bearing):** only `controllable == Some(true)`\r\n/// (spt-hosted, broker-PTY) perches are reconciled here. A HARNESS-HOSTED relay\r\n/// live agent (`api listen`, `controllable == Some(false)`) is legitimately online\r\n/// with NO broker session (its liveness is the relay + ready marker), so it is\r\n/// NEVER marked offline by this pass. A `controllable == None` perch (legacy /\r\n/// dead-psyche like wall-a) is also exempt here — its liveness/phantom class is\r\n/// not the broker-session arm's concern. (The former residency-confirm arm that\r\n/// once handled it was retired with the resident-Psyche model in F-030; a\r\n/// genuinely stranded pre-upgrade resident is now reaped by the one-shot\r\n/// legacy-resident sweep at brain start.)\r\n///\r\n/// The caller passes `live_sessions` ONLY when the broker is reachable (it runs\r\n/// this from boot tick 1 — the B5 boot-gate — so a phantom is never revived, and\r\n/// SKIPS the pass entirely when the broker is unreachable so a transient hiccup\r\n/// never mass-offlines). Returns the ids it marked offline.\r\n// [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]\r\n/// The legacy-hybrid self-heal decision (ADR-0041 decision 1), pure over its\r\n/// observables so the whole table is a unit test. A NON-live-agent row is due\r\n/// for a terminal heal exactly when it reads `status=online` (the immortal\r\n/// stamp no reader pid-probes), was born by the listen path\r\n/// (`controllable == Some(false)` — a gateway `None` or daemon-hosted\r\n/// `Some(true)` row is somebody else's liveness model), and its recorded\r\n/// NUMERIC pid probes DEAD (`Some(false)`). A BUSY/absent pid (`None`) is never\r\n/// guessed at — conservative, next tick retries.\r\n// [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\nfn hybrid_self_heal_due(\r\n    status: Option<&str>,\r\n    controllable: Option<bool>,\r\n    pid_alive: Option<bool>,\r\n) -> bool {\r\n    status == Some(STATUS_ONLINE) && controllable == Some(false) && pid_alive == Some(false)\r\n}\r\n\r\npub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {\r\n    let mut offlined = Vec::new();\r\n    for id in perch::list_self_perch_ids(owlery) {\r\n        let perch = perch::resolve_perch_path(&id, ParentHint::Infer);\r\n        let Some(info) = spt_store::info::read_info(&perch) else {\r\n            continue;\r\n        };\r\n        let has_session = live_sessions.contains(&id);\r\n\r\n        // Control cleanup SPLIT from offline classification (ADR-0041 decision 2,\r\n        // supersedes the narrower B3 REQ-PRESENCE-CONTROL-REAP-ON-EXIT gate): an\r\n        // endpoint ABSENT from session truth carries NO control stamps — cleared\r\n        // for EVERY row regardless of `state` or `controllable`, so a\r\n        // classification quirk (ready_agent hybrid, legacy `None`, relay) can\r\n        // never shield stale `controlled`/`driven_by`/`viewer_count` (the sticky\r\n        // stamp that survived clean-exit AND a daemon restart — perri F-b).\r\n        // All THREE fields clear (decision 4's no-session rule) — `attached_node`\r\n        // derives from them, so this clears it too. Divergence-gated: rows with\r\n        // nothing set (the common case, e.g. a relay that never carries stamps)\r\n        // write nothing. RACE-FREE: with no live session there is no controller\r\n        // to re-stamp concurrently (the broker single-writer invariant is\r\n        // uncontended). This is also the BOOT-TIME sweep (path iv): the caller\r\n        // runs the reconcile from boot tick 1.\r\n        // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\n        // [impl->REQ-CONTROL-STAMP-CONVERGENCE]\r\n        // [impl->REQ-PRESENCE-CONTROL-REAP-ON-EXIT]\r\n        if !has_session\r\n            && (info.controlled || info.driven_by.is_some() || info.viewer_count.is_some())\r\n        {\r\n            let _ = spt_store::info::set_controlled(&perch, false);\r\n            let _ = spt_store::info::set_driven_by(&perch, None);\r\n            let _ = spt_store::info::set_viewer_count(&perch, 0);\r\n            eprintln!(\r\n                \"CONTROL_REAP_NO_SESSION:{id}: cleared stale controlled/driven_by/viewer_count (no broker session)\"\r\n            );\r\n        }\r\n\r\n        if info.state != LIVE_AGENT_STATE {\r\n            // Legacy hybrid self-heal (ADR-0041 decision 1): a row that is NOT a\r\n            // live agent yet reads `status=online` was born under the pre-W2\r\n            // capability-only creator stamp (ready_agent/controllable=false).\r\n            // Its liveness truth is its recorded listener pid — a DEAD numeric\r\n            // pid means the row is an immortal phantom (`is_perch_alive` trusts\r\n            // `status=online` and never pid-probes it, so no reader ever heals\r\n            // it). Normalize it terminally, CAS-guarded on the observed session.\r\n            // Runs ONLY under a SUCCESSFUL broker query (the caller gates the\r\n            // whole pass), never on a broker hiccup.\r\n            // [impl->REQ-ENDPOINT-ONLINE-TRUTH]\r\n            let pid_alive = spt_store::info::read_pid(&perch)\r\n                .map(spt_store::proc::is_process_alive);\r\n            if hybrid_self_heal_due(\r\n                info.status.as_deref(),\r\n                info.controllable,\r\n                pid_alive,\r\n            ) {\r\n                BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n                eprintln!(\r\n                    \"HYBRID_SELFHEAL_OFFLINE:{id}: non-live-agent row was online with a dead pid\"\r\n                );\r\n                offlined.push(id);\r\n            }\r\n            continue; // not a live agent — offline classification below is not its model\r\n        }\r\n\r\n        let status = info.status.as_deref();\r\n        let is_unbound = status == Some(STATUS_UNBOUND);\r\n        if status != Some(STATUS_ONLINE) && !is_unbound {\r\n            continue; // already offline / interim (status-absent) — presence unchanged\r\n        }\r\n        // Controllable gate: harness-hosted relay (Some(false)) and legacy (None)\r\n        // are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run\r\n        // yet, so `controllable` may be unset) — skip the gate for it.\r\n        // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n        if !is_unbound && info.controllable != Some(true) {\r\n            continue; // harness-hosted relay / legacy — exempt\r\n        }\r\n        if !has_session {\r\n            // spt-hosted (online or unbound skeleton), but the broker hosts no\r\n            // session → the harness child is gone. CUSTODY GATE first: a\r\n            // wake-resume spawn in flight (live `resume.pid`) means the seat is\r\n            // mid-revival — normalizing now would land `suspended` under the\r\n            // incoming bind (which carries rest_state forward by design,\r\n            // REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.\r\n            // Skip this tick; a genuinely dead spawn probes dead next tick.\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            if read_resume_pid(&perch).is_some_and(spt_store::proc::is_process_alive) {\r\n                eprintln!(\r\n                    \"LIVENESS_RECONCILE_DEFER:{id}: no broker session but a resume is in flight\"\r\n                );\r\n                continue;\r\n            }\r\n            // Definitive death → terminal normalize (offline + suspended +\r\n            // cleared anchor, ONE write), CAS-guarded on the session we observed\r\n            // so a bind that lands between our read and this write is never\r\n            // clobbered.\r\n            // [impl->REQ-ENDPOINT-UNBOUND-ATTACH]\r\n            // [impl->REQ-REST-TERMINAL-NORMALIZE]\r\n            BrainLifecycle::mark_offline(&perch, Some(&info.session_id));\r\n            // W5 Gap B (driven_by self-heal): an offlined endpoint can ALSO carry\r\n            // a stale `driven_by = Some` — its broker session (the single writer)\r\n            // is gone, so the `clear_controller` re-stamp can never fire to unlatch\r\n            // it. The split cleanup above already cleared every no-session row;\r\n            // this belt stays for the same-tick read (info is a pre-cleanup\r\n            // snapshot). RACE-FREE for the same no-live-session reason.\r\n            // [impl->REQ-HAZARD-DRIVEN-BY-SELFHEAL]\r\n            if info.driven_by.is_some() {\r\n                let _ = spt_store::info::set_driven_by(&perch, None);\r\n                eprintln!(\"DRIVEN_BY_SELFHEAL_OFFLINE:{id}: cleared stale driven_by (no session)\");\r\n            }\r\n            eprintln!(\"LIVENESS_RECONCILE_OFFLINE:{id}: no live broker session (dead harness)\");\r\n            offlined.push(id);\r\n        }\r\n    }\r\n    offlined\r\n}\r\n\r\n/// Query the broker for the set of endpoint ids it currently hosts a session for\r\n/// (`KIND_SESSIONS`) — the B2 pull signal. `None` when the broker is unreachable\r\n/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).\r\nfn query_live_session_endpoints() -> Option<BTreeSet<String>> {\r\n    let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;\r\n    let reply = brain.sessions().ok()?;\r\n    Some(\r\n        reply\r\n            .sessions\r\n            .into_iter()\r\n            .map(|s| s.endpoint)\r\n            .filter(|e| !e.is_empty())\r\n            .collect(),\r\n    )\r\n}\r\n\r\n/// The normalized program basename a perch's adapter would spawn its Psyche as —\r\n/// the first whitespace token of `psyche_init.command`, file-name only, run through\r","startLine":649,"lineNumbers":[649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\livehost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2333,"totalBytes":9900,"outputLines":175,"outputBytes":9900,"shownRange":{"start":649,"end":823},"nextOffset":824}}},"isError":false,"timestamp":1784293181058}}
{"type":"message","id":"33382df0","parentId":"07d8e1f9","timestamp":"2026-07-17T12:59:53.624Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing livehost 5s tick behavior**\n\n**Evaluating 5-second heartbeat clusters**"},{"type":"toolCall","id":"call_gmF9G3EaRlA65Hc01ZQfK5xC|fc_034a6be5a6696b6c016a5a27488eac81919fe0a04de91f0579","name":"read","arguments":{"i":"Reading post-refresh cadence window","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-1350"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":16979,"output":412,"cacheRead":80384,"cacheWrite":0,"totalTokens":97775,"reasoningTokens":359,"cost":{"input":0.08489500000000001,"output":0.01236,"cacheRead":0.040192,"cacheWrite":0,"total":0.137447}},"stopReason":"toolUse","timestamp":1784293181097,"responseId":"resp_034a6be5a6696b6c016a5a273d99c08191aa894e887892e720","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a273f32c08191aca25ea0c42f6d51","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWidIbZSF_2hymryIVf2YiKXpFk3FhCAKqZGyD78c9Dn1CLlXNnuP2ZNiqOCOKpRD54GOarBoXxk31E7R-glbvO4CiEdP_92EQeliJTfc0VhmzFBQWVlw-ztHV-9N6RL8T6nfdsdIIgtfTnTrGfjBTOiFqJ9bKJoX36q3fV8QIw9TN5eEh1dX9qPDJ2RFq3KW9-cBUvC6WrG8fx74Dyf3F5NERGwKeIl2KqGzwCOF_QiafXjG_6Nr29gTVz_AOYXDHn3E1dt409VGWNVzCgLnRQp9-PAlslek92Xkz84SxJaRZ9h1oZwjFsL5KblfZanmt0aQi1-qe3sKqI89HZRFg7PITbgz5bQei_f2xv2vylar497oiNckVvBO46Lb601SV5XIOtgf96JdTbiQGxNp7xhIqrjEF8XHQGQvPaIOUVqUjvUF177XyZOOh2zr9u_qMLixewjUjvbHnW_XmLu6SgzJt8f_ALdQrQDd6tNp86HIqmFhwmzrVjt97sdtLmvFRwADBVrt90VvWWjnzif4F4BQHX3dCygl9ltj5Y_p7BYhpFxfHsM7cKJIKVQlrGj4wIIWP-v5w3IxwsON31EBH8Kumt9vZptipLX6BPpW2ipCm5dxVSXn28VP2Ok7fCHjjKF_CoxQ3VSR64Qlvwk_cBLqR31I1RV7BT5yoDp-ZadpAFRLU8CDzky4b04RtyLPPqjSrAOiwCE7P4KY1yItU2gAGibntqF5-A4HLmyUKw_oEPXm7Yg7u7e_XLi9fMjC1OIASAGA_f04nWQIaM-Aw7-fUjNaQMqluSTK6NMS0atv5lNY8S5unPcwAp85yn_zb8B4lFZVUlIKFRUwyKOMWVWJ_-QCAl0KcsOra0OKCZn_cwg1Y-gUo2gwJH4hS1JVfLOEmsIAleAWoa4faWIlFG60ZmgjmcOdBgCh9G3Ot4_FvnlQ0vTafBQ4V8wBubMxM62nzEhc8hUoybizsBEyc3ZgUtEcZRgbk0w3nAKH2GJ_-C7r6p6Q6sgrryR0-q4atd9GHto2J7X_NylZvzW1hhZEDyL-pAOYJKSQv87GfsX67R_3x10djyMV6aArPQ-trGxhn9RHKgUNRyTx-iB7dfe_xqe9oGjKa-szDCFvXnNgKPSQhoigr9BSxGizoS1CbHc1y6LUZ_WD7ffSPjeLIA3tTVo8_J49Y7zO9L5G4psn7uxCm4ei3Rkoq1Ko_33kkVUsy3QksN6Z7yZ-7co3e5w5p7cgjMPmS_TySRj7DrDssYuQeRYYJlghrzRwCeNpab0yFMGIPxnK8qOIl6ZvDlr_uQTCdVF9aAqcpExmwVx7Rp6hwawOcUX6fFGfbtJuKhW1ukRoMHHu-tn-1TsQ1aF9h3S0segDfr6JXf6JcYEx-aeRJ8eYubSLzKyW8f1YOorG9p6pcfpfL5iQ8cjbPm-J4h1ypxhEbrGpBD2WWaHu7Mg6t7Pkh8YumNJco2FLzzsaBmm2VBvDV1KAK-xJsFPy0XunFXDmBpLnXYiBc0BzScQ0tDE2J1LJdkzyuqNkV2_b2KQs-hCKpv49Qe6_iySgTBSV3j0KJBPaVtilOB9bLUO6Ns0f0TvGJmtJuaJPL725V14QU4moMmoBbvuXZfA3-Wz-rL4JFyHhEs_7Fn9b5NlnRRHxeNbYSN7Ooe1D9EXZ6uF4rKKKfZ5OSOIpHCUrX-edvcdn5NBWJCcfNajWWlI6YZtsb0kHqdTLGAhHn659CXWTvT1hUMnfioPB_Tu7smP_QuX5SALbOrMSXxig6lNubi1ukTdUMn29uLJ4jZ-_ETVJG4YpJpS8GBjTWADDgYNXRoMbYw3Hicm48ibxCGCCBaU7PV_Zw3DrLWXrLr7GcjSQC7g1G1kICmmZeUtPCUS3-u4HubO5woXEbXhwqK2xle5-UbKc5XwNo_Pq6DJb6vrJBU812IoHA3zYkjYeQqE5n-btev8TvA-3JKacfybzNsQjR9vE8gAJwJ3QyHS-lsG76zL-MhuIl89CaJx1EGy3hqWcSZ8mq_kewgeQeXE3J_ofMfsRUYbmzyIqRrT-dPnaFUtVeCcmQFYjAC0bZxf_m6vJRp3FIG-Sw8Kox0DGgS4kod4nBQd7hk3rPi0DsM5gl3rsODSW4BMrCh5svixUKpSOTCU2fO7IyQ-ljVUKq9tt8lqkjPRgMA6XoU2Jh09YTj-dc0YKeGMaJBdOxHXzSlYKks9GfgSDfERxNUQxGSy1rj3SJO5Nhw9fLkIXJk7_2Z7GQHeGmRXxX6qChaEINE8x3oRJEm7hl0bcj_1R0CRPGHCtgFuO-Hrfmkn65iiW7F1yhvD-uB4uqojgHCPHxATmo7kDzs0_hJ5s0-pQfBqbOAXMBDQsDw13nC5FjMbaJ178RIsvmR9PMl_rcjFWMxrHFLgjjFxzfYxYPzZBVzYiSn-KimpMXM01CY2v_HtkaZ1awZlb-aG_HoNKP2m2z3lZLrRje_-BhdVNe7xCe-GChMX7t3621uVBhRGo8duEK1JcyalSLe9yCLIHdZB1ppVs8aKOZpfsjHR2bJSMU1rkPOhOe17IdSNRSMOPA6dt-Vy-56GC7SxOm-YVf507Ro_V8Ks4X2fkPD87vCZsU002O-ihtLqpfqm49gdP1NQA8IEN6UVMvmtLp6oEnPpi7DqCFMm-RY_olFW3Y9eij5bWKaCvnRFKlMypxh1mtbpuujZkyjpFspnkSnMGY-iI6bma0OI3R59htB8x9vrjeQWWZzM19VZDZ1UGXsFAYS_El9Q_Qn4NUwzK9FxYR0vjUCYZ4D0a7t3nseBRpjNJ8_r2FhVKJKEzggQ-aNJk","summary":[{"type":"summary_text","text":"**Analyzing livehost 5s tick behavior**"},{"type":"summary_text","text":"**Evaluating 5-second heartbeat clusters**"}]},{"id":"fc_034a6be5a6696b6c016a5a27488eac81919fe0a04de91f0579","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading post-refresh cadence window\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-1350\"}","call_id":"call_gmF9G3EaRlA65Hc01ZQfK5xC","name":"read"}]},"duration":12500.726800009608,"ttft":2178.9020000100136,"contextSnapshot":{"promptTokens":97363,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gmF9G3EaRlA65Hc01ZQfK5xC|fc_034a6be5a6696b6c016a5a27488eac81919fe0a04de91f0579","toolName":"read","startedAt":"2026-07-17T12:59:53.624Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Reading post-refresh cadence window"},"id":"4a15c1c5","parentId":"33382df0","timestamp":"2026-07-17T12:59:53.624Z"}
{"type":"message","id":"7b572152","parentId":"4a15c1c5","timestamp":"2026-07-17T12:59:53.693Z","message":{"role":"toolResult","toolCallId":"call_gmF9G3EaRlA65Hc01ZQfK5xC|fc_034a6be5a6696b6c016a5a27488eac81919fe0a04de91f0579","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESTART: planned update respawn (generation 1)\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n=== spt brain stderr — generation 1 — pid 76764 ===\nBRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\nCONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\nCONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_IPC_READER: spawned\nPUMP_IPC_READER: spawned\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\nPAIR_MEET_UP:BIGNET step=59476419 id=db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca addr=EndpointAddr { id: PublicKey(db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca), addrs: {Ip(100.68.35.65:59927), Ip(192.168.1.81:59927)} }\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571552 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292576906 mono_ms=162542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576906 mono_ms=162543 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576907 mono_ms=162543 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292576913 mono_ms=162549 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587413 mono_ms=173049 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587413 mono_ms=173050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587414 mono_ms=173050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589311 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594436 mono_ms=180072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599647 mono_ms=185283 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476420 id=e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6 addr=EndpointAddr { id: PublicKey(e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6), addrs: {Ip(100.68.35.65:49236), Ip(192.168.1.81:49236)} }\nPAIR_MEET_UP:BIGNET step=59476420 id=1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5 addr=EndpointAddr { id: PublicKey(1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n\n[Showing lines 999-1353 of 4898. Use :1354 to continue]"}],"details":{"truncation":{"content":"CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESTART: planned update respawn (generation 1)\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n=== spt brain stderr — generation 1 — pid 76764 ===\nBRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\nCONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\nCONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_IPC_READER: spawned\nPUMP_IPC_READER: spawned\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\nPAIR_MEET_UP:BIGNET step=59476419 id=db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca addr=EndpointAddr { id: PublicKey(db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca), addrs: {Ip(100.68.35.65:59927), Ip(192.168.1.81:59927)} }\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571552 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292576906 mono_ms=162542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576906 mono_ms=162543 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576907 mono_ms=162543 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292576913 mono_ms=162549 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587413 mono_ms=173049 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587413 mono_ms=173050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587414 mono_ms=173050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589311 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594436 mono_ms=180072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599647 mono_ms=185283 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476420 id=e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6 addr=EndpointAddr { id: PublicKey(e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6), addrs: {Ip(100.68.35.65:49236), Ip(192.168.1.81:49236)} }\nPAIR_MEET_UP:BIGNET step=59476420 id=1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5 addr=EndpointAddr { id: PublicKey(1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","truncated":true,"truncatedBy":"lines","totalLines":3900,"totalBytes":56591,"outputLines":355,"outputBytes":56591,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESTART: planned update respawn (generation 1)\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n=== spt brain stderr — generation 1 — pid 76764 ===\nBRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\nCONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_RESUMED: re-established 3 session cursor(s): [3, 1, 2]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=406 role=brain wall_ms=1784292560320 mono_ms=145957 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\nCONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_IPC_READER: spawned\nPUMP_IPC_READER: spawned\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=416 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=417 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=418 role=brain wall_ms=1784292562320 mono_ms=147956 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562320 mono_ms=147957 event=stream-sub-attach stream=142 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292562321 mono_ms=147957 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain wall_ms=1784292562322 mono_ms=147958 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562322 mono_ms=147958 event=stream-sub-attach stream=141 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=421 role=brain stream-subscriber stream=141 wall_ms=1784292562326 mono_ms=147962 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562326 mono_ms=147963 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=422 role=brain wall_ms=1784292562327 mono_ms=147963 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain wall_ms=1784292562330 mono_ms=147967 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562330 mono_ms=147967 event=stream-sub-attach stream=143 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=420 role=brain stream-subscriber stream=143 wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=423 role=brain wall_ms=1784292562333 mono_ms=147969 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=424 role=brain wall_ms=1784292562621 mono_ms=148257 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain wall_ms=1784292562622 mono_ms=148258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562622 mono_ms=148258 event=stream-sub-attach stream=144 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=425 role=brain stream-subscriber stream=144 wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=426 role=brain wall_ms=1784292562625 mono_ms=148261 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148357 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=427 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=428 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=429 role=brain wall_ms=1784292562721 mono_ms=148358 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=147 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=145 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=stream-sub-attach stream=146 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\nPAIR_MEET_UP:BIGNET step=59476419 id=db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca addr=EndpointAddr { id: PublicKey(db24b674b0e0eb2d67a402cccbaacf6dc782b5017d24e36b9cd33211a8ea1fca), addrs: {Ip(100.68.35.65:59927), Ip(192.168.1.81:59927)} }\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571552 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=435 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=436 role=brain wall_ms=1784292571553 mono_ms=157189 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain wall_ms=1784292571554 mono_ms=157190 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=148 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571554 mono_ms=157190 event=stream-sub-attach stream=149 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=438 role=brain stream-subscriber stream=149 wall_ms=1784292571556 mono_ms=157192 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157192 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=439 role=brain wall_ms=1784292571556 mono_ms=157193 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=437 role=brain stream-subscriber stream=148 wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=440 role=brain wall_ms=1784292571571 mono_ms=157207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=441 role=brain wall_ms=1784292571653 mono_ms=157289 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain wall_ms=1784292571654 mono_ms=157291 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571654 mono_ms=157291 event=stream-sub-attach stream=150 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=442 role=brain stream-subscriber stream=150 wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=443 role=brain wall_ms=1784292571661 mono_ms=157297 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=444 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=445 role=brain wall_ms=1784292574564 mono_ms=160200 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=152 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292574564 mono_ms=160200 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160200 event=stream-sub-attach stream=151 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574564 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=446 role=brain stream-subscriber stream=151 wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=448 role=brain wall_ms=1784292574565 mono_ms=160201 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=449 role=brain wall_ms=1784292574664 mono_ms=160300 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=stream-sub-attach stream=154 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=450 role=brain stream-subscriber stream=154 wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=451 role=brain wall_ms=1784292574665 mono_ms=160301 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=452 role=brain wall_ms=1784292574765 mono_ms=160401 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain wall_ms=1784292574766 mono_ms=160402 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574766 mono_ms=160402 event=stream-sub-attach stream=153 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=453 role=brain stream-subscriber stream=153 wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292576906 mono_ms=162542 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576906 mono_ms=162543 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=457 role=brain wall_ms=1784292576907 mono_ms=162543 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=430 role=brain stream-subscriber stream=147 wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=458 role=brain wall_ms=1784292576909 mono_ms=162545 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=459 role=brain wall_ms=1784292576911 mono_ms=162547 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=447 role=brain stream-subscriber stream=152 wall_ms=1784292576913 mono_ms=162549 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=460 role=brain wall_ms=1784292576913 mono_ms=162550 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=432 role=brain stream-subscriber stream=145 wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=461 role=brain wall_ms=1784292576915 mono_ms=162551 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292576926 mono_ms=162562 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292576984 mono_ms=162620 event=stream-sub-attach stream=157 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=462 role=brain wall_ms=1784292577173 mono_ms=162809 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=stream-sub-attach stream=158 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=463 role=brain stream-subscriber stream=158 wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=464 role=brain wall_ms=1784292577174 mono_ms=162810 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 wall_ms=1784292577475 mono_ms=163111 event=stream-sub-release stream=157 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577483 mono_ms=163119 event=stream-sub-attach stream=159 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 wall_ms=1784292577575 mono_ms=163211 event=stream-sub-release stream=159 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292577621 mono_ms=163257 event=stream-sub-attach stream=162 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578176 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=465 role=brain wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=stream-sub-attach stream=163 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=466 role=brain stream-subscriber stream=163 wall_ms=1784292578177 mono_ms=163813 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=467 role=brain wall_ms=1784292578178 mono_ms=163814 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 wall_ms=1784292578269 mono_ms=163905 event=stream-sub-release stream=162 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578278 mono_ms=163914 event=stream-sub-attach stream=164 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=468 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=469 role=brain wall_ms=1784292578478 mono_ms=164114 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=stream-sub-attach stream=165 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578478 mono_ms=164114 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain wall_ms=1784292578479 mono_ms=164115 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578479 mono_ms=164115 event=stream-sub-attach stream=166 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=471 role=brain stream-subscriber stream=165 wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=472 role=brain wall_ms=1784292578481 mono_ms=164117 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=470 role=brain stream-subscriber stream=166 wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=473 role=brain wall_ms=1784292578487 mono_ms=164123 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 wall_ms=1784292578566 mono_ms=164202 event=stream-sub-release stream=164 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578620 mono_ms=164256 event=stream-sub-attach stream=169 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 wall_ms=1784292578816 mono_ms=164452 event=stream-sub-release stream=169 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578824 mono_ms=164460 event=stream-sub-attach stream=170 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 wall_ms=1784292578981 mono_ms=164617 event=stream-sub-release stream=170 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579026 mono_ms=164662 event=stream-sub-attach stream=173 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=474 role=brain wall_ms=1784292579181 mono_ms=164817 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=stream-sub-attach stream=174 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=475 role=brain stream-subscriber stream=174 wall_ms=1784292579181 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=476 role=brain wall_ms=1784292579182 mono_ms=164818 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=477 role=brain wall_ms=1784292579281 mono_ms=164917 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=stream-sub-attach stream=175 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579281 mono_ms=164917 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=478 role=brain stream-subscriber stream=175 wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172340 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=485 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=486 role=brain wall_ms=1784292586704 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586704 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=488 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=487 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=489 role=brain wall_ms=1784292586705 mono_ms=172341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=496 role=brain wall_ms=1784292586712 mono_ms=172348 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587413 mono_ms=173049 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587413 mono_ms=173050 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=505 role=brain wall_ms=1784292587414 mono_ms=173050 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589311 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=515 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=516 role=brain wall_ms=1784292589613 mono_ms=175249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=525 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=526 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=531 role=brain wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=532 role=brain wall_ms=1784292594434 mono_ms=180070 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594436 mono_ms=180072 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180072 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599647 mono_ms=185283 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nNET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\nPAIR_MEET_UP:SPT_DEV step=59476420 id=e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6 addr=EndpointAddr { id: PublicKey(e5024ef6a5b49a4ffe863d8c7f20dce8a1be5c05b0aa8e6db9f69f0565e57dc6), addrs: {Ip(100.68.35.65:49236), Ip(192.168.1.81:49236)} }\nPAIR_MEET_UP:BIGNET step=59476420 id=1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5 addr=EndpointAddr { id: PublicKey(1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]","startLine":999,"lineNumbers":[999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":4898,"totalBytes":56591,"outputLines":355,"outputBytes":56591,"shownRange":{"start":999,"end":1353},"nextOffset":1354}}},"isError":false,"timestamp":1784293193692}}
{"type":"message","id":"53ec47c3","parentId":"7b572152","timestamp":"2026-07-17T13:00:22.721Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying 5-second singleton connection pattern**\n\n**Confirming Brain connection heartbeat timing**"},{"type":"thinking","thinking":"**Mapping key log line numbers**"},{"type":"toolCall","id":"call_TO8tqoIq4V7KnNPwp3GkiDQB|fc_034a6be5a6696b6c016a5a276633d88191b689ec5b254b98c8","name":"grep","arguments":{"i":"Anchoring five second connections","pattern":"conn=(433|434|455|480|481|521|534|538) role=brain .*event=(write-start|transport-close)","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_WVfvHjIA3vzKOtnkfFBGXK9W|fc_034a6be5a6696b6c016a5a276633f08191b0f82029205c6e5c","name":"grep","arguments":{"i":"Anchoring pump round events","pattern":"PUMP_PEER_FAIL|PUMP_IPC_READER|BRAIN_NET_CONSUMERS_UP","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-4898","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_tsUgmTBpY8QZGQNWVvBYl57g|fc_034a6be5a6696b6c016a5a276635b4819187afd0fc92264273","name":"grep","arguments":{"i":"Anchoring current failures","pattern":"CONN_WRITE_POISONED|DISPATCH_LOOP_FAIL|DISPATCH:|DISPATCH_EV|PUMP_LOOP_FAIL|WAKE_RESUME","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-4898","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_Oaxh5Llu4E2d8Vv5rclwi2po|fc_034a6be5a6696b6c016a5a276635c08191bcd008c46b7b68ca","name":"grep","arguments":{"i":"Anchoring stream release cadence","pattern":"event=stream-sub-(attach|release)","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1200-1450","case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":21067,"output":1019,"cacheRead":94720,"cacheWrite":0,"totalTokens":116806,"reasoningTokens":658,"cost":{"input":0.10533500000000001,"output":0.03057,"cacheRead":0.04736,"cacheWrite":0,"total":0.183265}},"stopReason":"toolUse","timestamp":1784293193735,"responseId":"resp_034a6be5a6696b6c016a5a274a50a08191968da1863523a445","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a274e272c8191b63705298b9b575e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWidcC4vVXG6roa6fN_YUOODPnBcPH83L_ewqKlfPRDkMCPCNd2ilRO99Y0mWtgSqD0fKR66LP17jXdKfZI0I7HI4nXsK90mx6m9YTggyUg7cGHHrhbsZJay5MWj6aI5FK2eUWcEOAGhbj-X_VjVSKy46oCBkJTNFQb1RHT4jyEh4aN9dq25HnsN1e012g6JKuDMPz6eGSsZKY_oz2ING5aGnjbdWV40BFSVEL0zKFF9gyvuEZpQ_coQ2QJEN_Q5IZXxAejX-ldNetQSML9qhSPzt6BO5NzgPU0lNpnZEg-AhUFFEqCf4Y3NPKm9Zw7lWir3HEDo--xo65e96m1OZjHgPltrJxFRtvFH-IHSENZCC4DBuUl59RkhmZ09mjxPM9Vw7mNh-lYXeBaS2c3yJfSSFBlct8GW3DhNw6UVTY3X_Fv-duHda4HAvYqWbkG5RBUYcqqnVHL6maV7yTqoldEnUwi16_0Luxh_YQT1uftky9V7iIe6CvxLODW6T6lggjs48lIhVuyUyiwaahYPBZVY1SgapJx-WCQu7HpCcqQgqwHr_BsC2TCCSmVhnxDWk0cX42g0x5PDnN36KAkJYk3rZY9_HKJCzLFpLeOCCBTx-GT70kpIzNxQ24wi8pPFeNNdOi-cJJRZ2sUbWFJxh37tYu-2SMPfa5OSx0ezsxImVaYjPtPQFrC4s9zvOf_v-mjLDL_7GFWvbKHfvFGxuMkRKT5Q3LRLceKqXWMnea5_tvBHCVr7gC8MctqdDICEh03Jvup9OniUkcx7LBU85pGNh6I8HeiusxUELThhkxr5oObg9OJwwpbyVUdx6rUE7hg91_zLEhiArpvvE0d2QMUz4QmbADbE-wrYi9X0L4VEY1nHQDDf_GJHwvjfvhUxzh0A46Z929Wox0VgzUvxlzFqz3cUYqRDr3ocGhwCnARhnzNgwYW2O9Zh2BP1CkSiyHOY421RW5rnnFtwTCnvzc9tWozhOmE6J2LhplUKVYI6ecBHEE4nWPjk-kQ3X4yeVaRMrT9-_5n_flyQgAi1PO59w8HO6ebZSZgtDGl-og4ciUCxOXnCwcGBpi0f9r_yBpu7Tfzi9x2GlmkdEeSFUYq2GjBJ_0T0OfSREG0CzounK--3jE6agz4C65jesQzM9LWIXlmZYp65C2owIsdfLQszj_pGL0qK2oXumCGSCCSFVw782wVynCYrSNI69s-JhJh55gO_fA_sSnV9ml6RcgryTgthjTEq8Nojc6A_3aOqVza6QIzslXjZoHJ2ryNQqglFwY7eTl2sp1WTo0aqf7ZaYF3W_xaWPk3f9c4e3mZG3P0UYchDr3VvxOda2d26yL5CcQOiXdR07Lk1U9FnEKOvA1zEBVCyaJ3D1svdUpc8EZnF4-8A8Fzx9PViDsOIR6p85Qz3cwGWZujFjB6EBW1lig-GewwJcdcIpXFG2YQ-AI8XhWVT9zDFqGC0MOF-lhL8_OxB7-FpDrBwtS2xRXFJi5kGejpKiGJo--gN75KSmQcnr4mMOy5b1QYxtsBjdBugphqeqj6s0XcSTw3BAi_g4q61kCAG3P1b67EYuMOqTL2-Vt6b8PISenq-nYIE56mssUYFSBzDLnFAxqLLkQTqbp2TN75aj05O2t9rf2yFcdUktXdQ808-S5l_OWC0Hs9CxVPNw_RhwD0nFRh8-eXUZg0K-C62HLkbzRjLbA7JtNhAnX9yXVEn8a1c3jIO3Be7Bfg_5LqrGtDiR0aOb0VoVt6AvX7AVJ6RNUZMFxme2QSF2t72MIDopyUGgadHlcCk2IxTsw7FfNXd_g9C56hVcPuswDaljL7PySgKt-4sKSSX4Fu_fu2bn2rK6IUdEbxL-72j82Debnj47WMNdh5W7DHe7a3a7SGnsVOiJMSe4C5lcINi1QuyhzaXKclX_TeTiWo9DWyLBrvk3BwGkKOTUJ3cMnGu2K-nfsKPV0WL8mkn2jGOrZPDow29rLlWIxWAYwVQn1Q91BUKHSETc7snm8ehdSw3IHSWtqxuXrLYbt7JD7HsaSa6QNrpIUzY-8ZeKs6HoW5NdndlWoWPNqKSVKP4qcufSMNrFscOaL4OXRvlpy1Yxl0YlLocGSUsS-Qe3j9CV2pxiwvldC2Cg1x-sJ0diwsOmk6ggaShQ0iTOBo36qd-oystbLk0i2pmt_2RRv9zlUbwVKvDnyMYuHR9nnmNzMD8YxGoLE6kWTpSdsmHkPZfybNDx8AzE3FuvMxcLHsJOD4jCkMq9otVAV4Uz3Kljtzj9xlBUm7Z3NO9X0utEP5AmveBYcTFrOHS_myyOsGZDeOdO_G0DCf6emuSAonGOp7_bkM8jyeo1y0Ic2PZheCF3wG8hj9hrgpKg6ung-sbdMOEpMYxzjqe0JSjliWc-W3Y_R7U7jOFylCn-sE9x-SgSWvlTjU_QD78wyC26pJijJYXTSoMJsHrphceK-ds5CVbZtXYjtv-MjC27n9Kav7_SxsyFUbuUxKPOleZwdyLpDr-WCBwlkyr_Rk67m2VXkA_fJSrN9_nLYN72qVXZbHxrwhXltSxC3r6cyIuAHcNNo7DUop2b5ssT-AeCbhlmLdS6OCZ8sifPsVO6g-rauVt9rwnWP9qkioC8--2up-Z6t9X6k5B63VTs2grQk0QTp6OkedM3ByUo6QqnqsUaJymzgOwqGN9y8AC-hhWcd0uAodmZsNMLEOo7MgMk2wqHL-0YdHMV7ffPWHvcK0_1sCBOKhCeW41rWhB2GHgE3dkWoI2tsJOPcKEBmcAjM0ga4X5ohPp4GqwfUPdmjH1nszSr_VsVYuBWVKIxX0sieplFPtPso7hd1QlswN_NeiC-yPJlA_9gMSoCZWwCk9lya2hi11QYXfrRAJ4Wq4T-G2OWMC_N3K8l-gigwokTizEjG4ikEgsU-fLkBcGo9AJTbbuTBzx3PHReDuUfyXd827Rusrziht6M58lbyU3p2k9zGfkw6KF-mbsU9efeh2I7dQzvWbHboYpLWaFt-IVItB0JrX0yVXVoWdeYiN5l5n_4vG7F6FxMBlQhuqfMAoiG7Q_8OAqL7fN5SfJe__cAXt-Eye6UpvmvFeSIPQfFTldXUyp-U9UUKvP2axQFSRi8vMj3UcW_vkvI7RcO4Zktlx8ztWKmgTChbOCjSMF4ZQaTDXH4jex_Ns5XCjw12f5csQkmyRsHPpxvLWqdtxcRPvB-vCEtg1ZKq2M9N7xi3_VStp4ioibsopt0YXVkbNlour98dJCXposvjDETjX1k_bfUJ1zm27Mha9OL6_yAsCKqribp62wAP4akejLGSzyNAo5WVWz2ftuBiYroFbTJ_N_WUar0drbrFU3TquHRper1WxyW6emizkN6cHsmGkWufGR3rwhZhXoqPgv7pEC4","summary":[{"type":"summary_text","text":"**Identifying 5-second singleton connection pattern**"},{"type":"summary_text","text":"**Confirming Brain connection heartbeat timing**"}]},{"id":"rs_034a6be5a6696b6c016a5a275c86948191a985c34b18a0c9de","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWidmPOYBfB8kxm3TJJYViM9XRm9w7-_mP_kTcCB_AF_mA8ORIxSbJi8MTUH-ZSXkgewzbQlMxkNuPNMQa2d1W9FHb-iXH0NfyYkztRq5_v4qZKyVN20WGh3SD1wM1jr2k8s6hUmyhriv1stQp6-vDT6RIRd1AHnvnEEPyRIoRW6ijtxNtL5LfZvDpiDu-AY8V55LyVfXaDvKuHqOuQYhm7SaukLr6C_5gHu3KtFVFnP8pgGnXRewIk24Dl4PXI-5QdftqeimVwubm0bHNsfjVcpVOAw2grf8-29MGSG_VI995uSbEwJZJYkcyOioUIQeWKSvsv0kybq3-ugYh3fzaGrm63DHR4egarxwUDwZ1zL1-bc4xnV5DISk-fjCReVUvKxczV_BBxjJJ7K7UU6zKNjUqg5UeD_pOOusMjXKt9fsFyn_ylFTD5h4m53yWCUbhuKMN_zV2IVwjL35jaNchQK-ZItsOATSRcrmQ856704rIYaZGGPx_j4OjtJ7rqtLbwABHkaNKG7uppG0e1haNrnZkCTM38-NHOaUm9Wgqo2RhcdjQQnp45sE8jqBvQFtlc10JSUUS9uk5j870B8PVnoyGb2_aMYq47fI_eYfqfdk7grF_8Yz_ApHjdvfQvZHYbxW85tXcJ1Ta4YbZ-Q9viqMiYCWYEOeMSZBeKZCzhmlsaeJINrlxwi6TbP-yO2HVVQUnXhSLSFJJ1iuk-XeeoIGMkPaU62QDRGijaJC4cR9NE9B2P0HZYGUkQ2ENdnpTii3DMHLIDKjkrNrXnsH6uZbLq4kdiDl4kVxo1RodylkCqmUbx-Ys8gjrSH-pkb6FxxW73KTPAdCAB7y9YwxJDNdkJwT1HUUk0Tu4yJEX4DETqUsS7Nx1Myi6-z7VNAYf6mWjc7Wiu2tr5XOtPqGy4RVzBwcjJE4VfvmfKHOBvslCF-SwhkeZ84xc7pds-OB8OUBqU59fQc1yO07Utjqt6Wmz7AvWM0sb6uD5R2YnJ9zVySeCvY25E8X2h6QWexP8nOpV4JQwOwIUfc8PXrJP7z5kqwbkHDuQQpDtAhFnxJ5YJXDemJe3zdzZRjR5CrjNbxrV07_qXACWugailKtKkFvMFBiBPC9r4ilgVg4evgTW_mDPeu3lcvq3TOtKkumYJzA43GL4Tw6kWxSHpJSnHrVVS1DoPyN2FEsCMwJRXoQ2tALfEl4-QZN8Y4tu2jXVtyneurDINk7z3iWQOIke1BXyWW4ACME1Kt3GPlxe0BmmKIUJAosATgTvF37xVjxVEQoQhuqKcYcqvIpnzTM0AIfdUA4UMbwGWzNFFlXoMdQkJ9UziPE34z1pqpN5PEiQw8pg3mAMIh4s6rRY1nL62LqwXPSEHyG9KuZrxytEu7dGABfSbnchrnO0ATj93yCppntoRl7OfhDVTQCBbu2Rec0SrDY9kaZEjG7-wjSavwy3XePqDBsk68GyZhVOcPZ5aivPjxcLEhJTv9rwOfKHfInl_1Lll3mreNx7fZQ3s-DMaXIEN-CXHef1uf_84_Zz9Fdzk5z0O9W41eHDaxijUThjXWoAohECTt3h0kR9dzyfdGDube8FJ27KlMZ6uk-N__VESDWLFebvgNf7D8BZU4SipmUQ56otthuQxh7yE6ry_d3B12HRugqCKppADN38uAHR5f_V0kgyLKXs5_6EP4lGg==","summary":[{"type":"summary_text","text":"**Mapping key log line numbers**"}]},{"id":"fc_034a6be5a6696b6c016a5a276633d88191b689ec5b254b98c8","type":"function_call","status":"completed","arguments":"{\"i\":\"Anchoring five second connections\",\"pattern\":\"conn=(433|434|455|480|481|521|534|538) role=brain .*event=(write-start|transport-close)\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_TO8tqoIq4V7KnNPwp3GkiDQB","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a276633f08191b0f82029205c6e5c","type":"function_call","status":"completed","arguments":"{\"i\":\"Anchoring pump round events\",\"pattern\":\"PUMP_PEER_FAIL|PUMP_IPC_READER|BRAIN_NET_CONSUMERS_UP\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-4898\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_WVfvHjIA3vzKOtnkfFBGXK9W","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a276635b4819187afd0fc92264273","type":"function_call","status":"completed","arguments":"{\"i\":\"Anchoring current failures\",\"pattern\":\"CONN_WRITE_POISONED|DISPATCH_LOOP_FAIL|DISPATCH:|DISPATCH_EV|PUMP_LOOP_FAIL|WAKE_RESUME\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-4898\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_tsUgmTBpY8QZGQNWVvBYl57g","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a276635c08191bcd008c46b7b68ca","type":"function_call","status":"completed","arguments":"{\"i\":\"Anchoring stream release cadence\",\"pattern\":\"event=stream-sub-(attach|release)\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1200-1450\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_Oaxh5Llu4E2d8Vv5rclwi2po","name":"grep"}]},"duration":28961.139100000262,"ttft":4495.2961000055075,"contextSnapshot":{"promptTokens":115787,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TO8tqoIq4V7KnNPwp3GkiDQB|fc_034a6be5a6696b6c016a5a276633d88191b689ec5b254b98c8","toolName":"grep","startedAt":"2026-07-17T13:00:22.722Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Anchoring five second connections"},"id":"77c37abf","parentId":"53ec47c3","timestamp":"2026-07-17T13:00:22.722Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_WVfvHjIA3vzKOtnkfFBGXK9W|fc_034a6be5a6696b6c016a5a276633f08191b0f82029205c6e5c","toolName":"grep","startedAt":"2026-07-17T13:00:22.722Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Anchoring pump round events"},"id":"47881659","parentId":"77c37abf","timestamp":"2026-07-17T13:00:22.722Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_tsUgmTBpY8QZGQNWVvBYl57g|fc_034a6be5a6696b6c016a5a276635b4819187afd0fc92264273","toolName":"grep","startedAt":"2026-07-17T13:00:22.722Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Anchoring current failures"},"id":"d200710f","parentId":"47881659","timestamp":"2026-07-17T13:00:22.722Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Oaxh5Llu4E2d8Vv5rclwi2po|fc_034a6be5a6696b6c016a5a276635c08191bcd008c46b7b68ca","toolName":"grep","startedAt":"2026-07-17T13:00:22.722Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Anchoring stream release cadence"},"id":"0ac593ab","parentId":"d200710f","timestamp":"2026-07-17T13:00:22.722Z"}
{"type":"message","id":"0b5eb45a","parentId":"0ac593ab","timestamp":"2026-07-17T13:00:22.734Z","message":{"role":"toolResult","toolCallId":"call_tsUgmTBpY8QZGQNWVvBYl57g|fc_034a6be5a6696b6c016a5a276635b4819187afd0fc92264273","toolName":"grep","content":[{"type":"text","text":"No matches found"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":0,"fileCount":0,"files":[],"truncated":false},"isError":false,"useless":true,"timestamp":1784293222733}}
{"type":"message","id":"1f247e02","parentId":"0b5eb45a","timestamp":"2026-07-17T13:00:22.734Z","message":{"role":"toolResult","toolCallId":"call_TO8tqoIq4V7KnNPwp3GkiDQB|fc_034a6be5a6696b6c016a5a276633d88191b689ec5b254b98c8","toolName":"grep","content":[{"type":"text","text":" 1069|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1070|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1071|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1072|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1073|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1074|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1075|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1076|PAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\n...\n 1123|CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1124|CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1125|CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1126|CONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1127|CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1128|CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1204|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1205|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1206|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1207|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n 1208|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1209|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n*1210|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1211|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1212|CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1213|CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1214|CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1304|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1305|CONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1306|CONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1307|CONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1308|CONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1309|CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1334|CONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1335|CONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1336|CONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1337|CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599647 mono_ms=185283 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1338|CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1339|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1347|PAIR_MEET_UP:BIGNET step=59476420 id=1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5 addr=EndpointAddr { id: PublicKey(1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }\n*1348|CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1349|CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1350|CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1351|CONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1352|CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":16,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":16}],"truncated":false,"displayContent":" 1069│CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1070│CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1071│CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1072│CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1073│CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1074│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1075│NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)\n 1076│PAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }\n     │...\n 1123│CONN_LIFECYCLE: conn=454 role=brain wall_ms=1784292574774 mono_ms=160410 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1124│CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1125│CONN_LIFECYCLE: conn=455 role=brain wall_ms=1784292575467 mono_ms=161103 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1126│CONN_LIFECYCLE: conn=409 role=brain wall_ms=1784292576901 mono_ms=162537 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1127│CONN_LIFECYCLE: conn=419 role=brain stream-subscriber stream=142 wall_ms=1784292576904 mono_ms=162540 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1128│CONN_LIFECYCLE: conn=456 role=brain wall_ms=1784292576905 mono_ms=162541 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1204│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1205│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1206│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1207│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n 1208│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1209│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n*1210│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1211│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1212│CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1213│CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1214│CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1304│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1305│CONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1306│CONN_LIFECYCLE: conn=521 role=brain wall_ms=1784292590567 mono_ms=176203 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1307│CONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1308│CONN_LIFECYCLE: conn=522 role=brain wall_ms=1784292593527 mono_ms=179163 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1309│CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1334│CONN_LIFECYCLE: conn=533 role=brain wall_ms=1784292594436 mono_ms=180073 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1335│CONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1336│CONN_LIFECYCLE: conn=534 role=brain wall_ms=1784292595600 mono_ms=181236 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1337│CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599647 mono_ms=185283 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1338│CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1339│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1347│PAIR_MEET_UP:BIGNET step=59476420 id=1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5 addr=EndpointAddr { id: PublicKey(1d94bfbebe9e32e1e624312512d3c14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }\n*1348│CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1349│CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1350│CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1351│CONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1352│CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293222734}}
{"type":"message","id":"b6c72dc0","parentId":"1f247e02","timestamp":"2026-07-17T13:00:22.737Z","message":{"role":"toolResult","toolCallId":"call_WVfvHjIA3vzKOtnkfFBGXK9W|fc_034a6be5a6696b6c016a5a276633f08191b0f82029205c6e5c","toolName":"grep","content":[{"type":"text","text":" 1015|CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1016|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018|PUMP_IPC_READER: spawned\n*1019|PUMP_IPC_READER: spawned\n 1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1423|CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1609|CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614|CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1796|CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801|CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2058|CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2590|CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595|CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3623|CONN_LIFECYCLE: conn=1477 role=brain wall_ms=1784292979227 mono_ms=564862 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3624|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464\n*3625|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480\n 3626|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3627|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3628|CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":17,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":17}],"truncated":false,"displayContent":" 1015│CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1016│BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\n 1017│CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018│PUMP_IPC_READER: spawned\n*1019│PUMP_IPC_READER: spawned\n 1020│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1253│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1423│CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428│CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1609│CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614│CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1796│CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2058│CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2590│CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595│CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 3623│CONN_LIFECYCLE: conn=1477 role=brain wall_ms=1784292979227 mono_ms=564862 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3624│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464\n*3625│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480\n 3626│CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3627│CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3628│CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293222737}}
{"type":"message","id":"09094925","parentId":"b6c72dc0","timestamp":"2026-07-17T13:00:22.739Z","message":{"role":"toolResult","toolCallId":"call_Oaxh5Llu4E2d8Vv5rclwi2po|fc_034a6be5a6696b6c016a5a276635c08191bcd008c46b7b68ca","toolName":"grep","content":[{"type":"text","text":" 1200|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1201|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n*1202|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1203|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n*1204|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1205|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1206|CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1207|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n*1208|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1209|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n 1210|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1211|CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1212|CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1214|CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1215|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1216|CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1217|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1218|CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1231|CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1232|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1233|CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1234|CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1235|CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1236|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1237|CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1242|CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1243|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1244|CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1245|CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1246|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1247|CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1261|CONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1262|CONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1263|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1264|CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1265|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1266|CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1271|CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1272|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1273|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1274|CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1275|CONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1278|CONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1279|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1280|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1281|CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1282|CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1285|CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1286|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1288|CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1289|CONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1295|CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1296|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1297|CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1298|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1299|CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1300|CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1301|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1302|CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304|CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1309|CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1310|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1311|CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1312|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1313|CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1319|CONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1320|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1321|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1322|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1323|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1324|CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1325|CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1326|CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1338|CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341|CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342|CONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1355|CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784292601859 mono_ms=187495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1357|CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=199 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=199 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1358|CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1359|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1360|CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1366|CONN_LIFECYCLE: conn=546 role=brain wall_ms=1784292601959 mono_ms=187595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1367|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601959 mono_ms=187595 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1368|CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601964 mono_ms=187600 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1369|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601964 mono_ms=187600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1370|CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601965 mono_ms=187601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1378|CONN_LIFECYCLE: conn=551 role=brain wall_ms=1784292602560 mono_ms=188196 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1379|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1380|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1381|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1382|CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1383|CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784292602561 mono_ms=188197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1384|CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=208 wall_ms=1784292602561 mono_ms=188197 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1385|CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1386|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1387|CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1391|CONN_LIFECYCLE: conn=555 role=brain wall_ms=1784292602569 mono_ms=188205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1392|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602569 mono_ms=188205 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1393|CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1394|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1395|CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1400|CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784292604768 mono_ms=190404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1401|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1402|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403|CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604771 mono_ms=190407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1404|CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784292604771 mono_ms=190407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1411|CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784292608884 mono_ms=194520 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1412|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1413|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414|CONN_LIFECYCLE: conn=567 role=brain wall_ms=1784292608885 mono_ms=194521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1415|CONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608885 mono_ms=194521 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1416|CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1417|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1418|CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1429|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614605 mono_ms=200241 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1430|CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614613 mono_ms=200249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1431|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1432|CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1441|CONN_LIFECYCLE: conn=578 role=brain wall_ms=1784292617012 mono_ms=202648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1442|CONN_LIFECYCLE: conn=578 role=brain stream-subscriber stream=215 wall_ms=1784292617012 mono_ms=202648 event=stream-sub-attach stream=215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1443|CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1444|CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1445|CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1446|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1448|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":39,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":39}],"truncated":false,"displayContent":" 1200│CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1201│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]\n*1202│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1203│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-POISON-ATTRIBUTION]\n*1204│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292579855 mono_ms=165492 event=stream-sub-attach stream=179 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1205│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166137 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1206│CONN_LIFECYCLE: conn=480 role=brain wall_ms=1784292580501 mono_ms=166138 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1207│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580976 mono_ms=166612 event=stream-sub-release stream=179 [REQ-CONN-POISON-ATTRIBUTION]\n*1208│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292580984 mono_ms=166620 event=stream-sub-attach stream=180 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1209│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292581122 mono_ms=166759 event=stream-sub-release stream=180 [REQ-CONN-POISON-ATTRIBUTION]\n 1210│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1211│CONN_LIFECYCLE: conn=481 role=brain wall_ms=1784292585534 mono_ms=171170 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1212│CONN_LIFECYCLE: conn=482 role=brain wall_ms=1784292586604 mono_ms=172240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1214│CONN_LIFECYCLE: conn=483 role=brain wall_ms=1784292586605 mono_ms=172242 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1215│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586606 mono_ms=172242 event=stream-sub-attach stream=181 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1216│CONN_LIFECYCLE: conn=483 role=brain stream-subscriber stream=181 wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1217│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1218│CONN_LIFECYCLE: conn=484 role=brain wall_ms=1784292586615 mono_ms=172251 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1231│CONN_LIFECYCLE: conn=494 role=brain wall_ms=1784292586707 mono_ms=172343 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1232│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=185 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1233│CONN_LIFECYCLE: conn=491 role=brain stream-subscriber stream=186 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=186 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1234│CONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586707 mono_ms=172343 event=stream-sub-attach stream=184 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1235│CONN_LIFECYCLE: conn=493 role=brain stream-subscriber stream=185 wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1236│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1237│CONN_LIFECYCLE: conn=495 role=brain wall_ms=1784292586709 mono_ms=172345 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1242│CONN_LIFECYCLE: conn=492 role=brain wall_ms=1784292586713 mono_ms=172349 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1243│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=182 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1244│CONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586713 mono_ms=172349 event=stream-sub-attach stream=183 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1245│CONN_LIFECYCLE: conn=490 role=brain stream-subscriber stream=182 wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1246│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1247│CONN_LIFECYCLE: conn=497 role=brain wall_ms=1784292586715 mono_ms=172351 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1261│CONN_LIFECYCLE: conn=503 role=brain wall_ms=1784292587408 mono_ms=173044 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1262│CONN_LIFECYCLE: conn=502 role=brain stream-subscriber stream=187 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=187 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1263│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587408 mono_ms=173044 event=stream-sub-attach stream=188 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1264│CONN_LIFECYCLE: conn=503 role=brain stream-subscriber stream=188 wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1265│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1266│CONN_LIFECYCLE: conn=504 role=brain wall_ms=1784292587410 mono_ms=173046 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1271│CONN_LIFECYCLE: conn=506 role=brain wall_ms=1784292589111 mono_ms=174747 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1272│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589111 mono_ms=174748 event=stream-sub-attach stream=189 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1273│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1274│CONN_LIFECYCLE: conn=507 role=brain stream-subscriber stream=189 wall_ms=1784292589112 mono_ms=174748 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1275│CONN_LIFECYCLE: conn=508 role=brain wall_ms=1784292589112 mono_ms=174748 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1278│CONN_LIFECYCLE: conn=509 role=brain wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1279│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=stream-sub-attach stream=190 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1280│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1281│CONN_LIFECYCLE: conn=510 role=brain stream-subscriber stream=190 wall_ms=1784292589312 mono_ms=174948 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1282│CONN_LIFECYCLE: conn=511 role=brain wall_ms=1784292589312 mono_ms=174948 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1285│CONN_LIFECYCLE: conn=512 role=brain wall_ms=1784292589512 mono_ms=175148 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1286│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=stream-sub-attach stream=191 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1287│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1288│CONN_LIFECYCLE: conn=513 role=brain stream-subscriber stream=191 wall_ms=1784292589513 mono_ms=175149 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1289│CONN_LIFECYCLE: conn=514 role=brain wall_ms=1784292589513 mono_ms=175149 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1295│CONN_LIFECYCLE: conn=517 role=brain wall_ms=1784292589614 mono_ms=175250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1296│CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589614 mono_ms=175250 event=stream-sub-attach stream=193 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1297│CONN_LIFECYCLE: conn=517 role=brain stream-subscriber stream=193 wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1298│CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1299│CONN_LIFECYCLE: conn=519 role=brain wall_ms=1784292589622 mono_ms=175258 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1300│CONN_LIFECYCLE: conn=518 role=brain wall_ms=1784292589626 mono_ms=175262 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1301│CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589626 mono_ms=175262 event=stream-sub-attach stream=192 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1302│CONN_LIFECYCLE: conn=518 role=brain stream-subscriber stream=192 wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1303│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1304│CONN_LIFECYCLE: conn=520 role=brain wall_ms=1784292589634 mono_ms=175270 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1309│CONN_LIFECYCLE: conn=523 role=brain wall_ms=1784292593528 mono_ms=179164 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1310│CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593528 mono_ms=179164 event=stream-sub-attach stream=194 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1311│CONN_LIFECYCLE: conn=523 role=brain stream-subscriber stream=194 wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1312│CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1313│CONN_LIFECYCLE: conn=524 role=brain wall_ms=1784292593531 mono_ms=179167 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1319│CONN_LIFECYCLE: conn=527 role=brain wall_ms=1784292594430 mono_ms=180066 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1320│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=196 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1321│CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=197 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1322│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1323│CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180066 event=stream-sub-attach stream=195 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1324│CONN_LIFECYCLE: conn=529 role=brain stream-subscriber stream=197 wall_ms=1784292594430 mono_ms=180066 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1325│CONN_LIFECYCLE: conn=530 role=brain stream-subscriber stream=195 wall_ms=1784292594430 mono_ms=180067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1326│CONN_LIFECYCLE: conn=528 role=brain stream-subscriber stream=196 wall_ms=1784292594433 mono_ms=180069 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1338│CONN_LIFECYCLE: conn=535 role=brain wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1339│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=stream-sub-attach stream=198 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1340│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1341│CONN_LIFECYCLE: conn=536 role=brain stream-subscriber stream=198 wall_ms=1784292599648 mono_ms=185284 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1342│CONN_LIFECYCLE: conn=537 role=brain wall_ms=1784292599648 mono_ms=185284 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1355│CONN_LIFECYCLE: conn=542 role=brain wall_ms=1784292601859 mono_ms=187495 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1356│CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=200 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1357│CONN_LIFECYCLE: conn=542 role=brain stream-subscriber stream=199 wall_ms=1784292601859 mono_ms=187495 event=stream-sub-attach stream=199 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1358│CONN_LIFECYCLE: conn=541 role=brain stream-subscriber stream=200 wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1359│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1360│CONN_LIFECYCLE: conn=543 role=brain wall_ms=1784292601861 mono_ms=187497 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1366│CONN_LIFECYCLE: conn=546 role=brain wall_ms=1784292601959 mono_ms=187595 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1367│CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601959 mono_ms=187595 event=stream-sub-attach stream=201 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1368│CONN_LIFECYCLE: conn=546 role=brain stream-subscriber stream=201 wall_ms=1784292601964 mono_ms=187600 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1369│CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601964 mono_ms=187600 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1370│CONN_LIFECYCLE: conn=547 role=brain wall_ms=1784292601965 mono_ms=187601 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1378│CONN_LIFECYCLE: conn=551 role=brain wall_ms=1784292602560 mono_ms=188196 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1379│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=209 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1380│CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=stream-sub-attach stream=207 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1381│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1382│CONN_LIFECYCLE: conn=554 role=brain stream-subscriber stream=207 wall_ms=1784292602560 mono_ms=188196 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1383│CONN_LIFECYCLE: conn=552 role=brain wall_ms=1784292602561 mono_ms=188197 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1384│CONN_LIFECYCLE: conn=552 role=brain stream-subscriber stream=208 wall_ms=1784292602561 mono_ms=188197 event=stream-sub-attach stream=208 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1385│CONN_LIFECYCLE: conn=553 role=brain stream-subscriber stream=209 wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1386│CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1387│CONN_LIFECYCLE: conn=556 role=brain wall_ms=1784292602563 mono_ms=188199 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1391│CONN_LIFECYCLE: conn=555 role=brain wall_ms=1784292602569 mono_ms=188205 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1392│CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602569 mono_ms=188205 event=stream-sub-attach stream=210 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1393│CONN_LIFECYCLE: conn=555 role=brain stream-subscriber stream=210 wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1394│CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1395│CONN_LIFECYCLE: conn=558 role=brain wall_ms=1784292602571 mono_ms=188207 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1400│CONN_LIFECYCLE: conn=560 role=brain wall_ms=1784292604768 mono_ms=190404 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1401│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=stream-sub-attach stream=211 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1402│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604768 mono_ms=190404 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1403│CONN_LIFECYCLE: conn=561 role=brain stream-subscriber stream=211 wall_ms=1784292604771 mono_ms=190407 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1404│CONN_LIFECYCLE: conn=562 role=brain wall_ms=1784292604771 mono_ms=190407 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1411│CONN_LIFECYCLE: conn=564 role=brain wall_ms=1784292608884 mono_ms=194520 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1412│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=stream-sub-attach stream=212 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1413│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608884 mono_ms=194520 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1414│CONN_LIFECYCLE: conn=567 role=brain wall_ms=1784292608885 mono_ms=194521 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1415│CONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608885 mono_ms=194521 event=stream-sub-attach stream=213 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1416│CONN_LIFECYCLE: conn=566 role=brain stream-subscriber stream=212 wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1417│CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1418│CONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1428│CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1429│CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614605 mono_ms=200241 event=stream-sub-attach stream=214 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1430│CONN_LIFECYCLE: conn=572 role=brain stream-subscriber stream=214 wall_ms=1784292614613 mono_ms=200249 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1431│CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1432│CONN_LIFECYCLE: conn=573 role=brain wall_ms=1784292614614 mono_ms=200250 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1441│CONN_LIFECYCLE: conn=578 role=brain wall_ms=1784292617012 mono_ms=202648 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1442│CONN_LIFECYCLE: conn=578 role=brain stream-subscriber stream=215 wall_ms=1784292617012 mono_ms=202648 event=stream-sub-attach stream=215 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1443│CONN_LIFECYCLE: conn=579 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1444│CONN_LIFECYCLE: conn=580 role=brain wall_ms=1784292617015 mono_ms=202651 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1445│CONN_LIFECYCLE: conn=579 role=brain stream-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1446│CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1447│CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1448│CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1449│CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293222739}}
{"type":"message","id":"e3202c53","parentId":"09094925","timestamp":"2026-07-17T13:00:54.376Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying unnamed thread patterns**\n\n**Planning CPU sampling for thread discrimination**\n\n**Analyzing project index timing patterns**"},{"type":"thinking","thinking":"**Assessing CPU burst timing and sampling effects**\n\n**Planning endpoint identity data retrieval**"},{"type":"toolCall","id":"call_zTzcaGZZ079balRNruno1K6a|fc_034a6be5a6696b6c016a5a2785d5a08191b39ad712df90e6d5","name":"glob","arguments":{"i":"Listing endpoint state records","path":"C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/info.json","hidden":true,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_fIof7aXid31cputeKMBm8xQM|fc_034a6be5a6696b6c016a5a2785d5bc8191a99d01da3b9f577d","name":"glob","arguments":{"i":"Listing pulse deadlines","path":"C:/Users/decid/AppData/Local/spt-core/identity/deadline-*.json; C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/deadline-*.json","hidden":true,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_SpyxWeIX6a78nORvwv3IGaWC|fc_034a6be5a6696b6c016a5a2785d5cc819198ec4d32d09a842b","name":"grep","arguments":{"i":"Finding online live agents","pattern":"\"state\"\\s*:\\s*\"live_agent\"|\"status\"\\s*:\\s*\"online\"|\"session_id\"","path":"C:/Users/decid/AppData/Local/spt-core/identity/owlery","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_PaOVR1jAkpEOY0FfeEwILbgi|fc_034a6be5a6696b6c016a5a2785d5d881919bfec03c4ec1596e","name":"read","arguments":{"i":"Reading pulse scheduling path","path":"crates/spt-daemon/src/lifecycle.rs","selector":"680-790"}},{"type":"toolCall","id":"call_Vio30ZVmZvOhYM5DQjNvJdMu|fc_034a6be5a6696b6c016a5a2785d5e08191a79a12f811e0bda4","name":"read","arguments":{"i":"Reading pulse tick workload","path":"crates/spt-daemon/src/lifecycle.rs","selector":"790-920"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":16465,"output":1052,"cacheRead":113152,"cacheWrite":0,"totalTokens":130669,"reasoningTokens":743,"cost":{"input":0.08232500000000001,"output":0.03156,"cacheRead":0.056575999999999994,"cacheWrite":0,"total":0.170461}},"stopReason":"toolUse","timestamp":1784293222754,"responseId":"resp_034a6be5a6696b6c016a5a276727d881919723d8154797ec9e","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a276870bc8191ba08d8138c70f9db","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWid6Pi6uGsbzS8mXfbI3L6JYQ4na7rRTsoetEDHdH9m5EoXMs2Q4ng-VkVYynbFBHR1xLqFtsofFkxVOf7aTgLYraYPT58T9yod5MaPwwMsvV46m2_zA8Qyp22LY2hf9PwY3ureSz-flv0pmkXAthSBYClpCc95vUcGGImQ8ZL6gKEX6L1NvOcEmS0Nk4aNqiV2fnzGJi3W3HUrZO2VrX3qcXBnOhNjmSOyLYDXjt_XNNBsh1k7gycyQtOtq6bM4dTrSOXhMwqozi6hKTwEidmVgs1Gccwwnvgk6WOZzxsiYNyViaRSxH2QYufyrQiEOLcXIiBhwy6XcZYEmrVlrb5od_Hu9P0pbO76brJeeWnhg5OGYkkSMOA_MDbWNf-inlhdQC8_UH8fMZO1RqvHcZFm0hfvYIFpRCrkYN1HJRSQVsbK1sgBdQWF0f2vCaWbFzIPbtJmoQul5q8Wh6wW2OklcHoVAGaSXvsaIPCcRnej1r1PINwopAK7WGhunTbITbkZmQuPzBGHabVr8-KiA1ekCA9zMv0rnP3TwG9yUqUn-DDPxsNQJufwEeDAj3UwiCcOArtURhc0neFDxQp70d7xoMYHaSoE9x1TC1r6OVMPILav4NRSLfTUcBl9WbsiPGjthb5yOGMcSx8ReWREpBSq2I_8J4lS4dWFe5RZXAQ5oAGn18MipxcZPMjzHiH-CXhWjkZUL5n3H9uCFYq6vpYnhZK75iI76evbXRy_37wQQBGc-MvdKgcgYULEo9te_ICzmxdU-vLxsL1A-M1zEB5-v47MxgpCQL__pKs_7LolpYqMxGbx6jZdu-Cd6cPqXFaDfwqQoNjtBjRptZ7lHhw8thFk4qd-1Bxx6gzTpXq2Gl5oYyHhLBsEj6uEFkPxas8q2_hpAVzQM4F91UVpSd39N2IRn_Ba1ZwUWMtx7WPDSM3VZX79rb-g1-VXWdIpPGIAxDxu_M8iAv3yitQb-6URf4uBTVziyWk-fGTRIw9s4UhHm--udDPknvwoB508TL6aAyg7Dppiw3bdoj_N1lyTLWfYfSfDwUoPDgx2dW8zlgKfvhRPwB4xau3hQs8t4p9mKuz6V0B_HIY3deBSx5QX660YxsAZNxyYK6TZpWVsWJvI2P0ZMDtxZ0w4DbhlBJgyZjilhlaFfGPQe-IxJ_9D7gweWBk3lEzMF_2t7bL5JRhphckdePL2MTXoxYsC3Oe4MaJ8xiyfSq4SuZq3pCFkvvA9xHNxi7ECXSmWbrlJJQKI62VzwfgBcoOr1rRGdET2ADA-8TLj3nZek_n3lM95cy-wf-yQHCVUiaoh0IxdTtXcTEBc1rhyrmCzBI104-7yLqCLfIyPqbnZEiNURt1ZXtK7fowigTvt_VTqFVAnel1YjHMbQSurSkHIMTh_eveD8JTh9y38cP_uuxx_Ap7SSHGQBWuKqGL61eGZr_8hp2iMXO-WCzb1SF1jitlt3xXFQj3P0WeYXqVpZ81DKQ_6uSGFXVK0hY0Hh0A2QiyblzQe0nhKMSPjG-Aj18ZXFjSjqjal4DURZF7mOKFPwVX84Bzf7siC6xqOH3Ci2vwvVOeuOCyVAzq-It5nafhyFX_KzPsHV6BOVSH13oCXPC6uBdeejt8AYlk85oCgKOkqEegoAsXWlthfaT-WKJ3eneWbsAjQHfLzTS4UQQFSgSn_amlfM5Af0X4wcWjQtrY98idTRdE59Nc4JR5emwo-7pP5iahQPdGAiShHi-RRmub-ndm2eFI2eO0VNE5DVsGtOActcxFAja94FfUDODOC40nDcyuQDlJcDTZ2eoxvGrCwcULJTOXIXAUcw2w0SMJrTpM_9gGQA7HgcC8DJfDNcxPdfZFFoUMO2CduFfREPI-IvHRf4ndXjvQhvuLcXhXV5nGW45MTRp6_REkYW3A2OMLQkMBnrHDK8JAwvk7ZlLrljPTygkLFKztkbXs7QZGGNgcb6n6z4EhH2d8R4b1Fm_tYwNbWY7ow6Pzsbi3raB-HfynhWJgAKpexjg0npvyuWop1WWe0COMHgKCmMkWq5q99igXOaY0hLy9Zk39qe6Y8iVl2BSXXJUtRRXYDeD-1Jr9HVexTx7ewLFo8wuzoQm1meK3FpulaHiM4TCo7WW3MzhHj0QIKroHhbAbi4OdlLWz_gS1qYB7G9TY_yelethKCeH8du381qdESx0BsWPQFZaRe1ATYCJ_HSEM1Y_R2BDijXbw7-6m5ULlbWxIvzhcUBmXfCtn9euz834O0R2sXdBvrDuPsI3XPMT27xjqkkTli24yDgaxoov-Hw4DhSUprBpftOOvl6i_wDFCZ7baPv-Z0jVP8ED7bgLvPn1bCu4GeYdB_HB9jmUFOmlQFU52XQEcWCMLwNjKNhoc0AhPvERexnYrIhoqWj77q9g8aYLnixlJEftVP53vQCjk8xQIkAC98Vp2GuDPNQor7DIYCOdaJWvvddPATnz-xWAD-Jd59iapWSfFF0lh9D-OI2_7jb2VdGgh5FrzXFBGY8Nk3sWTx0O4dqCSk8iL3pFpsw_LntldlquJVWIAgmWU30cDNBG2x3-QN5kvDCw6ABzxeuSJqNs90z5cMLSiSv9I98lYOnMl4kLrQGUxo8e4KOsEALSG2EL4zyck9gVB6eSRvKsC_R3eZqKXPXFkGxpMNZd68SaHuVLET9bZNsXGYYl2D4oWXV3gtU9b1Z9sig1xcLnhx4SGERsKm6JcvJ3mXEPRBt_fywmDcgFwgqhqs_-ehzmsmYf7Dsvp7BQzpIHySSCeRxVdBPi7ZlduommpkV4sBdy2bP21NvSmJefXTKgR9Gv-DFDrK0hoW38aMtdkMta3hQCH38CiCleZ3u2TSJqhFDboQ32PCqmQ68EdY3eTt0jZgLlkZGucmYtI1wmmy4gXa35zWuCR4Ae2qLbgq6zntK30PkqZQAH_lhp7GS83mgsnAGAYE2zbMvIvpo9I3jTdNjKXDe82p5Th39nVQ9LqRDOuqGdJrCUSiVAPtcnaQ477x3P99OoBW85WF0ShNUGYzIY7TaYaR5DY6iAzgzpXt0fWku-yoMeTCYxAOK1KGX2nblfIy9h6MgN1Ws7_HxR7SjYfpSg5cf9B3D_mJM8WwRsuPTWlnWAAc6AmhwKV1EDVEx33iqneOCMt9EQMYYSvqH24pKvMe_W-8Njq_LkWWwy3nlGaA9y8Tq-CgCrAgW80j7ZKdI2hxd7-b5OTPFAeKBph6JZecj_ghEKXnMfN2553A8Jq34esdbZNQDcrjcIDOzCkqkHh1nLQxW0rMq8gtLG5oun4B7Ca6ZB_XIKsEk5HCYmCsvyEzbLJU2ltm44Za7bNDPYGUJEAxZMocvgpDV73g0-tBPG46Vf5nvHAy7pIVBKwkW8FsSXg600w5WbgzQmIcdfn-UaWq4uCHnDnQG4fcLRnhBLqsPxhMY0HoSo-4dvzxvIdRZLwR-VqZzIqF4YPwNYUQlRtgPYTHT-1K4SZw2vFVbZMlCNVaK2RM6ybuzfBpk-_AvWAtA0n-YbgV5mj3pdk2hF6QfkNTvmiVlPRxqN9XHqAGXAsLKID3Dl0ADl99L7u5kKL-1m8EQYEnjTVDkQIQxJriNzLLxggULKAQgZF546ikGCxBVdvAFHxrSHYAfkNfP3ScJVhtrLeoa_duQalsDwlQmWrJBVGd6xsFSeY2540uAEmZuNFeOFB0m_zfeBkw5vZk12DnnGBOiEQrb7lsJIDleKfgK5KVe2jI9g5weApQlr4oG8ZVSNZ3mYkCUxBN2KbGBhvqOmHeAKe2baR-xS5wDI61VZWdhFJyhVnjfHzJREWK21kHdQrBMsWIqhHD8_H0ceQ3O6F9CRcGjXiflMVLAC9Lbf6dfY9psFbHPA5p2Qtajc3U3PsWVv0OBn23Qzvy5slcNT0ScPJDwyXQfid6usT2AqhbT3LCMfdS3qK1caihK1-FQjMMvsvqemz7Pva127rxAVrGHpvZN015oP1dufwWpMibUD9YjpXBvBCCjHIY-UOC-k4ds4LUoHcuOhmXLhtCrzsp4tkVU2QWwt8F0LaTZ1MEacwFmn_Lpmm2oZmF0iO3KW6QBM0_A6Mpl1OaR5Up4m0CejgitARAWZoIbrSsZm2tp4FN_JoGraOrU_LaT5J-lHU_tFcMAgOMAbchpxAr0SVg06fiOSuo8QyYiYli3NJq8Q7FC0d_AwEHaNSyGu4o=","summary":[{"type":"summary_text","text":"**Identifying unnamed thread patterns**"},{"type":"summary_text","text":"**Planning CPU sampling for thread discrimination**"},{"type":"summary_text","text":"**Analyzing project index timing patterns**"}]},{"id":"rs_034a6be5a6696b6c016a5a277a65c08191ad87f96886f2c5fd","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWieFrEFIDQywIR_OrF5FJs1aRlYoNu3wHO7Pj5EKv_s-uCYEmvL5t0cd3JCBJ93Vi7tLSg0SBLug_pbNq49J4c5vImoOFcILK1dYQ46rwynSly1lf6Mm3RmRire1zEHhmJ_G1CD-IEM9DJq8lc7JTpSql0VusIxjYUCatVPAJ6Q5BTK0dxStz7VP54iRUJg_z7sn89hiiwjnUNrjdblf7Y9sRXMnYRyXxxWs1kxgNOROd-QtDZNKfK_PJUly3Cfjg3jhe60_Pbqzj5Lfxuw7vUj0hAzGcq4SEYvT-r2RYcg9-0GBuJRUBGTv-wlsqNQxqdeSy7a1fb8aXfiUDPU8q68l87HV8Ai9EmWZDTbHMUfBBKMH9VmcpM4iMCHnsWGS_QGvYZLLNaSqqSl20aBbJ8sCfFALG_rs33QIxM8BeLOSBaol9GTeZ60gHY_AIFOeIP5A-5zz3JQgzwpu16an1Tl89s_p2BsDcQaoh4I2CBS2sufx-5W9XYXHkL7esZl_ZBUG9c0mTFLwBMalE_23lJolVY6dobuECZSRjDyeMmkS--O99ijVr_eniy4AKQAP4Gs92WcZ6qYTCxP2ll7ngTNQ8GRTiaOEaPjvzNGXD-nsSz09kazyDEBWuRdIts4_oGcCqTvLhVMuSU81qRWHyWiUAm5Aeh3OMtMsSFnih5K4PTVK-2Uy53z8j-FdeZcZEps-WERUjt3LB1x3dZnvR2VB_QW5X_0e5NPQegzZGl-2CW8KGu_NT67Vk2CzvEj1Vsie6ubn-eiVv0jqoOYBmfeyubFL1vdX4xiRIAQsr8F-FHx43Oy0AewfHT96nLhxx0uaK-hEhSq_Wwh0pWIEvYdyDaITIqxlcZqPMhF_UgWfhifYM0GkQZ1LZcQp2bS8uAQXxMvqsIDVfjlXIuwZQjz1e2ChBJLn7M-5Kqf9X-clPPSaREym3DZtKkLSHmy_-R5AaJAwdO5ndrK3BKPw0ln1i1O7zFWG8AlYfh3j-7wJ5YjQSrHeBTycWJYNYRjHdLk8Q3yhi59pT-wiKpl4u54UCKFYoLBEP0108i2ucjeeuDj-Swga0JLpr_XqlSJ8hnRjzUgsgUYnVBZVUcpPhownlT5DBe67x9aUUlNzvoGYmOQ2teQI4afHbOhblPTfjRFd9JzTa9LFEEsGDK3Hk-H1i0SB13jzhtSMNt7IaCTgQXoXy4eNE1bSkOH5WWR5vS9WNWnouBD2EKnLXoe7pBw8Enccw31V7cYFUL9B5rvo8mAtpFxCDUm11O1DUCWIgzEM7QHNBW_1cZyEpcnWv6JgzQuF2rcoUkjwSrkyWOimKTPYHu0RLzbAWYZVh8SSuhC-LrerUSLXZTPvnuZhIuMVA1-sXBpCFpwLu9HPv4K4nzvlAFO2Pvdd3EOZBK9JaE9Wc8x4TObHvSpelkCBmR7SECryfUesXzTOHgQn8tqaknSKoFfigQmLu6kfhvBie4vmHnxjwpD43yHUgAwcWStDWijApSOsGylnPPNRJwebC6HTemEohmzVOeuB4cV5Qo715Pqs7_02qFXWEnd58NgPDIYRl6l02H-5z0-5Nt_6kFmDNCWlcBdK1WJ6LlRDzsRljp2vArq_CdQVx_aMzhNihyJK-DOF8PUfgbsidczC8wPrXgurXcCY595uQSmeXGLr-GivfgwBD3RMawB7ewmn8lmsS_1zkPY5Vf5pPZGd2RvhZp96hClMPVxbdGzqw-M7nEQ2sKlnbgOO-x2eY6hxSXoJJEHPYX6JPR0jHnivYRi4BRV9mvMCZogJtTdhJjncz2YBJ3sSL9z-Qf-MzbZu4xse0iAbxnRiHPTFr6I73W0NekDYQv5Bun2w3zaM05jJs5NYCjhT8452nYgx7eikdbcxUnFPFxX6pk2bCsLMVu38BpWpemAgA6Qdb5mPccHVL4jkx0Y9axn_2PB1g_mq9Qf1Tr-g2ciLEcizhAhH098nGbOlOauFhhi-NNJ0IgixgVOAcliw105XCOkcl7aPd90x_kPVJ0Zgy-5HLDf1qN8riiIWBqu9D-ziH9IA4Sdov0GebgAPLYKYwWEvmsnB9eVbNcB-oQEWo8ClfqrP8SqmQKAqJdyPNcP4MbXWbCoBuGK13lQQiXyzhrbDkEOD9Z7g5x1-pesWSS2Dwxn8Cn4KYw93pynfOwbX0Vb2p5ueq1t2DEOhDn91gK9oBlNmsg==","summary":[{"type":"summary_text","text":"**Assessing CPU burst timing and sampling effects**"},{"type":"summary_text","text":"**Planning endpoint identity data retrieval**"}]},{"id":"fc_034a6be5a6696b6c016a5a2785d5a08191b39ad712df90e6d5","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing endpoint state records\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/info.json\",\"hidden\":true,\"gitignore\":false,\"limit\":100}","call_id":"call_zTzcaGZZ079balRNruno1K6a","name":"glob"},{"id":"fc_034a6be5a6696b6c016a5a2785d5bc8191a99d01da3b9f577d","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing pulse deadlines\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/deadline-*.json; C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/deadline-*.json\",\"hidden\":true,\"gitignore\":false,\"limit\":100}","call_id":"call_fIof7aXid31cputeKMBm8xQM","name":"glob"},{"id":"fc_034a6be5a6696b6c016a5a2785d5cc819198ec4d32d09a842b","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding online live agents\",\"pattern\":\"\\\"state\\\"\\\\s*:\\\\s*\\\"live_agent\\\"|\\\"status\\\"\\\\s*:\\\\s*\\\"online\\\"|\\\"session_id\\\"\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/owlery\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_SpyxWeIX6a78nORvwv3IGaWC","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a2785d5d881919bfec03c4ec1596e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pulse scheduling path\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":\"680-790\"}","call_id":"call_PaOVR1jAkpEOY0FfeEwILbgi","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a2785d5e08191a79a12f811e0bda4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pulse tick workload\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":\"790-920\"}","call_id":"call_Vio30ZVmZvOhYM5DQjNvJdMu","name":"read"}]},"duration":31620.873199999332,"ttft":1765.1275999993086,"contextSnapshot":{"promptTokens":129617,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zTzcaGZZ079balRNruno1K6a|fc_034a6be5a6696b6c016a5a2785d5a08191b39ad712df90e6d5","toolName":"glob","startedAt":"2026-07-17T13:00:54.376Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/info.json"},"intent":"Listing endpoint state records"},"id":"528c9c2d","parentId":"e3202c53","timestamp":"2026-07-17T13:00:54.376Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_fIof7aXid31cputeKMBm8xQM|fc_034a6be5a6696b6c016a5a2785d5bc8191a99d01da3b9f577d","toolName":"glob","startedAt":"2026-07-17T13:00:54.376Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/deadline-*.json; C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/deadline-*.json"},"intent":"Listing pulse deadlines"},"id":"ca3cd929","parentId":"528c9c2d","timestamp":"2026-07-17T13:00:54.376Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SpyxWeIX6a78nORvwv3IGaWC|fc_034a6be5a6696b6c016a5a2785d5cc819198ec4d32d09a842b","toolName":"grep","startedAt":"2026-07-17T13:00:54.376Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/owlery"},"intent":"Finding online live agents"},"id":"6c9c879d","parentId":"ca3cd929","timestamp":"2026-07-17T13:00:54.376Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PaOVR1jAkpEOY0FfeEwILbgi|fc_034a6be5a6696b6c016a5a2785d5d881919bfec03c4ec1596e","toolName":"read","startedAt":"2026-07-17T13:00:54.376Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Reading pulse scheduling path"},"id":"c37b21f7","parentId":"6c9c879d","timestamp":"2026-07-17T13:00:54.376Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Vio30ZVmZvOhYM5DQjNvJdMu|fc_034a6be5a6696b6c016a5a2785d5e08191a79a12f811e0bda4","toolName":"read","startedAt":"2026-07-17T13:00:54.377Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Reading pulse tick workload"},"id":"57cf61eb","parentId":"c37b21f7","timestamp":"2026-07-17T13:00:54.377Z"}
{"type":"message","id":"656680db","parentId":"57cf61eb","timestamp":"2026-07-17T13:00:54.377Z","message":{"role":"toolResult","toolCallId":"call_zTzcaGZZ079balRNruno1K6a|fc_034a6be5a6696b6c016a5a2785d5a08191b39ad712df90e6d5","toolName":"glob","content":[{"type":"text","text":"Path not found: C:/Users/decid/AppData/Local/spt-core/identity/owlery"}],"details":{},"isError":true,"timestamp":1784293254377}}
{"type":"message","id":"a0def800","parentId":"656680db","timestamp":"2026-07-17T13:00:54.378Z","message":{"role":"toolResult","toolCallId":"call_SpyxWeIX6a78nORvwv3IGaWC|fc_034a6be5a6696b6c016a5a2785d5cc819198ec4d32d09a842b","toolName":"grep","content":[{"type":"text","text":"Path not found: C:/Users/decid/AppData/Local/spt-core/identity/owlery"}],"details":{},"isError":true,"timestamp":1784293254378}}
{"type":"message","id":"8608b159","parentId":"a0def800","timestamp":"2026-07-17T13:00:54.379Z","message":{"role":"toolResult","toolCallId":"call_fIof7aXid31cputeKMBm8xQM|fc_034a6be5a6696b6c016a5a2785d5bc8191a99d01da3b9f577d","toolName":"glob","content":[{"type":"text","text":"No files found matching pattern\nSkipped missing paths: C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/deadline-*.json"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/identity","fileCount":0,"files":[],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","missingPaths":["C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/deadline-*.json"]},"isError":false,"useless":true,"timestamp":1784293254379}}
{"type":"message","id":"5e0d4f36","parentId":"8608b159","timestamp":"2026-07-17T13:00:54.402Z","message":{"role":"toolResult","toolCallId":"call_PaOVR1jAkpEOY0FfeEwILbgi|fc_034a6be5a6696b6c016a5a2785d5d881919bfec03c4ec1596e","toolName":"read","content":[{"type":"text","text":"\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\n    /// each tick (so a caller — or a test — observes cadence and can decide to\n    /// stop). The period comes from the durable config, never a constant.\n    ///\n    /// **Restoration D5-2 (ADR-0018 Q4/V4): the cadence is a disk-anchored\n    /// absolute-deadline grid, not a phase-relative flat sleep.** The old loop\n    /// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the\n    /// restart instant on every restart. Now the loop rehydrates a\n    /// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session\n    /// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent\n    /// drivers pass each agent's id — amd 6, no cross-clobber) and applies the\n    /// [`StartReason`] rule: an `Update` restart **preserves the grid phase**\n    /// (lands mid-grid), a `Crash`/`Cold` start re-bases it to now. The fire\n    /// deadline is derived functionally — **no per-fire write**.\n    ///\n    /// The loop still holds no work-state beyond the cursor on disk (a fresh loop\n    /// re-reads the drop dirs and gate), so it is freely killable + respawnable;\n    /// D5 makes its *phase* durable too.\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\n    // [impl->REQ-DAEMON-1]\n    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\n        &self,\n        session_id: Option<&str>,\n        stop: &AtomicBool,\n        reason: StartReason,\n        mut on_tick: F,\n    ) {\n        // Keyed anchor (amd 6): per-session file so per-agent pulse drivers never\n        // cross-clobber. `None` (the single daemon pulse) → the \"pulse\" key.\n        let key = session_id.unwrap_or(\"pulse\");\n        let interval_ms = self.cfg.pulse_period.as_millis() as u64;\n        // A disk error must not stop the pulse: degrade to an in-memory anchor at\n        // `now` (fresh-phase, unpersisted) so cadence continues regardless.\n        let anchor = DeadlineAnchor::open(key, interval_ms, reason, now_ms())\n            .unwrap_or(DeadlineAnchor {\n                anchor_ms: now_ms(),\n                interval_ms: interval_ms.max(1),\n            });\n        // The next fire at/after now. A fresh anchor (cold/crash) sits on-grid at\n        // `now` → fires immediately (the old loop's tick-first behavior); an\n        // update anchor lands on the next grid point (phase preserved).\n        let mut deadline = anchor.next_fire(now_ms());\n        // W3c reload-on-dirty: seed with the manifest hash at bringup so only a\n        // LATER on-disk change (a live update's CRC swap) triggers a refresh, not\n        // the initial state.\n        let mut manifest_hash = self.manifest_disk_hash();\n        // F-030 W1: consecutive per-event turn-failure count (C3(b) budget). Lives\n        // in the loop's local state — the loop is per-endpoint + single-threaded, so\n        // this is the simplest correct home (no lock, no cross-endpoint bleed).\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n        let mut turn_strikes: u32 = 0;\n        while !stop.load(Ordering::Relaxed) {\n            let now = now_ms();\n            if now < deadline {\n                // Sleep toward the deadline in small slices so a stop is honored\n                // promptly rather than after a full (possibly multi-second) wait.\n                sleep_interruptible(Duration::from_millis(deadline - now), stop);\n                continue;\n            }\n            // Pull any live-update manifest swap from disk before the tick so the\n            // tick (psyche turn / echo) runs against the fresh manifest. (W3c)\n            self.reload_manifest_if_changed(&mut manifest_hash);\n            match self.pulse_tick(session_id) {\n                Ok(report) => {\n                    // F-030 W1: feed a fired turn's outcome to the failure budget.\n                    if let Some(outcome) = &report.turn_outcome {\n                        self.note_turn_outcome(&mut turn_strikes, outcome);\n                    }\n                    on_tick(&report);\n                }\n                Err(_) => { /* a transient tick error must not kill the loop */ }\n            }\n            // Advance past the FIRED grid point AND past `now` (doyle amendment\n            // 7): strictly-after-fired keeps the double-fire guard (a same-ms tick\n            // steps exactly one grid); skip-past-now collapses a stall (an\n            // overrunning tick, or a suspend/resume that left `deadline` many\n            // grids behind) to ONE catch-up fire instead of a back-to-back storm.\n            deadline = anchor.advance_after_fire(deadline, now_ms());\n        }\n    }\n\n    /// Fetch history per the manifest `[history]` strategy (empty if none).\n    fn history(&self, session_id: Option<&str>) -> Vec<HistoryRecord> {\n        // W3c gate (i): snapshot the manifest (guard dropped before the bounded\n        // history fetch below), so a live-update refresh never waits on it.\n        let manifest = self.cell.manifest_snapshot();\n        let Some(h) = &manifest.history else {\n            return Vec::new();\n        };\n        fetch_history(\n            h,\n            &self.base_keys(session_id),\n            &self.id,\n            ParentHint::Infer,\n            LIVE_BOUNDED_TIMEOUT,\n        )\n        .unwrap_or_default()\n    }\n\n    /// Apply a resting-state event for this endpoint (D9-2, REQ-INST-3) — the\n    /// production transition host wiring [`crate::resting::apply_event`]'s two\n    /// effect seams to the real machinery:\n    ///\n    /// - **active → (dormant|suspended)**: the transition echo commune\n    ///   ([`fire_echo`](Self::fire_echo) → [`run_echo_commune`]) capturing the\n    ///   outgoing instance's final context delta, BEFORE the flip persists\n    ///   (KH 3.3) — it syncs to whichever instance activates next.\n    /// - **wake (→ active)**: re-activation in place catches up immediately —\n    ///   [`crate::notif::resurface_at_boundary`] at the Wake boundary (the D8\n    ///   deferral, real now that the edge exists) + the freshness-pull marker\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\n    ///   at the next anti-entropy cadence).\n    ///\n    /// Registry advertisement follows on the pump's next `advertise_local`\n\n[Showing lines 679-793 of 2921. Use :794 to continue]"}],"details":{"truncation":{"content":"\r\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\r\n    /// each tick (so a caller — or a test — observes cadence and can decide to\r\n    /// stop). The period comes from the durable config, never a constant.\r\n    ///\r\n    /// **Restoration D5-2 (ADR-0018 Q4/V4): the cadence is a disk-anchored\r\n    /// absolute-deadline grid, not a phase-relative flat sleep.** The old loop\r\n    /// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the\r\n    /// restart instant on every restart. Now the loop rehydrates a\r\n    /// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session\r\n    /// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent\r\n    /// drivers pass each agent's id — amd 6, no cross-clobber) and applies the\r\n    /// [`StartReason`] rule: an `Update` restart **preserves the grid phase**\r\n    /// (lands mid-grid), a `Crash`/`Cold` start re-bases it to now. The fire\r\n    /// deadline is derived functionally — **no per-fire write**.\r\n    ///\r\n    /// The loop still holds no work-state beyond the cursor on disk (a fresh loop\r\n    /// re-reads the drop dirs and gate), so it is freely killable + respawnable;\r\n    /// D5 makes its *phase* durable too.\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    // [impl->REQ-DAEMON-1]\r\n    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\r\n        &self,\r\n        session_id: Option<&str>,\r\n        stop: &AtomicBool,\r\n        reason: StartReason,\r\n        mut on_tick: F,\r\n    ) {\r\n        // Keyed anchor (amd 6): per-session file so per-agent pulse drivers never\r\n        // cross-clobber. `None` (the single daemon pulse) → the \"pulse\" key.\r\n        let key = session_id.unwrap_or(\"pulse\");\r\n        let interval_ms = self.cfg.pulse_period.as_millis() as u64;\r\n        // A disk error must not stop the pulse: degrade to an in-memory anchor at\r\n        // `now` (fresh-phase, unpersisted) so cadence continues regardless.\r\n        let anchor = DeadlineAnchor::open(key, interval_ms, reason, now_ms())\r\n            .unwrap_or(DeadlineAnchor {\r\n                anchor_ms: now_ms(),\r\n                interval_ms: interval_ms.max(1),\r\n            });\r\n        // The next fire at/after now. A fresh anchor (cold/crash) sits on-grid at\r\n        // `now` → fires immediately (the old loop's tick-first behavior); an\r\n        // update anchor lands on the next grid point (phase preserved).\r\n        let mut deadline = anchor.next_fire(now_ms());\r\n        // W3c reload-on-dirty: seed with the manifest hash at bringup so only a\r\n        // LATER on-disk change (a live update's CRC swap) triggers a refresh, not\r\n        // the initial state.\r\n        let mut manifest_hash = self.manifest_disk_hash();\r\n        // F-030 W1: consecutive per-event turn-failure count (C3(b) budget). Lives\r\n        // in the loop's local state — the loop is per-endpoint + single-threaded, so\r\n        // this is the simplest correct home (no lock, no cross-endpoint bleed).\r\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n        let mut turn_strikes: u32 = 0;\r\n        while !stop.load(Ordering::Relaxed) {\r\n            let now = now_ms();\r\n            if now < deadline {\r\n                // Sleep toward the deadline in small slices so a stop is honored\r\n                // promptly rather than after a full (possibly multi-second) wait.\r\n                sleep_interruptible(Duration::from_millis(deadline - now), stop);\r\n                continue;\r\n            }\r\n            // Pull any live-update manifest swap from disk before the tick so the\r\n            // tick (psyche turn / echo) runs against the fresh manifest. (W3c)\r\n            self.reload_manifest_if_changed(&mut manifest_hash);\r\n            match self.pulse_tick(session_id) {\r\n                Ok(report) => {\r\n                    // F-030 W1: feed a fired turn's outcome to the failure budget.\r\n                    if let Some(outcome) = &report.turn_outcome {\r\n                        self.note_turn_outcome(&mut turn_strikes, outcome);\r\n                    }\r\n                    on_tick(&report);\r\n                }\r\n                Err(_) => { /* a transient tick error must not kill the loop */ }\r\n            }\r\n            // Advance past the FIRED grid point AND past `now` (doyle amendment\r\n            // 7): strictly-after-fired keeps the double-fire guard (a same-ms tick\r\n            // steps exactly one grid); skip-past-now collapses a stall (an\r\n            // overrunning tick, or a suspend/resume that left `deadline` many\r\n            // grids behind) to ONE catch-up fire instead of a back-to-back storm.\r\n            deadline = anchor.advance_after_fire(deadline, now_ms());\r\n        }\r\n    }\r\n\r\n    /// Fetch history per the manifest `[history]` strategy (empty if none).\r\n    fn history(&self, session_id: Option<&str>) -> Vec<HistoryRecord> {\r\n        // W3c gate (i): snapshot the manifest (guard dropped before the bounded\r\n        // history fetch below), so a live-update refresh never waits on it.\r\n        let manifest = self.cell.manifest_snapshot();\r\n        let Some(h) = &manifest.history else {\r\n            return Vec::new();\r\n        };\r\n        fetch_history(\r\n            h,\r\n            &self.base_keys(session_id),\r\n            &self.id,\r\n            ParentHint::Infer,\r\n            LIVE_BOUNDED_TIMEOUT,\r\n        )\r\n        .unwrap_or_default()\r\n    }\r\n\r\n    /// Apply a resting-state event for this endpoint (D9-2, REQ-INST-3) — the\r\n    /// production transition host wiring [`crate::resting::apply_event`]'s two\r\n    /// effect seams to the real machinery:\r\n    ///\r\n    /// - **active → (dormant|suspended)**: the transition echo commune\r\n    ///   ([`fire_echo`](Self::fire_echo) → [`run_echo_commune`]) capturing the\r\n    ///   outgoing instance's final context delta, BEFORE the flip persists\r\n    ///   (KH 3.3) — it syncs to whichever instance activates next.\r\n    /// - **wake (→ active)**: re-activation in place catches up immediately —\r\n    ///   [`crate::notif::resurface_at_boundary`] at the Wake boundary (the D8\r\n    ///   deferral, real now that the edge exists) + the freshness-pull marker\r\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\r\n    ///   at the next anti-entropy cadence).\r\n    ///\r\n    /// Registry advertisement follows on the pump's next `advertise_local`\r","truncated":true,"truncatedBy":"lines","totalLines":2243,"totalBytes":6381,"outputLines":115,"outputBytes":6381,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"\r\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\r\n    /// each tick (so a caller — or a test — observes cadence and can decide to\r\n    /// stop). The period comes from the durable config, never a constant.\r\n    ///\r\n    /// **Restoration D5-2 (ADR-0018 Q4/V4): the cadence is a disk-anchored\r\n    /// absolute-deadline grid, not a phase-relative flat sleep.** The old loop\r\n    /// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the\r\n    /// restart instant on every restart. Now the loop rehydrates a\r\n    /// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session\r\n    /// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent\r\n    /// drivers pass each agent's id — amd 6, no cross-clobber) and applies the\r\n    /// [`StartReason`] rule: an `Update` restart **preserves the grid phase**\r\n    /// (lands mid-grid), a `Crash`/`Cold` start re-bases it to now. The fire\r\n    /// deadline is derived functionally — **no per-fire write**.\r\n    ///\r\n    /// The loop still holds no work-state beyond the cursor on disk (a fresh loop\r\n    /// re-reads the drop dirs and gate), so it is freely killable + respawnable;\r\n    /// D5 makes its *phase* durable too.\r\n    // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]\r\n    // [impl->REQ-DAEMON-1]\r\n    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\r\n        &self,\r\n        session_id: Option<&str>,\r\n        stop: &AtomicBool,\r\n        reason: StartReason,\r\n        mut on_tick: F,\r\n    ) {\r\n        // Keyed anchor (amd 6): per-session file so per-agent pulse drivers never\r\n        // cross-clobber. `None` (the single daemon pulse) → the \"pulse\" key.\r\n        let key = session_id.unwrap_or(\"pulse\");\r\n        let interval_ms = self.cfg.pulse_period.as_millis() as u64;\r\n        // A disk error must not stop the pulse: degrade to an in-memory anchor at\r\n        // `now` (fresh-phase, unpersisted) so cadence continues regardless.\r\n        let anchor = DeadlineAnchor::open(key, interval_ms, reason, now_ms())\r\n            .unwrap_or(DeadlineAnchor {\r\n                anchor_ms: now_ms(),\r\n                interval_ms: interval_ms.max(1),\r\n            });\r\n        // The next fire at/after now. A fresh anchor (cold/crash) sits on-grid at\r\n        // `now` → fires immediately (the old loop's tick-first behavior); an\r\n        // update anchor lands on the next grid point (phase preserved).\r\n        let mut deadline = anchor.next_fire(now_ms());\r\n        // W3c reload-on-dirty: seed with the manifest hash at bringup so only a\r\n        // LATER on-disk change (a live update's CRC swap) triggers a refresh, not\r\n        // the initial state.\r\n        let mut manifest_hash = self.manifest_disk_hash();\r\n        // F-030 W1: consecutive per-event turn-failure count (C3(b) budget). Lives\r\n        // in the loop's local state — the loop is per-endpoint + single-threaded, so\r\n        // this is the simplest correct home (no lock, no cross-endpoint bleed).\r\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n        let mut turn_strikes: u32 = 0;\r\n        while !stop.load(Ordering::Relaxed) {\r\n            let now = now_ms();\r\n            if now < deadline {\r\n                // Sleep toward the deadline in small slices so a stop is honored\r\n                // promptly rather than after a full (possibly multi-second) wait.\r\n                sleep_interruptible(Duration::from_millis(deadline - now), stop);\r\n                continue;\r\n            }\r\n            // Pull any live-update manifest swap from disk before the tick so the\r\n            // tick (psyche turn / echo) runs against the fresh manifest. (W3c)\r\n            self.reload_manifest_if_changed(&mut manifest_hash);\r\n            match self.pulse_tick(session_id) {\r\n                Ok(report) => {\r\n                    // F-030 W1: feed a fired turn's outcome to the failure budget.\r\n                    if let Some(outcome) = &report.turn_outcome {\r\n                        self.note_turn_outcome(&mut turn_strikes, outcome);\r\n                    }\r\n                    on_tick(&report);\r\n                }\r\n                Err(_) => { /* a transient tick error must not kill the loop */ }\r\n            }\r\n            // Advance past the FIRED grid point AND past `now` (doyle amendment\r\n            // 7): strictly-after-fired keeps the double-fire guard (a same-ms tick\r\n            // steps exactly one grid); skip-past-now collapses a stall (an\r\n            // overrunning tick, or a suspend/resume that left `deadline` many\r\n            // grids behind) to ONE catch-up fire instead of a back-to-back storm.\r\n            deadline = anchor.advance_after_fire(deadline, now_ms());\r\n        }\r\n    }\r\n\r\n    /// Fetch history per the manifest `[history]` strategy (empty if none).\r\n    fn history(&self, session_id: Option<&str>) -> Vec<HistoryRecord> {\r\n        // W3c gate (i): snapshot the manifest (guard dropped before the bounded\r\n        // history fetch below), so a live-update refresh never waits on it.\r\n        let manifest = self.cell.manifest_snapshot();\r\n        let Some(h) = &manifest.history else {\r\n            return Vec::new();\r\n        };\r\n        fetch_history(\r\n            h,\r\n            &self.base_keys(session_id),\r\n            &self.id,\r\n            ParentHint::Infer,\r\n            LIVE_BOUNDED_TIMEOUT,\r\n        )\r\n        .unwrap_or_default()\r\n    }\r\n\r\n    /// Apply a resting-state event for this endpoint (D9-2, REQ-INST-3) — the\r\n    /// production transition host wiring [`crate::resting::apply_event`]'s two\r\n    /// effect seams to the real machinery:\r\n    ///\r\n    /// - **active → (dormant|suspended)**: the transition echo commune\r\n    ///   ([`fire_echo`](Self::fire_echo) → [`run_echo_commune`]) capturing the\r\n    ///   outgoing instance's final context delta, BEFORE the flip persists\r\n    ///   (KH 3.3) — it syncs to whichever instance activates next.\r\n    /// - **wake (→ active)**: re-activation in place catches up immediately —\r\n    ///   [`crate::notif::resurface_at_boundary`] at the Wake boundary (the D8\r\n    ///   deferral, real now that the edge exists) + the freshness-pull marker\r\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\r\n    ///   at the next anti-entropy cadence).\r\n    ///\r\n    /// Registry advertisement follows on the pump's next `advertise_local`\r","startLine":679,"lineNumbers":[679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2921,"totalBytes":6381,"outputLines":115,"outputBytes":6381,"shownRange":{"start":679,"end":793},"nextOffset":794}}},"isError":false,"timestamp":1784293254402}}
{"type":"message","id":"5e017739","parentId":"5e0d4f36","timestamp":"2026-07-17T13:00:54.422Z","message":{"role":"toolResult","toolCallId":"call_Vio30ZVmZvOhYM5DQjNvJdMu|fc_034a6be5a6696b6c016a5a2785d5e08191a79a12f811e0bda4","toolName":"read","content":[{"type":"text","text":"    ///   deferral, real now that the edge exists) + the freshness-pull marker\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\n    ///   at the next anti-entropy cadence).\n    ///\n    /// Registry advertisement follows on the pump's next `advertise_local`\n    /// scan — the persisted record is what it reads, epoch-bumped per row.\n    // [impl->REQ-INST-3]\n    // [impl->REQ-INST-4]\n    pub fn rest_event(\n        &self,\n        session_id: Option<&str>,\n        event: crate::resting::RestEvent,\n    ) -> Result<Option<crate::resting::EdgeReport>, String> {\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        let report = crate::resting::apply_event(\n            &perch_path,\n            event,\n            self.cfg.auto_suspend_after_ms,\n            now_ms(),\n            || self.fire_echo(session_id),\n            || self.fire_wake_effects(),\n        )?;\n        // The shell leg of the edge (M5-D4a): suspend closes online shells,\n        // wake relaunches persistent ones — same cascade as the daemon-side\n        // host, so the two transition hosts can never drift.\n        // [impl->REQ-SHELL-2]\n        if let Some(r) = report {\n            crate::resting::cascade_shells_on_edge(&self.id, &r);\n            // A real rest edge changes the advertised state — wake the\n            // pump's registry leg (M8 decision 15, REQ-CONV-2; the same\n            // drop as the daemon-side host, so the two hosts never drift).\n            // [impl->REQ-CONV-2]\n            crate::registryhost::request_advertise_now();\n        }\n        Ok(report)\n    }\n\n    /// The wake-edge effects — the shared daemon glue\n    /// ([`crate::resting::fire_wake_effects`]): resurface at the Wake\n    /// boundary + the freshness-pull marker for the peer pump.\n    // [impl->REQ-INST-3]\n    fn fire_wake_effects(&self) {\n        crate::resting::fire_wake_effects(&self.id);\n    }\n\n    /// Run the echo-commune into the commune dir (T3). No-op (Ok) without a dir.\n    ///\n    /// LIFECYCLE-TRUTH W1 skips (both Ok — a skip is a named configuration fact,\n    /// never a strike):\n    /// - **no `[session.echo_commune]` role** — the role is OPTIONAL per the\n    ///   published contract; skip with a once-per-endpoint note\n    ///   (REQ-PSYCHE-ROLE-OPTIONAL-SKIP — pre-fix this hard-failed every fire and\n    ///   3-strike-stamped a healthy host).\n    /// - **relative `commune_dir` with no recorded endpoint cwd** — skip LOUD, never\n    ///   a raw relative write (REQ-ECHO-DROP-DIR-RESOLVE — pre-fix the raw manifest\n    ///   dir went straight to `run_echo_commune`, which under the WMI-launched\n    ///   daemon's System32 cwd = deterministic os error 5).\n    ///\n    /// The dir routes through [`resolve_endpoint_drop_dir`] — the SAME resolver the\n    /// ingest leg and `psyche_drop_file` already use — and the summarizer spawn gets\n    /// the endpoint's cwd as its default working dir (a role-declared cwd wins).\n    // [impl->REQ-ECHO-DROP-DIR-RESOLVE]\n    fn fire_echo(&self, session_id: Option<&str>) -> Result<(), String> {\n        let Some(raw) = &self.commune_dir else {\n            return Ok(());\n        };\n        // [impl->REQ-PSYCHE-ROLE-OPTIONAL-SKIP]\n        if self.cell.manifest_snapshot().session.echo_commune.is_none() {\n            note_echo_role_absent_once(&self.id);\n            return Ok(());\n        }\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\n        let Some(dir) = resolve_endpoint_drop_dir(raw, endpoint_cwd.as_deref().map(Path::new))\n        else {\n            warn_echo_no_cwd_once(&self.id, raw);\n            return Ok(());\n        };\n        let history = self.history(session_id);\n        // W3c gate (i): snapshot the runtime (guard dropped) before the bounded\n        // echo-commune spawn. The endpoint cwd rides as the spawn's DEFAULT working\n        // dir so the summarizer child runs where the endpoint lives, never in the\n        // daemon's own process cwd (REQ-ECHO-DROP-DIR-RESOLVE rider).\n        let runtime = self\n            .cell\n            .runtime_snapshot()\n            .with_spawn_cwd(endpoint_cwd.map(PathBuf::from));\n        run_echo_commune(\n            &runtime,\n            &self.id,\n            &self.base_keys(session_id),\n            &history,\n            &dir,\n            LIVE_BOUNDED_TIMEOUT,\n        )\n        .map_err(|e| e.to_string())?;\n        // Every successful psyche operation clears a stale fault stamp — this\n        // covers the checkpoint/rest-edge transition echo, the signoff echo, and\n        // the pulse commune-sync (the event-turn leg clears via\n        // `note_turn_outcome`'s Ok arm). A SKIP above deliberately does NOT clear:\n        // nothing ran, so nothing was proven healthy.\n        // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\n        self.clear_psyche_fault_stamp();\n        Ok(())\n    }\n\n    /// Clear the perch's `psyche_host_error` fault stamp — called on EVERY\n    /// successful psyche operation (event turn, transition/checkpoint echo,\n    /// signoff echo), so a stale FAILED stamp can never sit over a healthy psyche\n    /// (REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS — pre-fix only the pulse-loop\n    /// `note_turn_outcome` Ok leg cleared it). Best-effort store write.\n    // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\n    fn clear_psyche_fault_stamp(&self) {\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        let _ = spt_store::info::set_psyche_host_error(&perch_path, None);\n    }\n\n    /// The per-event turn's bounded timeout (pulse-period-derived, 30s floor).\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n    fn event_turn_timeout(&self) -> Duration {\n        event_turn_timeout_for(self.pulse_period())\n    }\n\n    /// The agent's OWN subnet — the parent endpoint's `home_subnet` (info.json),\n    /// `local` when unhomed. The ONLY subnet a psyche `notify` may land in\n    /// (ADR-0012's \"own user/subnet\" constraint), resolved DAEMON-SIDE so the child\n    /// never self-resolves it (F-030 W1 — the direction-(a) churn root). Mirrors the\n    /// `spt` identity-banner resolver (rc.rs `resolve_identity_line`).\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n    fn own_subnet(&self) -> String {\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        spt_store::info::read_info(&perch_path)\n            .and_then(|i| i.home_subnet)\n            .filter(|s| !s.is_empty())\n            .unwrap_or_else(|| \"local\".to_string())\n    }\n\n[Showing lines 789-923 of 2921. Use :924 to continue]"}],"details":{"truncation":{"content":"    ///   deferral, real now that the edge exists) + the freshness-pull marker\r\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\r\n    ///   at the next anti-entropy cadence).\r\n    ///\r\n    /// Registry advertisement follows on the pump's next `advertise_local`\r\n    /// scan — the persisted record is what it reads, epoch-bumped per row.\r\n    // [impl->REQ-INST-3]\r\n    // [impl->REQ-INST-4]\r\n    pub fn rest_event(\r\n        &self,\r\n        session_id: Option<&str>,\r\n        event: crate::resting::RestEvent,\r\n    ) -> Result<Option<crate::resting::EdgeReport>, String> {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let report = crate::resting::apply_event(\r\n            &perch_path,\r\n            event,\r\n            self.cfg.auto_suspend_after_ms,\r\n            now_ms(),\r\n            || self.fire_echo(session_id),\r\n            || self.fire_wake_effects(),\r\n        )?;\r\n        // The shell leg of the edge (M5-D4a): suspend closes online shells,\r\n        // wake relaunches persistent ones — same cascade as the daemon-side\r\n        // host, so the two transition hosts can never drift.\r\n        // [impl->REQ-SHELL-2]\r\n        if let Some(r) = report {\r\n            crate::resting::cascade_shells_on_edge(&self.id, &r);\r\n            // A real rest edge changes the advertised state — wake the\r\n            // pump's registry leg (M8 decision 15, REQ-CONV-2; the same\r\n            // drop as the daemon-side host, so the two hosts never drift).\r\n            // [impl->REQ-CONV-2]\r\n            crate::registryhost::request_advertise_now();\r\n        }\r\n        Ok(report)\r\n    }\r\n\r\n    /// The wake-edge effects — the shared daemon glue\r\n    /// ([`crate::resting::fire_wake_effects`]): resurface at the Wake\r\n    /// boundary + the freshness-pull marker for the peer pump.\r\n    // [impl->REQ-INST-3]\r\n    fn fire_wake_effects(&self) {\r\n        crate::resting::fire_wake_effects(&self.id);\r\n    }\r\n\r\n    /// Run the echo-commune into the commune dir (T3). No-op (Ok) without a dir.\r\n    ///\r\n    /// LIFECYCLE-TRUTH W1 skips (both Ok — a skip is a named configuration fact,\r\n    /// never a strike):\r\n    /// - **no `[session.echo_commune]` role** — the role is OPTIONAL per the\r\n    ///   published contract; skip with a once-per-endpoint note\r\n    ///   (REQ-PSYCHE-ROLE-OPTIONAL-SKIP — pre-fix this hard-failed every fire and\r\n    ///   3-strike-stamped a healthy host).\r\n    /// - **relative `commune_dir` with no recorded endpoint cwd** — skip LOUD, never\r\n    ///   a raw relative write (REQ-ECHO-DROP-DIR-RESOLVE — pre-fix the raw manifest\r\n    ///   dir went straight to `run_echo_commune`, which under the WMI-launched\r\n    ///   daemon's System32 cwd = deterministic os error 5).\r\n    ///\r\n    /// The dir routes through [`resolve_endpoint_drop_dir`] — the SAME resolver the\r\n    /// ingest leg and `psyche_drop_file` already use — and the summarizer spawn gets\r\n    /// the endpoint's cwd as its default working dir (a role-declared cwd wins).\r\n    // [impl->REQ-ECHO-DROP-DIR-RESOLVE]\r\n    fn fire_echo(&self, session_id: Option<&str>) -> Result<(), String> {\r\n        let Some(raw) = &self.commune_dir else {\r\n            return Ok(());\r\n        };\r\n        // [impl->REQ-PSYCHE-ROLE-OPTIONAL-SKIP]\r\n        if self.cell.manifest_snapshot().session.echo_commune.is_none() {\r\n            note_echo_role_absent_once(&self.id);\r\n            return Ok(());\r\n        }\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\r\n        let Some(dir) = resolve_endpoint_drop_dir(raw, endpoint_cwd.as_deref().map(Path::new))\r\n        else {\r\n            warn_echo_no_cwd_once(&self.id, raw);\r\n            return Ok(());\r\n        };\r\n        let history = self.history(session_id);\r\n        // W3c gate (i): snapshot the runtime (guard dropped) before the bounded\r\n        // echo-commune spawn. The endpoint cwd rides as the spawn's DEFAULT working\r\n        // dir so the summarizer child runs where the endpoint lives, never in the\r\n        // daemon's own process cwd (REQ-ECHO-DROP-DIR-RESOLVE rider).\r\n        let runtime = self\r\n            .cell\r\n            .runtime_snapshot()\r\n            .with_spawn_cwd(endpoint_cwd.map(PathBuf::from));\r\n        run_echo_commune(\r\n            &runtime,\r\n            &self.id,\r\n            &self.base_keys(session_id),\r\n            &history,\r\n            &dir,\r\n            LIVE_BOUNDED_TIMEOUT,\r\n        )\r\n        .map_err(|e| e.to_string())?;\r\n        // Every successful psyche operation clears a stale fault stamp — this\r\n        // covers the checkpoint/rest-edge transition echo, the signoff echo, and\r\n        // the pulse commune-sync (the event-turn leg clears via\r\n        // `note_turn_outcome`'s Ok arm). A SKIP above deliberately does NOT clear:\r\n        // nothing ran, so nothing was proven healthy.\r\n        // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\r\n        self.clear_psyche_fault_stamp();\r\n        Ok(())\r\n    }\r\n\r\n    /// Clear the perch's `psyche_host_error` fault stamp — called on EVERY\r\n    /// successful psyche operation (event turn, transition/checkpoint echo,\r\n    /// signoff echo), so a stale FAILED stamp can never sit over a healthy psyche\r\n    /// (REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS — pre-fix only the pulse-loop\r\n    /// `note_turn_outcome` Ok leg cleared it). Best-effort store write.\r\n    // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\r\n    fn clear_psyche_fault_stamp(&self) {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let _ = spt_store::info::set_psyche_host_error(&perch_path, None);\r\n    }\r\n\r\n    /// The per-event turn's bounded timeout (pulse-period-derived, 30s floor).\r\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n    fn event_turn_timeout(&self) -> Duration {\r\n        event_turn_timeout_for(self.pulse_period())\r\n    }\r\n\r\n    /// The agent's OWN subnet — the parent endpoint's `home_subnet` (info.json),\r\n    /// `local` when unhomed. The ONLY subnet a psyche `notify` may land in\r\n    /// (ADR-0012's \"own user/subnet\" constraint), resolved DAEMON-SIDE so the child\r\n    /// never self-resolves it (F-030 W1 — the direction-(a) churn root). Mirrors the\r\n    /// `spt` identity-banner resolver (rc.rs `resolve_identity_line`).\r\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n    fn own_subnet(&self) -> String {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        spt_store::info::read_info(&perch_path)\r\n            .and_then(|i| i.home_subnet)\r\n            .filter(|s| !s.is_empty())\r\n            .unwrap_or_else(|| \"local\".to_string())\r","truncated":true,"truncatedBy":"lines","totalLines":2133,"totalBytes":6749,"outputLines":135,"outputBytes":6749,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    ///   deferral, real now that the edge exists) + the freshness-pull marker\r\n    ///   the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not\r\n    ///   at the next anti-entropy cadence).\r\n    ///\r\n    /// Registry advertisement follows on the pump's next `advertise_local`\r\n    /// scan — the persisted record is what it reads, epoch-bumped per row.\r\n    // [impl->REQ-INST-3]\r\n    // [impl->REQ-INST-4]\r\n    pub fn rest_event(\r\n        &self,\r\n        session_id: Option<&str>,\r\n        event: crate::resting::RestEvent,\r\n    ) -> Result<Option<crate::resting::EdgeReport>, String> {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let report = crate::resting::apply_event(\r\n            &perch_path,\r\n            event,\r\n            self.cfg.auto_suspend_after_ms,\r\n            now_ms(),\r\n            || self.fire_echo(session_id),\r\n            || self.fire_wake_effects(),\r\n        )?;\r\n        // The shell leg of the edge (M5-D4a): suspend closes online shells,\r\n        // wake relaunches persistent ones — same cascade as the daemon-side\r\n        // host, so the two transition hosts can never drift.\r\n        // [impl->REQ-SHELL-2]\r\n        if let Some(r) = report {\r\n            crate::resting::cascade_shells_on_edge(&self.id, &r);\r\n            // A real rest edge changes the advertised state — wake the\r\n            // pump's registry leg (M8 decision 15, REQ-CONV-2; the same\r\n            // drop as the daemon-side host, so the two hosts never drift).\r\n            // [impl->REQ-CONV-2]\r\n            crate::registryhost::request_advertise_now();\r\n        }\r\n        Ok(report)\r\n    }\r\n\r\n    /// The wake-edge effects — the shared daemon glue\r\n    /// ([`crate::resting::fire_wake_effects`]): resurface at the Wake\r\n    /// boundary + the freshness-pull marker for the peer pump.\r\n    // [impl->REQ-INST-3]\r\n    fn fire_wake_effects(&self) {\r\n        crate::resting::fire_wake_effects(&self.id);\r\n    }\r\n\r\n    /// Run the echo-commune into the commune dir (T3). No-op (Ok) without a dir.\r\n    ///\r\n    /// LIFECYCLE-TRUTH W1 skips (both Ok — a skip is a named configuration fact,\r\n    /// never a strike):\r\n    /// - **no `[session.echo_commune]` role** — the role is OPTIONAL per the\r\n    ///   published contract; skip with a once-per-endpoint note\r\n    ///   (REQ-PSYCHE-ROLE-OPTIONAL-SKIP — pre-fix this hard-failed every fire and\r\n    ///   3-strike-stamped a healthy host).\r\n    /// - **relative `commune_dir` with no recorded endpoint cwd** — skip LOUD, never\r\n    ///   a raw relative write (REQ-ECHO-DROP-DIR-RESOLVE — pre-fix the raw manifest\r\n    ///   dir went straight to `run_echo_commune`, which under the WMI-launched\r\n    ///   daemon's System32 cwd = deterministic os error 5).\r\n    ///\r\n    /// The dir routes through [`resolve_endpoint_drop_dir`] — the SAME resolver the\r\n    /// ingest leg and `psyche_drop_file` already use — and the summarizer spawn gets\r\n    /// the endpoint's cwd as its default working dir (a role-declared cwd wins).\r\n    // [impl->REQ-ECHO-DROP-DIR-RESOLVE]\r\n    fn fire_echo(&self, session_id: Option<&str>) -> Result<(), String> {\r\n        let Some(raw) = &self.commune_dir else {\r\n            return Ok(());\r\n        };\r\n        // [impl->REQ-PSYCHE-ROLE-OPTIONAL-SKIP]\r\n        if self.cell.manifest_snapshot().session.echo_commune.is_none() {\r\n            note_echo_role_absent_once(&self.id);\r\n            return Ok(());\r\n        }\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\r\n        let Some(dir) = resolve_endpoint_drop_dir(raw, endpoint_cwd.as_deref().map(Path::new))\r\n        else {\r\n            warn_echo_no_cwd_once(&self.id, raw);\r\n            return Ok(());\r\n        };\r\n        let history = self.history(session_id);\r\n        // W3c gate (i): snapshot the runtime (guard dropped) before the bounded\r\n        // echo-commune spawn. The endpoint cwd rides as the spawn's DEFAULT working\r\n        // dir so the summarizer child runs where the endpoint lives, never in the\r\n        // daemon's own process cwd (REQ-ECHO-DROP-DIR-RESOLVE rider).\r\n        let runtime = self\r\n            .cell\r\n            .runtime_snapshot()\r\n            .with_spawn_cwd(endpoint_cwd.map(PathBuf::from));\r\n        run_echo_commune(\r\n            &runtime,\r\n            &self.id,\r\n            &self.base_keys(session_id),\r\n            &history,\r\n            &dir,\r\n            LIVE_BOUNDED_TIMEOUT,\r\n        )\r\n        .map_err(|e| e.to_string())?;\r\n        // Every successful psyche operation clears a stale fault stamp — this\r\n        // covers the checkpoint/rest-edge transition echo, the signoff echo, and\r\n        // the pulse commune-sync (the event-turn leg clears via\r\n        // `note_turn_outcome`'s Ok arm). A SKIP above deliberately does NOT clear:\r\n        // nothing ran, so nothing was proven healthy.\r\n        // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\r\n        self.clear_psyche_fault_stamp();\r\n        Ok(())\r\n    }\r\n\r\n    /// Clear the perch's `psyche_host_error` fault stamp — called on EVERY\r\n    /// successful psyche operation (event turn, transition/checkpoint echo,\r\n    /// signoff echo), so a stale FAILED stamp can never sit over a healthy psyche\r\n    /// (REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS — pre-fix only the pulse-loop\r\n    /// `note_turn_outcome` Ok leg cleared it). Best-effort store write.\r\n    // [impl->REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS]\r\n    fn clear_psyche_fault_stamp(&self) {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let _ = spt_store::info::set_psyche_host_error(&perch_path, None);\r\n    }\r\n\r\n    /// The per-event turn's bounded timeout (pulse-period-derived, 30s floor).\r\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n    fn event_turn_timeout(&self) -> Duration {\r\n        event_turn_timeout_for(self.pulse_period())\r\n    }\r\n\r\n    /// The agent's OWN subnet — the parent endpoint's `home_subnet` (info.json),\r\n    /// `local` when unhomed. The ONLY subnet a psyche `notify` may land in\r\n    /// (ADR-0012's \"own user/subnet\" constraint), resolved DAEMON-SIDE so the child\r\n    /// never self-resolves it (F-030 W1 — the direction-(a) churn root). Mirrors the\r\n    /// `spt` identity-banner resolver (rc.rs `resolve_identity_line`).\r\n    // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n    fn own_subnet(&self) -> String {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        spt_store::info::read_info(&perch_path)\r\n            .and_then(|i| i.home_subnet)\r\n            .filter(|s| !s.is_empty())\r\n            .unwrap_or_else(|| \"local\".to_string())\r\n    }","startLine":789,"lineNumbers":[789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2921,"totalBytes":6749,"outputLines":135,"outputBytes":6749,"shownRange":{"start":789,"end":923},"nextOffset":924}}},"isError":false,"timestamp":1784293254422}}
{"type":"message","id":"cec11d0b","parentId":"5e017739","timestamp":"2026-07-17T13:01:07.019Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Confirming owlery home path**"},{"type":"toolCall","id":"call_0miDSJBnJH003kgvO4dyQudy|fc_034a6be5a6696b6c016a5a279003448191882b41ddb57d4230","name":"glob","arguments":{"i":"Listing live endpoint states","path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/info.json","hidden":true,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_zMxYwKuGAXopViZnVJqfjc7E|fc_034a6be5a6696b6c016a5a279005188191a9060b7bc8e8fbc3","name":"grep","arguments":{"i":"Finding online state fields","pattern":"\"state\"\\s*:\\s*\"live_agent\"|\"status\"\\s*:\\s*\"online\"|\"session_id\"","path":"C:/Users/decid/AppData/Local/spt-core/owlery","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_l2hwfRoJnZvM5JgxT567cH2e|fc_034a6be5a6696b6c016a5a279005f8819197fbdc1cefb2bf35","name":"glob","arguments":{"i":"Listing deadline anchors","path":"C:/Users/decid/AppData/Local/spt-core/deadline-*.json","hidden":true,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_RkwrflEDM8uZvAog0FhJenBi|fc_034a6be5a6696b6c016a5a279006088191aec2191244458c63","name":"grep","arguments":{"i":"Locating pulse tick function","pattern":"pub fn pulse_tick|fn pulse_tick|TickReport","path":"crates/spt-daemon/src/lifecycle.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":7557,"output":311,"cacheRead":126464,"cacheWrite":0,"totalTokens":134332,"reasoningTokens":40,"cost":{"input":0.037785000000000006,"output":0.00933,"cacheRead":0.063232,"cacheWrite":0,"total":0.110347}},"stopReason":"toolUse","timestamp":1784293254466,"responseId":"resp_034a6be5a6696b6c016a5a2786f2d08191b138924198651f72","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a278a547c8191aa86deca171f032d","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWieQh0NmXN0yOmWysmqexaG5VYr3vOTkhd2-OIqziAStdVUEjSrT0GV49f8MuCeBefEXYboe5SHzW4P4WX5s0rcrcKtfSnFhxdYWV_8HvKC1S4BVpSH3BVRF2rxyBHkJx3vbm-8gs5wmT6zqi-sEkM2OfusxVurkjvhTd9m3hBttMNgqlJmFdUm3URCdEKKaHj2h8FevzdcQeRVS0nWDP0Fgu3cppzr5v7sR19ip1YTbOAKozaJtmN4Myz0dkrtf4sz3kf8bLBceKf6i_9J95LhFUk4aF5Wq4Uz0NXLnWOpm3GQnQJm-pQIWGtMIFCOOTBI8W2Yy1aFDm62DEwpmO_Y1cyqT5cbMh8WgoFESeH0jMhz65ozaEg3OBtARqHVfKUdn-jms_iKazPSSLyqPyu3tiS5FNHJJg0mykro0al--H2JiX_p5ChqLyujj3wPoP9r6qnqUzOzLEIsrW1a98KehjUMaync7eWTiFjcgHADlnH2kKjqucYFzF1dYIxm-J9V3pg88xSw6yLbulMRtS38peyBaOJjPctDqzAiDZ6s80xGCY0ABrX8HRk00fxzah76F0px8tFVh-6zZOKd1mlpi2m2k1eJ4p6XqXpap3MON_DOhUadJOmGwiIcvJ0qgWewTo6pp3JJmRbxxL2-5d68BhPnDN6AMbRNMctOkCDvMdzq9-elJpNXXf07Tnnlz5jOF2zKyb_Dg8vvF2Z61RhFHzTfkUJu3V5NTMzTm_Qzr65KQLEeZyeesrkXAXd4TfLOzsj0uUTlTAcYpSBgvuor0GBa63Z2r6m3V4Wfr-vR-8k7FtpWAJLf6moLBRyAVP0v1PnXzhmoXP9X5JI4TutzNHcdsilb7R75En_WGIi85NmtdNkD-1lGRb82u7dCOVm5GzTQq4V44rUB-xsVMoMBRrQAChhlgYRl_BJM470C1CTWZVNSqWW1jZyYA8Vh1jMWO91Xwk9NOFPjwAkjmW6_rgijDo5XyczSZAQ7_PfaEXyloYlOPKPqbB0daGQfEFIZ70PggbGv5-bfBUfNpHI1SMqny3hpOHvDj8aDoFeiwBWpK_7QEicxNCopwPvBanhjt7oUVj0bDRA4oli1edaQGDg==","summary":[{"type":"summary_text","text":"**Confirming owlery home path**"}]},{"id":"fc_034a6be5a6696b6c016a5a279003448191882b41ddb57d4230","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing live endpoint states\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/*/info.json\",\"hidden\":true,\"gitignore\":false,\"limit\":100}","call_id":"call_0miDSJBnJH003kgvO4dyQudy","name":"glob"},{"id":"fc_034a6be5a6696b6c016a5a279005188191a9060b7bc8e8fbc3","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding online state fields\",\"pattern\":\"\\\"state\\\"\\\\s*:\\\\s*\\\"live_agent\\\"|\\\"status\\\"\\\\s*:\\\\s*\\\"online\\\"|\\\"session_id\\\"\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_zMxYwKuGAXopViZnVJqfjc7E","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a279005f8819197fbdc1cefb2bf35","type":"function_call","status":"completed","arguments":"{\"i\":\"Listing deadline anchors\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/deadline-*.json\",\"hidden\":true,\"gitignore\":false,\"limit\":100}","call_id":"call_l2hwfRoJnZvM5JgxT567cH2e","name":"glob"},{"id":"fc_034a6be5a6696b6c016a5a279006088191aec2191244458c63","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating pulse tick function\",\"pattern\":\"pub fn pulse_tick|fn pulse_tick|TickReport\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_RkwrflEDM8uZvAog0FhJenBi","name":"grep"}]},"duration":12552.014300003648,"ttft":3941.232100009918,"contextSnapshot":{"promptTokens":134021,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_0miDSJBnJH003kgvO4dyQudy|fc_034a6be5a6696b6c016a5a279003448191882b41ddb57d4230","toolName":"glob","startedAt":"2026-07-17T13:01:07.019Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/info.json"},"intent":"Listing live endpoint states"},"id":"29708149","parentId":"cec11d0b","timestamp":"2026-07-17T13:01:07.019Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_zMxYwKuGAXopViZnVJqfjc7E|fc_034a6be5a6696b6c016a5a279005188191a9060b7bc8e8fbc3","toolName":"grep","startedAt":"2026-07-17T13:01:07.019Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery"},"intent":"Finding online state fields"},"id":"c73e3ab3","parentId":"29708149","timestamp":"2026-07-17T13:01:07.019Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_l2hwfRoJnZvM5JgxT567cH2e|fc_034a6be5a6696b6c016a5a279005f8819197fbdc1cefb2bf35","toolName":"glob","startedAt":"2026-07-17T13:01:07.020Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/deadline-*.json"},"intent":"Listing deadline anchors"},"id":"e58fdcb9","parentId":"c73e3ab3","timestamp":"2026-07-17T13:01:07.020Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_RkwrflEDM8uZvAog0FhJenBi|fc_034a6be5a6696b6c016a5a279006088191aec2191244458c63","toolName":"grep","startedAt":"2026-07-17T13:01:07.020Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Locating pulse tick function"},"id":"f5ac1d6d","parentId":"e58fdcb9","timestamp":"2026-07-17T13:01:07.020Z"}
{"type":"message","id":"da1ab9f0","parentId":"f5ac1d6d","timestamp":"2026-07-17T13:01:07.021Z","message":{"role":"toolResult","toolCallId":"call_RkwrflEDM8uZvAog0FhJenBi|fc_034a6be5a6696b6c016a5a279006088191aec2191244458c63","toolName":"grep","content":[{"type":"text","text":" 295|#[derive(Debug, Clone, Default)]\n*296|pub struct TickReport {\n 297|    pub ingested: Vec<Ingested>,\n 298|    pub echo_fired: bool,\n 299|    /// F-030 W1: the per-event psyche-turn outcome when the echo-gate fired this\n...\n 592|    /// echo-commune (T3).\n*593|    pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {\n 594|        let now = now_ms();\n 595|        // Recency follows the resting model (D9-2 — the D8 gap closed): only\n 596|        // an ACTIVE (or pre-D9-2 recordless) instance refreshes\n...\n 672|            };\n*673|        Ok(TickReport {\n 674|            ingested,\n 675|            echo_fired,\n 676|            turn_outcome,\n...\n 699|    // [impl->REQ-DAEMON-1]\n*700|    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\n 701|        &self,\n 702|        session_id: Option<&str>,\n 703|        stop: &AtomicBool,\n...\n 1571|    #[test] // [unit->REQ-DAEMON-1] a daemon-hosted pulse tick ingests a commune drop.\n*1572|    fn pulse_tick_ingests_drop() {\n 1573|        with_home(|_| {\n 1574|            let drops = tempfile::tempdir().unwrap();\n 1575|            let manifest = live_manifest(drops.path());"}],"details":{"scopePath":"crates/spt-daemon/src/lifecycle.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":1,"files":["crates/spt-daemon/src/lifecycle.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/lifecycle.rs","count":5}],"truncated":false,"displayContent":"  295│#[derive(Debug, Clone, Default)]\n *296│pub struct TickReport {\n  297│    pub ingested: Vec<Ingested>,\n  298│    pub echo_fired: bool,\n  299│    /// F-030 W1: the per-event psyche-turn outcome when the echo-gate fired this\n     │...\n  592│    /// echo-commune (T3).\n *593│    pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {\n  594│        let now = now_ms();\n  595│        // Recency follows the resting model (D9-2 — the D8 gap closed): only\n  596│        // an ACTIVE (or pre-D9-2 recordless) instance refreshes\n     │...\n  672│            };\n *673│        Ok(TickReport {\n  674│            ingested,\n  675│            echo_fired,\n  676│            turn_outcome,\n     │...\n  699│    // [impl->REQ-DAEMON-1]\n *700│    pub fn run_pulse_loop<F: FnMut(&TickReport)>(\n  701│        &self,\n  702│        session_id: Option<&str>,\n  703│        stop: &AtomicBool,\n     │...\n 1571│    #[test] // [unit->REQ-DAEMON-1] a daemon-hosted pulse tick ingests a commune drop.\n*1572│    fn pulse_tick_ingests_drop() {\n 1573│        with_home(|_| {\n 1574│            let drops = tempfile::tempdir().unwrap();\n 1575│            let manifest = live_manifest(drops.path());"},"isError":false,"timestamp":1784293267021}}
{"type":"message","id":"31797ea0","parentId":"da1ab9f0","timestamp":"2026-07-17T13:01:07.028Z","message":{"role":"toolResult","toolCallId":"call_0miDSJBnJH003kgvO4dyQudy|fc_034a6be5a6696b6c016a5a279003448191882b41ddb57d4230","toolName":"glob","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n## lia/\ninfo.json\n## webbie/\ninfo.json\n## doyle/\ninfo.json\n## deployah/\ninfo.json\n## mobile-gw/\ninfo.json\n## perri/\ninfo.json\n## todlando/\ninfo.json\n## emphasys/\ninfo.json\n## gaki-normal-probe/\ninfo.json\n## hertz/\ninfo.json\n## flynn/\ninfo.json\n## chert/\ninfo.json"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery","fileCount":12,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/hertz/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/chert/info.json"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784293267028}}
{"type":"message","id":"897b4c21","parentId":"31797ea0","timestamp":"2026-07-17T13:01:07.037Z","message":{"role":"toolResult","toolCallId":"call_zMxYwKuGAXopViZnVJqfjc7E|fc_034a6be5a6696b6c016a5a279005188191a9060b7bc8e8fbc3","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## chert/\n### info.json\n*1|{\"id\":\"chert\",\"started\":\"1783597509\",\"pid\":27588,\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"state\":\"live_agent\",\"parent_pid\":31012,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1783630087661,\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}\n### sessions.log\n*1|{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n*2|{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n\n### nested/chert-psyche/\n#### psyche-custody.json\n*1|{\"session_id\":\"48a88e4c-dab8-4b8f-90c6-571c7a65a4b3\"}\n\n## deployah/\n### info.json\n*1|{\"id\":\"deployah\",\"started\":\"1784265259\",\"pid\":80200,\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"state\":\"live_agent\",\"parent_pid\":57992,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784292408974,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n*1|{\"ts\":\"2026-07-07T05:12:52Z\",\"session_id\":\"8f826b4f-918e-401c-9a34-b55939a457d1\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T05:57:29Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T10:22:44Z\",\"session_id\":\"2592511f-8de4-4da3-bbe8-764cffdff6ec\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T10:22:49Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-07T10:37:24Z\",\"session_id\":\"c153f95c-3776-40c9-8faa-bdc24d5be72f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-08T00:57:42Z\",\"session_id\":\"5b3a2381-5e45-4f9a-8543-4c5f5009c468\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-08T04:36:16Z\",\"session_id\":\"86995925-9f01-4044-9d8f-c1ede418396c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-08T11:09:27Z\",\"session_id\":\"b8785184-d487-4bba-9217-84d045b5c5d5\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-09T04:07:55Z\",\"session_id\":\"b317273f-decf-492f-b6d7-a5558a360cdf\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-09T12:23:33Z\",\"session_id\":\"41b1b5f7-6040-4af3-9d83-9336ab847866\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-09T22:53:02Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T12:16:37Z\",\"session_id\":\"67679d05-54bd-46d2-8d3c-1e7ac2231869\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-10T12:16:38Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-10T13:02:34Z\",\"session_id\":\"a053d1d6-5b05-4f34-a3ff-15b7269b7675\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15|{\"ts\":\"2026-07-15T03:25:15Z\",\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/deployah-psyche/\n#### psyche-custody.json\n*1|{\"session_id\":\"9f6809de-dff6-49bd-b83c-fc5e1f455f0e\"}\n\n## doyle/\n### info.json\n*1|{\"id\":\"doyle\",\"started\":\"1784265259\",\"pid\":65604,\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"state\":\"live_agent\",\"parent_pid\":30412,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784278204175,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### info.json.tmp.66492-89936\n*1|{\"id\":\"doyle\",\"started\":\"1783685652\",\"pid\":47536,\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"state\":\"live_agent\",\"parent_pid\":52188,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"online\",\"last_active_ms\":1783686857342,\"driven_by\":\"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\"controlled\":true,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n*1|{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/doyle-psyche/\n#### psyche-custody.json\n*1|{\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\"}\n\n## emphasys/\n### info.json\n*1|{\"id\":\"emphasys\",\"started\":\"1784188602\",\"pid\":31352,\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"state\":\"ready_agent\",\"parent_pid\":39736,\"cwd\":\"C:/Users/decid/Documents/projects/omp-spt\",\"status\":\"offline\",\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"omp-spt\",\"controllable\":false}\n### sessions.log\n*1|{\"ts\":\"2026-07-15T09:59:11Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":0,\"adapter\":\"omp-spt\"}\n*2|{\"ts\":\"2026-07-15T09:59:12Z\",\"session_id\":\"sess-40004-1784109552609931400\",\"trigger\":\"boot\",\"ordinal\":1,\"adapter\":\"omp-spt\"}\n*3|{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":2,\"adapter\":\"omp-spt\"}\n*4|{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"sess-33500-1784111367400174200\",\"trigger\":\"boot\",\"ordinal\":3,\"adapter\":\"omp-spt\"}\n*5|{\"ts\":\"2026-07-15T11:14:59Z\",\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":4,\"adapter\":\"omp-spt\"}\n\n## flynn/\n### info.json\n*1|{\"id\":\"flynn\",\"started\":\"1783745674\",\"pid\":5384,\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"state\":\"live_agent\",\"parent_pid\":74792,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"status\":\"offline\",\"last_active_ms\":1783991690185,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n*1|{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n*3|{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n*4|{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n*5|{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n*6|{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n*7|{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n*8|{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n*9|{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10|{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11|{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/flynn-psyche/\n#### psyche-custody.json\n*1|{\"session_id\":\"21a62f4f-ed92-4d7e-9b82-7831cfe88028\"}\n\n## gaki-normal-probe/\n### info.json\n*1|{\"id\":\"gaki-normal-probe\",\"started\":\"1784211213\",\"pid\":53920,\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"state\":\"live_agent\",\"parent_pid\":77408,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784211214850,\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n*1|{\"ts\":\"2026-07-16T11:15:02Z\",\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/gaki-normal-probe-psyche/\n#### psyche-custody.json\n*1|{\"session_id\":\"27204834-50e2-41c1-aa47-f71702c732d6\"}\n\n## hertz/\n### info.json\n*1|{\"id\":\"hertz\",\"started\":\"1784189614\",\"pid\":34280,\"session_id\":\"sess-34280-1784189614810498300\",\"state\":\"ready_agent\",\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"omp-spt\"}\n### sessions.log\n*1|{\"ts\":\"2026-07-10T03:09:05Z\",\"session_id\":\"sess-49664-1783652945861946300\",\"trigger\":\"boot\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-10T03:09:14Z\",\"session_id\":\"sess-57128-1783652954227634400\",\"trigger\":\"boot\",\"ordinal\":1}\n*3|{\"ts\":\"2026-07-10T03:09:23Z\",\"session_id\":\"sess-59652-1783652963828614600\",\"trigger\":\"boot\",\"ordinal\":2}\n*4|{\"ts\":\"2026-07-10T03:47:11Z\",\"session_id\":\"sess-64940-1783655231977229600\",\"trigger\":\"boot\",\"ordinal\":3}\n*5|{\"ts\":\"2026-07-10T03:48:30Z\",\"session_id\":\"sess-45624-1783655310056470400\",\"trigger\":\"boot\",\"ordinal\":4}\n*6|{\"ts\":\"2026-07-10T03:55:41Z\",\"session_id\":\"sess-79964-1783655741522321600\",\"trigger\":\"boot\",\"ordinal\":5}\n*7|{\"ts\":\"2026-07-10T03:56:52Z\",\"session_id\":\"sess-67680-1783655812329316200\",\"trigger\":\"boot\",\"ordinal\":6}\n*8|{\"ts\":\"2026-07-10T03:57:21Z\",\"session_id\":\"sess-49640-1783655841133432300\",\"trigger\":\"boot\",\"ordinal\":7}\n*9|{\"ts\":\"2026-07-10T03:57:52Z\",\"session_id\":\"sess-52628-1783655872037490700\",\"trigger\":\"boot\",\"ordinal\":8}\n*10|{\"ts\":\"2026-07-10T03:59:38Z\",\"session_id\":\"sess-57188-1783655978136495600\",\"trigger\":\"boot\",\"ordinal\":9}\n*11|{\"ts\":\"2026-07-10T03:59:55Z\",\"session_id\":\"sess-36976-1783655995507652300\",\"trigger\":\"boot\",\"ordinal\":10}\n*12|{\"ts\":\"2026-07-10T04:00:07Z\",\"session_id\":\"sess-38024-1783656007605696700\",\"trigger\":\"boot\",\"ordinal\":11}\n*13|{\"ts\":\"2026-07-10T04:00:14Z\",\"session_id\":\"sess-46120-1783656014981806400\",\"trigger\":\"boot\",\"ordinal\":12}\n*14|{\"ts\":\"2026-07-10T04:00:26Z\",\"session_id\":\"sess-77220-1783656026228588600\",\"trigger\":\"boot\",\"ordinal\":13}\n*15|{\"ts\":\"2026-07-10T04:00:37Z\",\"session_id\":\"sess-44820-1783656037158237600\",\"trigger\":\"boot\",\"ordinal\":14}\n*16|{\"ts\":\"2026-07-10T04:00:46Z\",\"session_id\":\"sess-47160-1783656046664586700\",\"trigger\":\"boot\",\"ordinal\":15}\n*17|{\"ts\":\"2026-07-10T04:03:48Z\",\"session_id\":\"sess-29624-1783656228813745900\",\"trigger\":\"boot\",\"ordinal\":16}\n*18|{\"ts\":\"2026-07-10T04:05:04Z\",\"session_id\":\"sess-56784-1783656304075360500\",\"trigger\":\"boot\",\"ordinal\":17}\n*19|{\"ts\":\"2026-07-10T04:06:17Z\",\"session_id\":\"sess-75108-1783656377065211600\",\"trigger\":\"boot\",\"ordinal\":18}\n*20|{\"ts\":\"2026-07-10T04:09:14Z\",\"session_id\":\"sess-45376-1783656554208398900\",\"trigger\":\"boot\",\"ordinal\":19}\n\nShowing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":96,"fileCount":20,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/chert/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/chert/nested/chert-psyche/psyche-custody.json","C:/Users/decid/AppData/Local/spt-core/owlery/chert/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/nested/deployah-psyche/psyche-custody.json","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/info.json.tmp.66492-89936","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/nested/doyle-psyche/psyche-custody.json","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/nested/flynn-psyche/psyche-custody.json","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/nested/gaki-normal-probe-psyche/psyche-custody.json","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/hertz/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/chert/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/chert/nested/chert-psyche/psyche-custody.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/chert/sessions.log","count":2},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/deployah/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/deployah/nested/deployah-psyche/psyche-custody.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/deployah/sessions.log","count":15},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/info.json.tmp.66492-89936","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/nested/doyle-psyche/psyche-custody.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/sessions.log","count":5},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/nested/flynn-psyche/psyche-custody.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/nested/gaki-normal-probe-psyche/psyche-custody.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/sessions.log","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/info.json","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","count":20}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## chert/\n### info.json\n*1│{\"id\":\"chert\",\"started\":\"1783597509\",\"pid\":27588,\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"state\":\"live_agent\",\"parent_pid\":31012,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1783630087661,\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}\n### sessions.log\n*1│{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n*2│{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n\n### nested/chert-psyche/\n#### psyche-custody.json\n*1│{\"session_id\":\"48a88e4c-dab8-4b8f-90c6-571c7a65a4b3\"}\n\n## deployah/\n### info.json\n*1│{\"id\":\"deployah\",\"started\":\"1784265259\",\"pid\":80200,\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"state\":\"live_agent\",\"parent_pid\":57992,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784292408974,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n *1│{\"ts\":\"2026-07-07T05:12:52Z\",\"session_id\":\"8f826b4f-918e-401c-9a34-b55939a457d1\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T05:57:29Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T10:22:44Z\",\"session_id\":\"2592511f-8de4-4da3-bbe8-764cffdff6ec\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T10:22:49Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-07T10:37:24Z\",\"session_id\":\"c153f95c-3776-40c9-8faa-bdc24d5be72f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-08T00:57:42Z\",\"session_id\":\"5b3a2381-5e45-4f9a-8543-4c5f5009c468\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-08T04:36:16Z\",\"session_id\":\"86995925-9f01-4044-9d8f-c1ede418396c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-08T11:09:27Z\",\"session_id\":\"b8785184-d487-4bba-9217-84d045b5c5d5\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-09T04:07:55Z\",\"session_id\":\"b317273f-decf-492f-b6d7-a5558a360cdf\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-09T12:23:33Z\",\"session_id\":\"41b1b5f7-6040-4af3-9d83-9336ab847866\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-09T22:53:02Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T12:16:37Z\",\"session_id\":\"67679d05-54bd-46d2-8d3c-1e7ac2231869\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-10T12:16:38Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-10T13:02:34Z\",\"session_id\":\"a053d1d6-5b05-4f34-a3ff-15b7269b7675\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15│{\"ts\":\"2026-07-15T03:25:15Z\",\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/deployah-psyche/\n#### psyche-custody.json\n*1│{\"session_id\":\"9f6809de-dff6-49bd-b83c-fc5e1f455f0e\"}\n\n## doyle/\n### info.json\n*1│{\"id\":\"doyle\",\"started\":\"1784265259\",\"pid\":65604,\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"state\":\"live_agent\",\"parent_pid\":30412,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784278204175,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### info.json.tmp.66492-89936\n*1│{\"id\":\"doyle\",\"started\":\"1783685652\",\"pid\":47536,\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"state\":\"live_agent\",\"parent_pid\":52188,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"online\",\"last_active_ms\":1783686857342,\"driven_by\":\"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\"controlled\":true,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n *1│{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/doyle-psyche/\n#### psyche-custody.json\n*1│{\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\"}\n\n## emphasys/\n### info.json\n*1│{\"id\":\"emphasys\",\"started\":\"1784188602\",\"pid\":31352,\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"state\":\"ready_agent\",\"parent_pid\":39736,\"cwd\":\"C:/Users/decid/Documents/projects/omp-spt\",\"status\":\"offline\",\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"omp-spt\",\"controllable\":false}\n### sessions.log\n*1│{\"ts\":\"2026-07-15T09:59:11Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":0,\"adapter\":\"omp-spt\"}\n*2│{\"ts\":\"2026-07-15T09:59:12Z\",\"session_id\":\"sess-40004-1784109552609931400\",\"trigger\":\"boot\",\"ordinal\":1,\"adapter\":\"omp-spt\"}\n*3│{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":2,\"adapter\":\"omp-spt\"}\n*4│{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"sess-33500-1784111367400174200\",\"trigger\":\"boot\",\"ordinal\":3,\"adapter\":\"omp-spt\"}\n*5│{\"ts\":\"2026-07-15T11:14:59Z\",\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":4,\"adapter\":\"omp-spt\"}\n\n## flynn/\n### info.json\n*1│{\"id\":\"flynn\",\"started\":\"1783745674\",\"pid\":5384,\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"state\":\"live_agent\",\"parent_pid\":74792,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"status\":\"offline\",\"last_active_ms\":1783991690185,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n *1│{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n *2│{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n *3│{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n *4│{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n *5│{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n *6│{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n *7│{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n *8│{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n *9│{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10│{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11│{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/flynn-psyche/\n#### psyche-custody.json\n*1│{\"session_id\":\"21a62f4f-ed92-4d7e-9b82-7831cfe88028\"}\n\n## gaki-normal-probe/\n### info.json\n*1│{\"id\":\"gaki-normal-probe\",\"started\":\"1784211213\",\"pid\":53920,\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"state\":\"live_agent\",\"parent_pid\":77408,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1784211214850,\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\n### sessions.log\n*1│{\"ts\":\"2026-07-16T11:15:02Z\",\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n\n### nested/gaki-normal-probe-psyche/\n#### psyche-custody.json\n*1│{\"session_id\":\"27204834-50e2-41c1-aa47-f71702c732d6\"}\n\n## hertz/\n### info.json\n*1│{\"id\":\"hertz\",\"started\":\"1784189614\",\"pid\":34280,\"session_id\":\"sess-34280-1784189614810498300\",\"state\":\"ready_agent\",\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"omp-spt\"}\n### sessions.log\n *1│{\"ts\":\"2026-07-10T03:09:05Z\",\"session_id\":\"sess-49664-1783652945861946300\",\"trigger\":\"boot\",\"ordinal\":0}\n *2│{\"ts\":\"2026-07-10T03:09:14Z\",\"session_id\":\"sess-57128-1783652954227634400\",\"trigger\":\"boot\",\"ordinal\":1}\n *3│{\"ts\":\"2026-07-10T03:09:23Z\",\"session_id\":\"sess-59652-1783652963828614600\",\"trigger\":\"boot\",\"ordinal\":2}\n *4│{\"ts\":\"2026-07-10T03:47:11Z\",\"session_id\":\"sess-64940-1783655231977229600\",\"trigger\":\"boot\",\"ordinal\":3}\n *5│{\"ts\":\"2026-07-10T03:48:30Z\",\"session_id\":\"sess-45624-1783655310056470400\",\"trigger\":\"boot\",\"ordinal\":4}\n *6│{\"ts\":\"2026-07-10T03:55:41Z\",\"session_id\":\"sess-79964-1783655741522321600\",\"trigger\":\"boot\",\"ordinal\":5}\n *7│{\"ts\":\"2026-07-10T03:56:52Z\",\"session_id\":\"sess-67680-1783655812329316200\",\"trigger\":\"boot\",\"ordinal\":6}\n *8│{\"ts\":\"2026-07-10T03:57:21Z\",\"session_id\":\"sess-49640-1783655841133432300\",\"trigger\":\"boot\",\"ordinal\":7}\n *9│{\"ts\":\"2026-07-10T03:57:52Z\",\"session_id\":\"sess-52628-1783655872037490700\",\"trigger\":\"boot\",\"ordinal\":8}\n*10│{\"ts\":\"2026-07-10T03:59:38Z\",\"session_id\":\"sess-57188-1783655978136495600\",\"trigger\":\"boot\",\"ordinal\":9}\n*11│{\"ts\":\"2026-07-10T03:59:55Z\",\"session_id\":\"sess-36976-1783655995507652300\",\"trigger\":\"boot\",\"ordinal\":10}\n*12│{\"ts\":\"2026-07-10T04:00:07Z\",\"session_id\":\"sess-38024-1783656007605696700\",\"trigger\":\"boot\",\"ordinal\":11}\n*13│{\"ts\":\"2026-07-10T04:00:14Z\",\"session_id\":\"sess-46120-1783656014981806400\",\"trigger\":\"boot\",\"ordinal\":12}\n*14│{\"ts\":\"2026-07-10T04:00:26Z\",\"session_id\":\"sess-77220-1783656026228588600\",\"trigger\":\"boot\",\"ordinal\":13}\n*15│{\"ts\":\"2026-07-10T04:00:37Z\",\"session_id\":\"sess-44820-1783656037158237600\",\"trigger\":\"boot\",\"ordinal\":14}\n*16│{\"ts\":\"2026-07-10T04:00:46Z\",\"session_id\":\"sess-47160-1783656046664586700\",\"trigger\":\"boot\",\"ordinal\":15}\n*17│{\"ts\":\"2026-07-10T04:03:48Z\",\"session_id\":\"sess-29624-1783656228813745900\",\"trigger\":\"boot\",\"ordinal\":16}\n*18│{\"ts\":\"2026-07-10T04:05:04Z\",\"session_id\":\"sess-56784-1783656304075360500\",\"trigger\":\"boot\",\"ordinal\":17}\n*19│{\"ts\":\"2026-07-10T04:06:17Z\",\"session_id\":\"sess-75108-1783656377065211600\",\"trigger\":\"boot\",\"ordinal\":18}\n*20│{\"ts\":\"2026-07-10T04:09:14Z\",\"session_id\":\"sess-45376-1783656554208398900\",\"trigger\":\"boot\",\"ordinal\":19}"},"isError":false,"timestamp":1784293267037}}
{"type":"message","id":"f6a05062","parentId":"897b4c21","timestamp":"2026-07-17T13:01:07.059Z","message":{"role":"toolResult","toolCallId":"call_l2hwfRoJnZvM5JgxT567cH2e|fc_034a6be5a6696b6c016a5a279005f8819197fbdc1cefb2bf35","toolName":"glob","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/\ndeadline-5106270b-52d7-4a87-b78c-4edc06911b25.json\ndeadline-e5b62b57-69a0-452c-9c7e-cd3708186344.json\ndeadline-b155a5e6-a87c-416f-b029-d9cbc4ffd83e.json\ndeadline-89cc9038-e5d9-429e-b4a9-40fba8af71ee.json\ndeadline-9183c374-ac41-4e0a-b478-a8b19f32f855.json\ndeadline-fc582bea-2d15-4077-b21a-086cbcbe3cee.json\ndeadline-a2fdb848-6643-4e10-b221-6baee7e91b7b.json\ndeadline-bf353802-556c-46ce-9865-e74a3092bbe9.json\ndeadline-9e0df17e-f217-4446-97a4-f528a56024ba.json\ndeadline-7818eabc-d26c-4a0b-965c-b600016f1cea.json\ndeadline-e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b.json\ndeadline-c1427211-6e8d-4571-aeb8-30d36fa816a6.json\ndeadline-6389a46d-930f-4662-b560-293532307149.json\ndeadline-cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde.json\ndeadline-058dcb6f-1586-47a0-a0cd-0a4a085881ca.json\ndeadline-b4fe0587-e19f-4b78-81a8-c97931c52126.json\ndeadline-59cfcf11-f9d7-4967-a9bc-8892efb0f320.json\ndeadline-019f656e-6a10-7000-8949-19c300a9ae4a.json\ndeadline-019f6560-0096-7000-b53f-7ab1ea3d2bcf.json\ndeadline-3d75265c-0071-44a0-98fa-3d748c66b87f.json\ndeadline-1fae2b4c-9daf-44fc-afe5-06c410ac69b8.json\ndeadline-f4df7cba-aae5-46c6-aa4f-50d2fb874894.json\ndeadline-48d40117-34b1-4da6-b8ca-d86bb9257bcc.json\ndeadline-acf536b2-2832-4253-ba8a-b6f2ade00060.json\ndeadline-ecd15339-2c75-4e4c-ba1a-2c25bd437233.json\ndeadline-f4c1fc0e-de8e-4df0-8416-f01761a944cb.json\ndeadline-5b71855b-82d2-483b-908f-4b2c3f57db84.json\ndeadline-a053d1d6-5b05-4f34-a3ff-15b7269b7675.json\ndeadline-c9c02696-1ec3-4319-8b23-b7f72090fdb3.json\ndeadline-4738b82a-2512-44ea-b542-a7816dc01f46.json\ndeadline-972aa6de-2f09-4a45-8a7c-89eee469fb5f.json\ndeadline-0d3ec7f7-e517-4bf7-8016-4f422d4e8d7d.json\ndeadline-26c49822-00bc-4abe-8be2-91f44b9e4fea.json\ndeadline-6cf22920-8f60-4a09-9b8d-7d46280f9a8c.json\ndeadline-6a623999-3605-40e4-8991-c27d0467ffc0.json\ndeadline-feec8b93-34d3-41da-b2cc-6874150e6916.json\ndeadline-0fe6cad5-3efb-4ced-8031-d9a41e22ff81.json\ndeadline-a54257af-8b81-456c-ba38-85739f7f10e9.json\ndeadline-50b0fc81-455e-4b65-8e93-f7400599c6c6.json\ndeadline-175d35a3-4eca-4ac8-8885-261f29f277ef.json\ndeadline-d1a6c133-f9dc-4619-b4e7-1573677ac68f.json\ndeadline-a5918ea9-d5bf-4657-a6d3-159f6d6634c4.json\ndeadline-a2476c7e-db88-40fa-9ec3-ce902985829a.json\ndeadline-21a62f4f-ed92-4d7e-9b82-7831cfe88028.json\ndeadline-812e5b03-e915-4e2e-a1ee-661d33165f74.json\ndeadline-848a1626-51dd-49f2-8336-63a7c1c9ea02.json\ndeadline-b344389f-c6c1-4fb4-953c-bf6eb95d635d.json\ndeadline-9f6809de-dff6-49bd-b83c-fc5e1f455f0e.json\ndeadline-c86c5100-c27b-41ff-a2c0-3f42102676ef.json\ndeadline-586ab982-8ebe-470a-b47a-15332f8edfab.json\ndeadline-6402bb1f-a8b9-46ab-804f-1ebe6272da0a.json\ndeadline-41b1b5f7-6040-4af3-9d83-9336ab847866.json\ndeadline-3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9.json\ndeadline-865cf2a3-f778-49e0-9934-af011cdf38e0.json\ndeadline-ef8f1a4c-b80c-4d35-991d-adeffbad8cd0.json\ndeadline-b317273f-decf-492f-b6d7-a5558a360cdf.json\ndeadline-63fa684a-a93e-4405-a6c5-115f9bccac2a.json\ndeadline-57495b6e-3f65-40bd-b9b7-a7177ccb8a8d.json\ndeadline-2ac55eb7-e705-4c6b-8665-2fcab1cdb922.json\ndeadline-4bc2e259-0e4a-4331-be30-6e6b8230bf2a.json\ndeadline-bbac2312-aca2-4666-95cf-7a0e2144bf3e.json\ndeadline-b76d3b71-a821-490b-bd8d-9b2cf1bf2717.json\ndeadline-df158dbc-6195-4883-90e6-07ce17e09a8e.json\ndeadline-bbd5bbc6-dd2c-4301-9b63-3c61fe194d3b.json\ndeadline-c07f3726-4d6f-4b35-9da2-46772f2938cf.json\ndeadline-41550c80-863e-4c7f-82db-cf1da416289f.json\ndeadline-e6e84eb4-8b78-4a2d-95ff-0cd81e88fd41.json\ndeadline-de244f53-27c7-4ac7-ab09-d2e7c1cd7326.json\ndeadline-13712404-60aa-4dc9-957b-9e854ac0f73d.json\ndeadline-ab18a9b1-56ec-4f34-827c-144947b68957.json\ndeadline-aed3e074-30a9-40a8-87a0-c878bf4bdc48.json\ndeadline-5b3a2381-5e45-4f9a-8543-4c5f5009c468.json\ndeadline-f369c681-9cb1-4990-9c0b-14cd34c4cc03.json\ndeadline-3e4d7e59-28ef-48fc-94cb-4c61c024c306.json\ndeadline-c153f95c-3776-40c9-8faa-bdc24d5be72f.json\ndeadline-0c1ff292-5b8c-418b-a054-e44271e02abb.json\ndeadline-ce778223-2746-4550-a320-9e98b3077b1c.json\ndeadline-34b67d21-7425-4a6c-b18e-9dd297fde48d.json\ndeadline-perri-probe-part-8654-sess.json\ndeadline-perri-probe-7103-sess.json\ndeadline-perri-probe-6890-sess.json\ndeadline-2592511f-8de4-4da3-bbe8-764cffdff6ec.json\ndeadline-55befc10-c2e5-45a6-9675-b732672f58ff.json\ndeadline-ee9948ab-41dc-4cb3-9c09-29a503c96934.json\ndeadline-24991e23-40f2-45a0-8b01-dfb8c95cf193.json\ndeadline-c73433d8-d070-4f7e-b04f-a9be62c4068a.json\ndeadline-6db151cc-515e-4fdf-8fe7-9f98697b588b.json\ndeadline-72f89cf6-7ec0-450a-b68c-4f401db59a61.json\ndeadline-5edb9f02-51b0-448b-a2d3-e3276fe31482.json\ndeadline-b1edf63f-df6b-4d11-bcd7-baa881670279.json\ndeadline-2571ac9e-b6f0-4497-87fc-03f60226b670.json\ndeadline-d5b46b36-ff77-4131-a774-17f6caa2ff35.json\ndeadline-8f826b4f-918e-401c-9a34-b55939a457d1.json\ndeadline-3014282c-3a92-4ee1-a957-3da91c655988.json\ndeadline-4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33.json\ndeadline-05d5e489-e4de-4da7-a6b5-196fcf255595.json\ndeadline-cfe4ff51-5063-4d00-9082-b4ef0a4f0055.json\ndeadline-38fd4368-0e40-4529-9873-7e2689ec742c.json\ndeadline-e253b012-99d0-4d6a-90ed-e355ba7aa943.json\ndeadline-26c873b1-8e04-4115-914c-01b58ea5eb1d.json\n\n[100 results limit reached. Use limit=200 for more]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core","fileCount":100,"files":["C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json","C:/Users/decid/AppData/Local/spt-core/deadline-e5b62b57-69a0-452c-9c7e-cd3708186344.json","C:/Users/decid/AppData/Local/spt-core/deadline-b155a5e6-a87c-416f-b029-d9cbc4ffd83e.json","C:/Users/decid/AppData/Local/spt-core/deadline-89cc9038-e5d9-429e-b4a9-40fba8af71ee.json","C:/Users/decid/AppData/Local/spt-core/deadline-9183c374-ac41-4e0a-b478-a8b19f32f855.json","C:/Users/decid/AppData/Local/spt-core/deadline-fc582bea-2d15-4077-b21a-086cbcbe3cee.json","C:/Users/decid/AppData/Local/spt-core/deadline-a2fdb848-6643-4e10-b221-6baee7e91b7b.json","C:/Users/decid/AppData/Local/spt-core/deadline-bf353802-556c-46ce-9865-e74a3092bbe9.json","C:/Users/decid/AppData/Local/spt-core/deadline-9e0df17e-f217-4446-97a4-f528a56024ba.json","C:/Users/decid/AppData/Local/spt-core/deadline-7818eabc-d26c-4a0b-965c-b600016f1cea.json","C:/Users/decid/AppData/Local/spt-core/deadline-e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b.json","C:/Users/decid/AppData/Local/spt-core/deadline-c1427211-6e8d-4571-aeb8-30d36fa816a6.json","C:/Users/decid/AppData/Local/spt-core/deadline-6389a46d-930f-4662-b560-293532307149.json","C:/Users/decid/AppData/Local/spt-core/deadline-cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde.json","C:/Users/decid/AppData/Local/spt-core/deadline-058dcb6f-1586-47a0-a0cd-0a4a085881ca.json","C:/Users/decid/AppData/Local/spt-core/deadline-b4fe0587-e19f-4b78-81a8-c97931c52126.json","C:/Users/decid/AppData/Local/spt-core/deadline-59cfcf11-f9d7-4967-a9bc-8892efb0f320.json","C:/Users/decid/AppData/Local/spt-core/deadline-019f656e-6a10-7000-8949-19c300a9ae4a.json","C:/Users/decid/AppData/Local/spt-core/deadline-019f6560-0096-7000-b53f-7ab1ea3d2bcf.json","C:/Users/decid/AppData/Local/spt-core/deadline-3d75265c-0071-44a0-98fa-3d748c66b87f.json","C:/Users/decid/AppData/Local/spt-core/deadline-1fae2b4c-9daf-44fc-afe5-06c410ac69b8.json","C:/Users/decid/AppData/Local/spt-core/deadline-f4df7cba-aae5-46c6-aa4f-50d2fb874894.json","C:/Users/decid/AppData/Local/spt-core/deadline-48d40117-34b1-4da6-b8ca-d86bb9257bcc.json","C:/Users/decid/AppData/Local/spt-core/deadline-acf536b2-2832-4253-ba8a-b6f2ade00060.json","C:/Users/decid/AppData/Local/spt-core/deadline-ecd15339-2c75-4e4c-ba1a-2c25bd437233.json","C:/Users/decid/AppData/Local/spt-core/deadline-f4c1fc0e-de8e-4df0-8416-f01761a944cb.json","C:/Users/decid/AppData/Local/spt-core/deadline-5b71855b-82d2-483b-908f-4b2c3f57db84.json","C:/Users/decid/AppData/Local/spt-core/deadline-a053d1d6-5b05-4f34-a3ff-15b7269b7675.json","C:/Users/decid/AppData/Local/spt-core/deadline-c9c02696-1ec3-4319-8b23-b7f72090fdb3.json","C:/Users/decid/AppData/Local/spt-core/deadline-4738b82a-2512-44ea-b542-a7816dc01f46.json","C:/Users/decid/AppData/Local/spt-core/deadline-972aa6de-2f09-4a45-8a7c-89eee469fb5f.json","C:/Users/decid/AppData/Local/spt-core/deadline-0d3ec7f7-e517-4bf7-8016-4f422d4e8d7d.json","C:/Users/decid/AppData/Local/spt-core/deadline-26c49822-00bc-4abe-8be2-91f44b9e4fea.json","C:/Users/decid/AppData/Local/spt-core/deadline-6cf22920-8f60-4a09-9b8d-7d46280f9a8c.json","C:/Users/decid/AppData/Local/spt-core/deadline-6a623999-3605-40e4-8991-c27d0467ffc0.json","C:/Users/decid/AppData/Local/spt-core/deadline-feec8b93-34d3-41da-b2cc-6874150e6916.json","C:/Users/decid/AppData/Local/spt-core/deadline-0fe6cad5-3efb-4ced-8031-d9a41e22ff81.json","C:/Users/decid/AppData/Local/spt-core/deadline-a54257af-8b81-456c-ba38-85739f7f10e9.json","C:/Users/decid/AppData/Local/spt-core/deadline-50b0fc81-455e-4b65-8e93-f7400599c6c6.json","C:/Users/decid/AppData/Local/spt-core/deadline-175d35a3-4eca-4ac8-8885-261f29f277ef.json","C:/Users/decid/AppData/Local/spt-core/deadline-d1a6c133-f9dc-4619-b4e7-1573677ac68f.json","C:/Users/decid/AppData/Local/spt-core/deadline-a5918ea9-d5bf-4657-a6d3-159f6d6634c4.json","C:/Users/decid/AppData/Local/spt-core/deadline-a2476c7e-db88-40fa-9ec3-ce902985829a.json","C:/Users/decid/AppData/Local/spt-core/deadline-21a62f4f-ed92-4d7e-9b82-7831cfe88028.json","C:/Users/decid/AppData/Local/spt-core/deadline-812e5b03-e915-4e2e-a1ee-661d33165f74.json","C:/Users/decid/AppData/Local/spt-core/deadline-848a1626-51dd-49f2-8336-63a7c1c9ea02.json","C:/Users/decid/AppData/Local/spt-core/deadline-b344389f-c6c1-4fb4-953c-bf6eb95d635d.json","C:/Users/decid/AppData/Local/spt-core/deadline-9f6809de-dff6-49bd-b83c-fc5e1f455f0e.json","C:/Users/decid/AppData/Local/spt-core/deadline-c86c5100-c27b-41ff-a2c0-3f42102676ef.json","C:/Users/decid/AppData/Local/spt-core/deadline-586ab982-8ebe-470a-b47a-15332f8edfab.json","C:/Users/decid/AppData/Local/spt-core/deadline-6402bb1f-a8b9-46ab-804f-1ebe6272da0a.json","C:/Users/decid/AppData/Local/spt-core/deadline-41b1b5f7-6040-4af3-9d83-9336ab847866.json","C:/Users/decid/AppData/Local/spt-core/deadline-3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9.json","C:/Users/decid/AppData/Local/spt-core/deadline-865cf2a3-f778-49e0-9934-af011cdf38e0.json","C:/Users/decid/AppData/Local/spt-core/deadline-ef8f1a4c-b80c-4d35-991d-adeffbad8cd0.json","C:/Users/decid/AppData/Local/spt-core/deadline-b317273f-decf-492f-b6d7-a5558a360cdf.json","C:/Users/decid/AppData/Local/spt-core/deadline-63fa684a-a93e-4405-a6c5-115f9bccac2a.json","C:/Users/decid/AppData/Local/spt-core/deadline-57495b6e-3f65-40bd-b9b7-a7177ccb8a8d.json","C:/Users/decid/AppData/Local/spt-core/deadline-2ac55eb7-e705-4c6b-8665-2fcab1cdb922.json","C:/Users/decid/AppData/Local/spt-core/deadline-4bc2e259-0e4a-4331-be30-6e6b8230bf2a.json","C:/Users/decid/AppData/Local/spt-core/deadline-bbac2312-aca2-4666-95cf-7a0e2144bf3e.json","C:/Users/decid/AppData/Local/spt-core/deadline-b76d3b71-a821-490b-bd8d-9b2cf1bf2717.json","C:/Users/decid/AppData/Local/spt-core/deadline-df158dbc-6195-4883-90e6-07ce17e09a8e.json","C:/Users/decid/AppData/Local/spt-core/deadline-bbd5bbc6-dd2c-4301-9b63-3c61fe194d3b.json","C:/Users/decid/AppData/Local/spt-core/deadline-c07f3726-4d6f-4b35-9da2-46772f2938cf.json","C:/Users/decid/AppData/Local/spt-core/deadline-41550c80-863e-4c7f-82db-cf1da416289f.json","C:/Users/decid/AppData/Local/spt-core/deadline-e6e84eb4-8b78-4a2d-95ff-0cd81e88fd41.json","C:/Users/decid/AppData/Local/spt-core/deadline-de244f53-27c7-4ac7-ab09-d2e7c1cd7326.json","C:/Users/decid/AppData/Local/spt-core/deadline-13712404-60aa-4dc9-957b-9e854ac0f73d.json","C:/Users/decid/AppData/Local/spt-core/deadline-ab18a9b1-56ec-4f34-827c-144947b68957.json","C:/Users/decid/AppData/Local/spt-core/deadline-aed3e074-30a9-40a8-87a0-c878bf4bdc48.json","C:/Users/decid/AppData/Local/spt-core/deadline-5b3a2381-5e45-4f9a-8543-4c5f5009c468.json","C:/Users/decid/AppData/Local/spt-core/deadline-f369c681-9cb1-4990-9c0b-14cd34c4cc03.json","C:/Users/decid/AppData/Local/spt-core/deadline-3e4d7e59-28ef-48fc-94cb-4c61c024c306.json","C:/Users/decid/AppData/Local/spt-core/deadline-c153f95c-3776-40c9-8faa-bdc24d5be72f.json","C:/Users/decid/AppData/Local/spt-core/deadline-0c1ff292-5b8c-418b-a054-e44271e02abb.json","C:/Users/decid/AppData/Local/spt-core/deadline-ce778223-2746-4550-a320-9e98b3077b1c.json","C:/Users/decid/AppData/Local/spt-core/deadline-34b67d21-7425-4a6c-b18e-9dd297fde48d.json","C:/Users/decid/AppData/Local/spt-core/deadline-perri-probe-part-8654-sess.json","C:/Users/decid/AppData/Local/spt-core/deadline-perri-probe-7103-sess.json","C:/Users/decid/AppData/Local/spt-core/deadline-perri-probe-6890-sess.json","C:/Users/decid/AppData/Local/spt-core/deadline-2592511f-8de4-4da3-bbe8-764cffdff6ec.json","C:/Users/decid/AppData/Local/spt-core/deadline-55befc10-c2e5-45a6-9675-b732672f58ff.json","C:/Users/decid/AppData/Local/spt-core/deadline-ee9948ab-41dc-4cb3-9c09-29a503c96934.json","C:/Users/decid/AppData/Local/spt-core/deadline-24991e23-40f2-45a0-8b01-dfb8c95cf193.json","C:/Users/decid/AppData/Local/spt-core/deadline-c73433d8-d070-4f7e-b04f-a9be62c4068a.json","C:/Users/decid/AppData/Local/spt-core/deadline-6db151cc-515e-4fdf-8fe7-9f98697b588b.json","C:/Users/decid/AppData/Local/spt-core/deadline-72f89cf6-7ec0-450a-b68c-4f401db59a61.json","C:/Users/decid/AppData/Local/spt-core/deadline-5edb9f02-51b0-448b-a2d3-e3276fe31482.json","C:/Users/decid/AppData/Local/spt-core/deadline-b1edf63f-df6b-4d11-bcd7-baa881670279.json","C:/Users/decid/AppData/Local/spt-core/deadline-2571ac9e-b6f0-4497-87fc-03f60226b670.json","C:/Users/decid/AppData/Local/spt-core/deadline-d5b46b36-ff77-4131-a774-17f6caa2ff35.json","C:/Users/decid/AppData/Local/spt-core/deadline-8f826b4f-918e-401c-9a34-b55939a457d1.json","C:/Users/decid/AppData/Local/spt-core/deadline-3014282c-3a92-4ee1-a957-3da91c655988.json","C:/Users/decid/AppData/Local/spt-core/deadline-4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33.json","C:/Users/decid/AppData/Local/spt-core/deadline-05d5e489-e4de-4da7-a6b5-196fcf255595.json","C:/Users/decid/AppData/Local/spt-core/deadline-cfe4ff51-5063-4d00-9082-b4ef0a4f0055.json","C:/Users/decid/AppData/Local/spt-core/deadline-38fd4368-0e40-4529-9873-7e2689ec742c.json","C:/Users/decid/AppData/Local/spt-core/deadline-e253b012-99d0-4d6a-90ed-e355ba7aa943.json","C:/Users/decid/AppData/Local/spt-core/deadline-26c873b1-8e04-4115-914c-01b58ea5eb1d.json"],"truncated":true,"resultLimitReached":100,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","meta":{"limits":{"resultLimit":{"reached":100,"suggestion":200}}}},"isError":false,"timestamp":1784293267059}}
{"type":"message","id":"f64341c6","parentId":"f6a05062","timestamp":"2026-07-17T13:01:15.454Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Fetching individual JSON states in parallel**"},{"type":"toolCall","id":"call_cigWI5PxOoePFVx6hOzBHLiA|fc_034a6be5a6696b6c016a5a279aa5d48191a973e898a3d7530f","name":"read","arguments":{"i":"Reading lia state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json","selector":"raw"}},{"type":"toolCall","id":"call_NxP4BEppPCnpXxF6MMaGWCkB|fc_034a6be5a6696b6c016a5a279aa5e88191af043d2342f7be2e","name":"read","arguments":{"i":"Reading webbie state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json","selector":"raw"}},{"type":"toolCall","id":"call_sQUZQBF1pyWohY1ykgdaMeKr|fc_034a6be5a6696b6c016a5a279aa5f48191a54a602b56734257","name":"read","arguments":{"i":"Reading perri state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json","selector":"raw"}},{"type":"toolCall","id":"call_IZ9gVgZ6blhn9rYv9jV60iPr|fc_034a6be5a6696b6c016a5a279aa6008191850803887832d92e","name":"read","arguments":{"i":"Reading todlando state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json","selector":"raw"}},{"type":"toolCall","id":"call_umXYRt6OoqGGAjTjR89xmVOM|fc_034a6be5a6696b6c016a5a279aa6088191bcc19492b4a294cc","name":"read","arguments":{"i":"Reading mobile gateway state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json","selector":"raw"}},{"type":"toolCall","id":"call_epbgvOklsyL6373QMBow6Buq|fc_034a6be5a6696b6c016a5a279aa6108191a144c4b8a9479a84","name":"read","arguments":{"i":"Reading live pulse work","path":"crates/spt-daemon/src/lifecycle.rs","selector":"580-680"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13474,"output":313,"cacheRead":131584,"cacheWrite":0,"totalTokens":145371,"reasoningTokens":45,"cost":{"input":0.06737,"output":0.00939,"cacheRead":0.065792,"cacheWrite":0,"total":0.142552}},"stopReason":"toolUse","timestamp":1784293267115,"responseId":"resp_034a6be5a6696b6c016a5a27938c888191b1f4ab54cfa3c812","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a2794e1e88191b1f0daea6da844bc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWieaFV26yKO_MXQVFzBPzQ0OUzHDK3YptMUpeQOjv6KNSa3oeczA7phw63y78J5KJ5pyHlJ4R8bPEke0sgW3HL9cQNvZqYufvklhHr8U2UwShSQ2-hItM3WHwGkBrtwc6sBIeu2M-GlmSP1OQ44rZcWs8omszAc8e8bidGd4HSfntLT9B2nWoklvgEvHAAZnw9jUN1i2HD78u8XWNNFrSFvv7uNCqF9QITHE8TnhDLxFxNmp_C0CkYdKqf8BYRbmJtPJ-cUavMgI4ax6ukEQvFKUoHKBo2egxr2Gh109mQJBn-duI_qWrfzit_g3I32b3zdHoXFsC3Quk1GvfaFSyHkIjdULLCmPu_m1EYwWC8VSjc4Ht2WF1rE92QCUEMUG1ao2u1WorUEonnHlVlK9opPXpgo2NW7hR9xBNvqzjkjtV5htgGU1VO-iQFmRxhtF4RaZeWigE7nQmYOQixSxHDanMXrICbzoNrn3sKFBqyQ1suLLB6IPM38V-f-CPKRh_JvHVXTop9u3jAG2rSNbj20YQc34F-cr3xtaDd1tYsQRwaeurFOEDKh2ZhXOvpNrUDaqyG1HK63xvffvWXgg9_u7xa7lBr7613gpglc7mCKgxH-T0dZ5jggONNnu0yB1nySauyfhvkPgW_h50equ64SDq8iY31UkyLw21rVFvgaVcDRqy0C4bJaLqRsWLAlT-3KmxHpKSsxNbTxcnHWn68EoSVQ5KxKwBz84eMg9g8i9beGq-z8jhil_Z0VixPmqEAGfjem9V3wO8v427AF3mbauNtUEJak2x9FGXlkOBricKuO9ug1wUHxe2WKJiy8yqc7XQU9EFdfSKwc8Ab2NgjSIcy4HanJgQZQC7IhsV6d-CBotRybDlfODLPe_0Fvfpv0urxe3GthS4dqhLF41JEWpJc85KM_7ZtAA0Zbr7N_D2xQkgD_PraeSTNIb42dAlCBpwZ1eAQCkJ_t1uWFc6rbl-yiuN2YcsIaYsGOROr_jlOjgsCSZ64dk2CoQEg5OaDPC61cmfKD05vn44kbkztbFon_6tPdn4aT73YRZ7OljvADLBHcEAHdNOYATZLRplhzWgyr41Eq78rtVDd1kEj9m3HhHUpxbZVXgFzjCG-3oe1DYd4HhAVdzmq4Drh-9vVdeKZVZqwI_o3W3ntOTp5jLRVKUxWDEKtr6_NTeXnUz2Jk=","summary":[{"type":"summary_text","text":"**Fetching individual JSON states in parallel**"}]},{"id":"fc_034a6be5a6696b6c016a5a279aa5d48191a973e898a3d7530f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading lia state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json\",\"selector\":\"raw\"}","call_id":"call_cigWI5PxOoePFVx6hOzBHLiA","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a279aa5e88191af043d2342f7be2e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading webbie state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json\",\"selector\":\"raw\"}","call_id":"call_NxP4BEppPCnpXxF6MMaGWCkB","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a279aa5f48191a54a602b56734257","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading perri state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json\",\"selector\":\"raw\"}","call_id":"call_sQUZQBF1pyWohY1ykgdaMeKr","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a279aa6008191850803887832d92e","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading todlando state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json\",\"selector\":\"raw\"}","call_id":"call_IZ9gVgZ6blhn9rYv9jV60iPr","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a279aa6088191bcc19492b4a294cc","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading mobile gateway state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json\",\"selector\":\"raw\"}","call_id":"call_umXYRt6OoqGGAjTjR89xmVOM","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a279aa6108191a144c4b8a9479a84","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading live pulse work\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":\"580-680\"}","call_id":"call_epbgvOklsyL6373QMBow6Buq","name":"read"}]},"duration":8337.788900002837,"ttft":1845.0335000008345,"contextSnapshot":{"promptTokens":145058,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_cigWI5PxOoePFVx6hOzBHLiA|fc_034a6be5a6696b6c016a5a279aa5d48191a973e898a3d7530f","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json"},"intent":"Reading lia state"},"id":"809813f8","parentId":"f64341c6","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_NxP4BEppPCnpXxF6MMaGWCkB|fc_034a6be5a6696b6c016a5a279aa5e88191af043d2342f7be2e","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json"},"intent":"Reading webbie state"},"id":"5e22867f","parentId":"809813f8","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_sQUZQBF1pyWohY1ykgdaMeKr|fc_034a6be5a6696b6c016a5a279aa5f48191a54a602b56734257","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json"},"intent":"Reading perri state"},"id":"3975212d","parentId":"5e22867f","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_IZ9gVgZ6blhn9rYv9jV60iPr|fc_034a6be5a6696b6c016a5a279aa6008191850803887832d92e","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json"},"intent":"Reading todlando state"},"id":"d541038d","parentId":"3975212d","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_umXYRt6OoqGGAjTjR89xmVOM|fc_034a6be5a6696b6c016a5a279aa6088191bcc19492b4a294cc","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json"},"intent":"Reading mobile gateway state"},"id":"067a5938","parentId":"d541038d","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_epbgvOklsyL6373QMBow6Buq|fc_034a6be5a6696b6c016a5a279aa6108191a144c4b8a9479a84","toolName":"read","startedAt":"2026-07-17T13:01:15.454Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Reading live pulse work"},"id":"9b8ee3b8","parentId":"067a5938","timestamp":"2026-07-17T13:01:15.454Z"}
{"type":"message","id":"42970cf2","parentId":"9b8ee3b8","timestamp":"2026-07-17T13:01:15.456Z","message":{"role":"toolResult","toolCallId":"call_cigWI5PxOoePFVx6hOzBHLiA|fc_034a6be5a6696b6c016a5a279aa5d48191a973e898a3d7530f","toolName":"read","content":[{"type":"text","text":"{\"id\":\"lia\",\"started\":\"1784292418\",\"pid\":41160,\"session_id\":\"5106270b-52d7-4a87-b78c-4edc06911b25\",\"state\":\"live_agent\",\"parent_pid\":26608,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"status\":\"online\",\"last_active_ms\":1784293270723,\"driven_by\":\"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\"controlled\":true,\"rest_state\":\"active\",\"resources\":\"Multipurpose subnet liaison for user Reavo.\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}"}],"details":{"displayContent":{"text":"{\"id\":\"lia\",\"started\":\"1784292418\",\"pid\":41160,\"session_id\":\"5106270b-52d7-4a87-b78c-4edc06911b25\",\"state\":\"live_agent\",\"parent_pid\":26608,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"status\":\"online\",\"last_active_ms\":1784293270723,\"driven_by\":\"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\"controlled\":true,\"rest_state\":\"active\",\"resources\":\"Multipurpose subnet liaison for user Reavo.\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json"}}},"isError":false,"timestamp":1784293275456}}
{"type":"message","id":"71e1167d","parentId":"42970cf2","timestamp":"2026-07-17T13:01:15.457Z","message":{"role":"toolResult","toolCallId":"call_NxP4BEppPCnpXxF6MMaGWCkB|fc_034a6be5a6696b6c016a5a279aa5e88191af043d2342f7be2e","toolName":"read","content":[{"type":"text","text":"{\"id\":\"webbie\",\"started\":\"1784265259\",\"pid\":74252,\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"state\":\"live_agent\",\"parent_pid\":81332,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"status\":\"offline\",\"last_active_ms\":1784292409012,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"BIGNET\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}"}],"details":{"displayContent":{"text":"{\"id\":\"webbie\",\"started\":\"1784265259\",\"pid\":74252,\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"state\":\"live_agent\",\"parent_pid\":81332,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"status\":\"offline\",\"last_active_ms\":1784292409012,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"BIGNET\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json"}}},"isError":false,"timestamp":1784293275457}}
{"type":"message","id":"3394f4ac","parentId":"71e1167d","timestamp":"2026-07-17T13:01:15.457Z","message":{"role":"toolResult","toolCallId":"call_sQUZQBF1pyWohY1ykgdaMeKr|fc_034a6be5a6696b6c016a5a279aa5f48191a54a602b56734257","toolName":"read","content":[{"type":"text","text":"{\"id\":\"perri\",\"started\":\"1784197646\",\"pid\":47752,\"session_id\":\"64b3da58-2f28-4411-9c1c-6cc102b8a1c8\",\"state\":\"live_agent\",\"parent_pid\":55836,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"status\":\"offline\",\"last_active_ms\":1784211191867,\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}"}],"details":{"displayContent":{"text":"{\"id\":\"perri\",\"started\":\"1784197646\",\"pid\":47752,\"session_id\":\"64b3da58-2f28-4411-9c1c-6cc102b8a1c8\",\"state\":\"live_agent\",\"parent_pid\":55836,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"status\":\"offline\",\"last_active_ms\":1784211191867,\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json"}}},"isError":false,"timestamp":1784293275457}}
{"type":"message","id":"40780dd0","parentId":"3394f4ac","timestamp":"2026-07-17T13:01:15.457Z","message":{"role":"toolResult","toolCallId":"call_IZ9gVgZ6blhn9rYv9jV60iPr|fc_034a6be5a6696b6c016a5a279aa6008191850803887832d92e","toolName":"read","content":[{"type":"text","text":"{\"id\":\"todlando\",\"started\":\"1784272381\",\"pid\":63588,\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"state\":\"ready_agent\",\"parent_pid\":77228,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"online\",\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}"}],"details":{"displayContent":{"text":"{\"id\":\"todlando\",\"started\":\"1784272381\",\"pid\":63588,\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"state\":\"ready_agent\",\"parent_pid\":77228,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"online\",\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json"}}},"isError":false,"timestamp":1784293275457}}
{"type":"message","id":"2f051c7b","parentId":"40780dd0","timestamp":"2026-07-17T13:01:15.457Z","message":{"role":"toolResult","toolCallId":"call_umXYRt6OoqGGAjTjR89xmVOM|fc_034a6be5a6696b6c016a5a279aa6088191bcc19492b4a294cc","toolName":"read","content":[{"type":"text","text":"{\"id\":\"mobile-gw\",\"started\":\"1784292416\",\"pid\":82604,\"session_id\":\"spt-mobile-host-75468\",\"state\":\"gateway\",\"parent_pid\":75468,\"cwd\":\"C:/Users/decid/Documents/projects\",\"controlled\":false,\"rest_state\":\"dormant\",\"dormant_since_ms\":1784185232433,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"mobile\",\"controllable\":false}"}],"details":{"displayContent":{"text":"{\"id\":\"mobile-gw\",\"started\":\"1784292416\",\"pid\":82604,\"session_id\":\"spt-mobile-host-75468\",\"state\":\"gateway\",\"parent_pid\":75468,\"cwd\":\"C:/Users/decid/Documents/projects\",\"controlled\":false,\"rest_state\":\"dormant\",\"dormant_since_ms\":1784185232433,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"mobile\",\"controllable\":false}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json"}}},"isError":false,"timestamp":1784293275457}}
{"type":"message","id":"8e48e75d","parentId":"2f051c7b","timestamp":"2026-07-17T13:01:15.476Z","message":{"role":"toolResult","toolCallId":"call_epbgvOklsyL6373QMBow6Buq|fc_034a6be5a6696b6c016a5a279aa6108191a144c4b8a9479a84","toolName":"read","content":[{"type":"text","text":"    /// Stamp this endpoint's `last_active_ms` recency marker (REQ-UPD-4) — the\n    /// signal the consent gate resolves \"most-recently-active live session\"\n    /// against ([`crate::consent::most_recently_active`]). Best-effort: a hosted\n    /// perch that has not been bound yet (no `info.json`) is silently skipped, so\n    /// a pre-bind tick never errors. Stamps the Self perch for this brain's id.\n    // [impl->REQ-UPD-4]\n    pub fn touch_active(&self) {\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        let _ = spt_store::info::set_last_active(&perch_path, now_ms());\n    }\n\n    /// One pulse tick (T5): refresh the activity stamp (REQ-UPD-4), ingest drops\n    /// from the watched dirs (T4), then if the echo-gate is armed fire exactly one\n    /// echo-commune (T3).\n    pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {\n        let now = now_ms();\n        // Recency follows the resting model (D9-2 — the D8 gap closed): only\n        // an ACTIVE (or pre-D9-2 recordless) instance refreshes\n        // `last_active_ms` — a resting seat ticking its pulse must never win\n        // a \"most-recently-active\" resolution (REQ-UPD-4's consent target,\n        // the notif first-fire). A dormant seat instead checks the opt-in\n        // auto-suspend threshold (counted from its dormancy-onset anchor);\n        // a suspended seat just keeps ingesting.\n        // [impl->REQ-INST-3]\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\n        match crate::resting::read_rest(&perch_path).map(|r| r.state) {\n            None | Some(crate::resting::RestState::Active) => self.touch_active(),\n            Some(crate::resting::RestState::Dormant) => {\n                let _ = self.rest_event(\n                    session_id,\n                    crate::resting::RestEvent::AutoSuspendTick { now_ms: now },\n                );\n            }\n            Some(crate::resting::RestState::Suspended) => {}\n        }\n        // Resolve drop dirs + project routing AT INGEST TIME against the endpoint's\n        // FRESH info.cwd (REQ-STORE-CONTEXT-BRANCH-FILL). A relative manifest drop dir\n        // (claude-spt's `.claude`) resolves against the endpoint's cwd — NEVER the\n        // daemon's process cwd (the pre-fix bug that left the two-tier store pristine).\n        // The project tier routes under the cwd-derived project_id, but an owlery-internal\n        // cwd (psyche-host) routes NO project (empty id → route_slices skips commit_project);\n        // the live/agent slice still commits. A relative dir with no recorded cwd is\n        // SKIPPED loud-once, never guessed.\n        // [impl->REQ-STORE-CONTEXT-BRANCH-FILL]\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\n        let owlery = perch::owlery_dir();\n        let project_id = match endpoint_cwd.as_deref() {\n            Some(cwd) if !is_owlery_internal(Path::new(cwd), &owlery) => {\n                spt_store::project::project_id_for_dir(Path::new(cwd))\n            }\n            _ => String::new(),\n        };\n        let cwd_path = endpoint_cwd.as_deref().map(Path::new);\n        let mut ingested = Vec::new();\n        for raw in self.drop_dirs() {\n            match resolve_endpoint_drop_dir(&raw, cwd_path) {\n                Some(dir) => {\n                    let mut got =\n                        ingest_drops(&dir, &self.id, &project_id, now, self.cfg.protection_window_ms)\n                            .map_err(|e| e.to_string())?;\n                    ingested.append(&mut got);\n                }\n                None => warn_no_cwd_once(&self.id, &raw),\n            }\n        }\n        // The echo-gate fire (F-030 W1): a fire now runs ONE bounded per-event\n        // psyche turn (`psyche_turn_and_relay` — the D7.5a driver) AND the commune-\n        // sync side-effect (`fire_echo`). The turn is the PRIMARY deliverable (parse\n        // + relay the psyche's outbound intents); it runs FIRST so the commune-sync\n        // below can never void an already-relayed turn. The commune-sync is NON-\n        // ATOMIC + LOUD: a failure is stderr-marked and counts a strike (via\n        // `turn_outcome`), but never undoes the turn's relay. A pulse fire has no\n        // inbound sender (`reply_to = None`) and feeds the minimal standing prompt —\n        // the composed mind rides the W2 reseed path, never every pulse.\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\n        let (echo_fired, turn_outcome) =\n            if spt_live::pulse::take_echo_gate(&self.id, ParentHint::Infer) {\n                let turn_res =\n                    self.run_psyche_event_turn(session_id, PSYCHE_PULSE_STANDING_PROMPT, None);\n                let commune_res = self.fire_echo(session_id);\n                if let Err(e) = &commune_res {\n                    eprintln!(\"PSYCHE_COMMUNE_SYNC_FAIL:{}: {e}\", self.id);\n                }\n                // A strike if EITHER leg failed; the reason names the failing leg.\n                // The turn's relay already happened above regardless of the commune.\n                let outcome = match (turn_res, commune_res) {\n                    (Ok(()), Ok(())) => Ok(()),\n                    (Err(e), _) => Err(format!(\"turn: {e}\")),\n                    (Ok(()), Err(e)) => Err(format!(\"commune-sync: {e}\")),\n                };\n                (true, Some(outcome))\n            } else {\n                (false, None)\n            };\n        Ok(TickReport {\n            ingested,\n            echo_fired,\n            turn_outcome,\n        })\n    }\n\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\n    /// each tick (so a caller — or a test — observes cadence and can decide to\n    /// stop). The period comes from the durable config, never a constant.\n    ///\n\n[Showing lines 579-683 of 2921. Use :684 to continue]"}],"details":{"truncation":{"content":"    /// Stamp this endpoint's `last_active_ms` recency marker (REQ-UPD-4) — the\r\n    /// signal the consent gate resolves \"most-recently-active live session\"\r\n    /// against ([`crate::consent::most_recently_active`]). Best-effort: a hosted\r\n    /// perch that has not been bound yet (no `info.json`) is silently skipped, so\r\n    /// a pre-bind tick never errors. Stamps the Self perch for this brain's id.\r\n    // [impl->REQ-UPD-4]\r\n    pub fn touch_active(&self) {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let _ = spt_store::info::set_last_active(&perch_path, now_ms());\r\n    }\r\n\r\n    /// One pulse tick (T5): refresh the activity stamp (REQ-UPD-4), ingest drops\r\n    /// from the watched dirs (T4), then if the echo-gate is armed fire exactly one\r\n    /// echo-commune (T3).\r\n    pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {\r\n        let now = now_ms();\r\n        // Recency follows the resting model (D9-2 — the D8 gap closed): only\r\n        // an ACTIVE (or pre-D9-2 recordless) instance refreshes\r\n        // `last_active_ms` — a resting seat ticking its pulse must never win\r\n        // a \"most-recently-active\" resolution (REQ-UPD-4's consent target,\r\n        // the notif first-fire). A dormant seat instead checks the opt-in\r\n        // auto-suspend threshold (counted from its dormancy-onset anchor);\r\n        // a suspended seat just keeps ingesting.\r\n        // [impl->REQ-INST-3]\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        match crate::resting::read_rest(&perch_path).map(|r| r.state) {\r\n            None | Some(crate::resting::RestState::Active) => self.touch_active(),\r\n            Some(crate::resting::RestState::Dormant) => {\r\n                let _ = self.rest_event(\r\n                    session_id,\r\n                    crate::resting::RestEvent::AutoSuspendTick { now_ms: now },\r\n                );\r\n            }\r\n            Some(crate::resting::RestState::Suspended) => {}\r\n        }\r\n        // Resolve drop dirs + project routing AT INGEST TIME against the endpoint's\r\n        // FRESH info.cwd (REQ-STORE-CONTEXT-BRANCH-FILL). A relative manifest drop dir\r\n        // (claude-spt's `.claude`) resolves against the endpoint's cwd — NEVER the\r\n        // daemon's process cwd (the pre-fix bug that left the two-tier store pristine).\r\n        // The project tier routes under the cwd-derived project_id, but an owlery-internal\r\n        // cwd (psyche-host) routes NO project (empty id → route_slices skips commit_project);\r\n        // the live/agent slice still commits. A relative dir with no recorded cwd is\r\n        // SKIPPED loud-once, never guessed.\r\n        // [impl->REQ-STORE-CONTEXT-BRANCH-FILL]\r\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\r\n        let owlery = perch::owlery_dir();\r\n        let project_id = match endpoint_cwd.as_deref() {\r\n            Some(cwd) if !is_owlery_internal(Path::new(cwd), &owlery) => {\r\n                spt_store::project::project_id_for_dir(Path::new(cwd))\r\n            }\r\n            _ => String::new(),\r\n        };\r\n        let cwd_path = endpoint_cwd.as_deref().map(Path::new);\r\n        let mut ingested = Vec::new();\r\n        for raw in self.drop_dirs() {\r\n            match resolve_endpoint_drop_dir(&raw, cwd_path) {\r\n                Some(dir) => {\r\n                    let mut got =\r\n                        ingest_drops(&dir, &self.id, &project_id, now, self.cfg.protection_window_ms)\r\n                            .map_err(|e| e.to_string())?;\r\n                    ingested.append(&mut got);\r\n                }\r\n                None => warn_no_cwd_once(&self.id, &raw),\r\n            }\r\n        }\r\n        // The echo-gate fire (F-030 W1): a fire now runs ONE bounded per-event\r\n        // psyche turn (`psyche_turn_and_relay` — the D7.5a driver) AND the commune-\r\n        // sync side-effect (`fire_echo`). The turn is the PRIMARY deliverable (parse\r\n        // + relay the psyche's outbound intents); it runs FIRST so the commune-sync\r\n        // below can never void an already-relayed turn. The commune-sync is NON-\r\n        // ATOMIC + LOUD: a failure is stderr-marked and counts a strike (via\r\n        // `turn_outcome`), but never undoes the turn's relay. A pulse fire has no\r\n        // inbound sender (`reply_to = None`) and feeds the minimal standing prompt —\r\n        // the composed mind rides the W2 reseed path, never every pulse.\r\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n        let (echo_fired, turn_outcome) =\r\n            if spt_live::pulse::take_echo_gate(&self.id, ParentHint::Infer) {\r\n                let turn_res =\r\n                    self.run_psyche_event_turn(session_id, PSYCHE_PULSE_STANDING_PROMPT, None);\r\n                let commune_res = self.fire_echo(session_id);\r\n                if let Err(e) = &commune_res {\r\n                    eprintln!(\"PSYCHE_COMMUNE_SYNC_FAIL:{}: {e}\", self.id);\r\n                }\r\n                // A strike if EITHER leg failed; the reason names the failing leg.\r\n                // The turn's relay already happened above regardless of the commune.\r\n                let outcome = match (turn_res, commune_res) {\r\n                    (Ok(()), Ok(())) => Ok(()),\r\n                    (Err(e), _) => Err(format!(\"turn: {e}\")),\r\n                    (Ok(()), Err(e)) => Err(format!(\"commune-sync: {e}\")),\r\n                };\r\n                (true, Some(outcome))\r\n            } else {\r\n                (false, None)\r\n            };\r\n        Ok(TickReport {\r\n            ingested,\r\n            echo_fired,\r\n            turn_outcome,\r\n        })\r\n    }\r\n\r\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\r\n    /// each tick (so a caller — or a test — observes cadence and can decide to\r\n    /// stop). The period comes from the durable config, never a constant.\r\n    ///\r","truncated":true,"truncatedBy":"lines","totalLines":2343,"totalBytes":5942,"outputLines":105,"outputBytes":5942,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    /// Stamp this endpoint's `last_active_ms` recency marker (REQ-UPD-4) — the\r\n    /// signal the consent gate resolves \"most-recently-active live session\"\r\n    /// against ([`crate::consent::most_recently_active`]). Best-effort: a hosted\r\n    /// perch that has not been bound yet (no `info.json`) is silently skipped, so\r\n    /// a pre-bind tick never errors. Stamps the Self perch for this brain's id.\r\n    // [impl->REQ-UPD-4]\r\n    pub fn touch_active(&self) {\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        let _ = spt_store::info::set_last_active(&perch_path, now_ms());\r\n    }\r\n\r\n    /// One pulse tick (T5): refresh the activity stamp (REQ-UPD-4), ingest drops\r\n    /// from the watched dirs (T4), then if the echo-gate is armed fire exactly one\r\n    /// echo-commune (T3).\r\n    pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {\r\n        let now = now_ms();\r\n        // Recency follows the resting model (D9-2 — the D8 gap closed): only\r\n        // an ACTIVE (or pre-D9-2 recordless) instance refreshes\r\n        // `last_active_ms` — a resting seat ticking its pulse must never win\r\n        // a \"most-recently-active\" resolution (REQ-UPD-4's consent target,\r\n        // the notif first-fire). A dormant seat instead checks the opt-in\r\n        // auto-suspend threshold (counted from its dormancy-onset anchor);\r\n        // a suspended seat just keeps ingesting.\r\n        // [impl->REQ-INST-3]\r\n        let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);\r\n        match crate::resting::read_rest(&perch_path).map(|r| r.state) {\r\n            None | Some(crate::resting::RestState::Active) => self.touch_active(),\r\n            Some(crate::resting::RestState::Dormant) => {\r\n                let _ = self.rest_event(\r\n                    session_id,\r\n                    crate::resting::RestEvent::AutoSuspendTick { now_ms: now },\r\n                );\r\n            }\r\n            Some(crate::resting::RestState::Suspended) => {}\r\n        }\r\n        // Resolve drop dirs + project routing AT INGEST TIME against the endpoint's\r\n        // FRESH info.cwd (REQ-STORE-CONTEXT-BRANCH-FILL). A relative manifest drop dir\r\n        // (claude-spt's `.claude`) resolves against the endpoint's cwd — NEVER the\r\n        // daemon's process cwd (the pre-fix bug that left the two-tier store pristine).\r\n        // The project tier routes under the cwd-derived project_id, but an owlery-internal\r\n        // cwd (psyche-host) routes NO project (empty id → route_slices skips commit_project);\r\n        // the live/agent slice still commits. A relative dir with no recorded cwd is\r\n        // SKIPPED loud-once, never guessed.\r\n        // [impl->REQ-STORE-CONTEXT-BRANCH-FILL]\r\n        let endpoint_cwd = spt_store::info::read_info(&perch_path).and_then(|i| i.cwd);\r\n        let owlery = perch::owlery_dir();\r\n        let project_id = match endpoint_cwd.as_deref() {\r\n            Some(cwd) if !is_owlery_internal(Path::new(cwd), &owlery) => {\r\n                spt_store::project::project_id_for_dir(Path::new(cwd))\r\n            }\r\n            _ => String::new(),\r\n        };\r\n        let cwd_path = endpoint_cwd.as_deref().map(Path::new);\r\n        let mut ingested = Vec::new();\r\n        for raw in self.drop_dirs() {\r\n            match resolve_endpoint_drop_dir(&raw, cwd_path) {\r\n                Some(dir) => {\r\n                    let mut got =\r\n                        ingest_drops(&dir, &self.id, &project_id, now, self.cfg.protection_window_ms)\r\n                            .map_err(|e| e.to_string())?;\r\n                    ingested.append(&mut got);\r\n                }\r\n                None => warn_no_cwd_once(&self.id, &raw),\r\n            }\r\n        }\r\n        // The echo-gate fire (F-030 W1): a fire now runs ONE bounded per-event\r\n        // psyche turn (`psyche_turn_and_relay` — the D7.5a driver) AND the commune-\r\n        // sync side-effect (`fire_echo`). The turn is the PRIMARY deliverable (parse\r\n        // + relay the psyche's outbound intents); it runs FIRST so the commune-sync\r\n        // below can never void an already-relayed turn. The commune-sync is NON-\r\n        // ATOMIC + LOUD: a failure is stderr-marked and counts a strike (via\r\n        // `turn_outcome`), but never undoes the turn's relay. A pulse fire has no\r\n        // inbound sender (`reply_to = None`) and feeds the minimal standing prompt —\r\n        // the composed mind rides the W2 reseed path, never every pulse.\r\n        // [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]\r\n        let (echo_fired, turn_outcome) =\r\n            if spt_live::pulse::take_echo_gate(&self.id, ParentHint::Infer) {\r\n                let turn_res =\r\n                    self.run_psyche_event_turn(session_id, PSYCHE_PULSE_STANDING_PROMPT, None);\r\n                let commune_res = self.fire_echo(session_id);\r\n                if let Err(e) = &commune_res {\r\n                    eprintln!(\"PSYCHE_COMMUNE_SYNC_FAIL:{}: {e}\", self.id);\r\n                }\r\n                // A strike if EITHER leg failed; the reason names the failing leg.\r\n                // The turn's relay already happened above regardless of the commune.\r\n                let outcome = match (turn_res, commune_res) {\r\n                    (Ok(()), Ok(())) => Ok(()),\r\n                    (Err(e), _) => Err(format!(\"turn: {e}\")),\r\n                    (Ok(()), Err(e)) => Err(format!(\"commune-sync: {e}\")),\r\n                };\r\n                (true, Some(outcome))\r\n            } else {\r\n                (false, None)\r\n            };\r\n        Ok(TickReport {\r\n            ingested,\r\n            echo_fired,\r\n            turn_outcome,\r\n        })\r\n    }\r\n\r\n    /// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after\r\n    /// each tick (so a caller — or a test — observes cadence and can decide to\r\n    /// stop). The period comes from the durable config, never a constant.\r\n    ///\r","startLine":579,"lineNumbers":[579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2921,"totalBytes":5942,"outputLines":105,"outputBytes":5942,"shownRange":{"start":579,"end":683},"nextOffset":684}}},"isError":false,"timestamp":1784293275476}}
{"type":"message","id":"59339d34","parentId":"8e48e75d","timestamp":"2026-07-17T13:01:34.994Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing periodic agent pulse behavior**\n\n**Investigating brain pump periodic CPU bursts**"},{"type":"toolCall","id":"call_maHEtwxd31QXMIotapuGauYt|fc_034a6be5a6696b6c016a5a27ae70d08191aa57020f83c86972","name":"read","arguments":{"i":"Reading lia pulse anchor","path":"C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json","selector":"raw"}},{"type":"toolCall","id":"call_GXSS1yeQZTjX2550gsDdPVxu|fc_034a6be5a6696b6c016a5a27ae70e0819186c18fd4a869cc7e","name":"grep","arguments":{"i":"Finding lia pulse events","pattern":"lia|PSYCHE|INGEST|COMMUNE|last_active","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-4898","case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_5T4dABbujnPGRjzAFfeVAUWy|fc_034a6be5a6696b6c016a5a27ae70ec81919ad4fb11a671d7e0","name":"grep","arguments":{"i":"Locating manifest hash reload","pattern":"manifest_disk_hash|reload_manifest_if_changed|drop_dirs\\(","path":"crates/spt-daemon/src/lifecycle.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_k5fOsFzPS2NhEU3ulDxW2PX7|fc_034a6be5a6696b6c016a5a27ae70f481919648e58456abc3c0","name":"grep","arguments":{"i":"Locating ingest drops complexity","pattern":"pub fn ingest_drops|fn ingest_drops|read_dir|for entry|walk","path":"crates/spt-daemon/src;crates/spt-live/src;crates/spt-store/src","selector":null,"case":false,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5713,"output":741,"cacheRead":141824,"cacheWrite":0,"totalTokens":148278,"reasoningTokens":435,"cost":{"input":0.028565000000000004,"output":0.02223,"cacheRead":0.070912,"cacheWrite":0,"total":0.12170700000000001}},"stopReason":"toolUse","timestamp":1784293275523,"responseId":"resp_034a6be5a6696b6c016a5a279be7348191a07489b50bfc7f30","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a279d58f881919a3dff188570fc05","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWieutoB6OvwMC47yk_u-M3QujLkUndbOiXTUcd9aAGDIuBakYOgXbP69FWLaHG17p1X8Ch1TYsWx04-_HwBX6ESl-teN29wcF5nMysTdImPk18wfVBLbkeRzbwHgONPMDRRT3Lo5ntMBFG2ezgRAVmE3OsQdNzc3_JHFzeNuY-PCUodr3K0MB6krIOdnG7nI9JrvrSXlJNDaAz0K8KFQxdTpRG1d5vxLN_qaohE7OiyEwMUMU0pSr-Nv68iyaqqFU5uSXlp2RMtOXK8EbsU7kBxkHzawUnrsPZrGPl8gMRC5iTo_qcL4bGkbeUc3jeK6UHrj0z7FG9-if-xo3MoRSiVnrYBk6ZEqJh3iHwwWm0kDajTvAC8ouVM7-gAA5Y-fVPyNCl-NFLow2ae7FYF_5GONbytQfrBobdh_Aq7ddb8Uj3CrvV-RabsHt6c8VQzuYToGjz8jdVRi7ErNreChe0St2EZPkntF1ka1PYPzIKQNxqtu_xuRTOIEefocJz_0OsYOwsAKvje3HtaDn7O26BO2Jl0S7F4NI8xyVGXuUyp1ix9J0CkFCRnR8tleot6S0rFLZkOa5Dah0phQ9U4-Ql8hCcrm0X_HShLY6zEpzrW9vwjJcnS79vvo47UURyo6kbQkc8yQPtSb1zA9JESdnE4NFn8LhNieY2C6d5RFtwhnUxFyTIaeIgDZgheaRGOfYebp59A-mTsfFoZ083l8LAtmaMMr4Tb5J7LeqmPrszdp8hOXr1DZRohFK5fz2Cq9DJKW7DW4xlrSqeeWN6tDcS8LuTknAG9zlF5Ua6OtPQH9Fle4cMWbIaKWi1Tk5m32M9HiqnuOUUxqOE_bI4etSP61kGrEdJlqYJx1JS1dm4z_333p7YqRveUEH86UkF9laCqNdwCLTO6_qf6MHopZqE_Uw1hQjbNAaKy8LoUoXbjjTAj1mW_P5jD6YyC-KZSK-sRvhkHOj8gwYcjogJRb1Egz1ntw4rFeLbleVwvp3pxmEnhmqLyB8nYmqPv-VbfUFZ9PhCZuynq1lUtTdAG5GXrFxGJ2bR6G6es3nkItKSi2c_pz7WbWXkEgrMQw05QqeuyzNAebL4HbG026mz0R57YgkkulwsZeSrKFlz_br-Tla7oxWN7NJ3_F5lPCgQ0VkZjTKjCt1x350acFhVxaxwcVFbcp9cnuUkhn8mjkLvKMqACoybcFhuJ2FHTdejw-jGe33ASrlpeBcMvNYk-9jWXaqIBOCXvGl1IK7Df6VFeVEF8hX9mMSYeo4ogp5C6x7d6c1mu6sU5UcY9HxKqWQKDrBy3HNKIdnWXVML3dOhaRdnOSixxjMwUT1rgX0FZtFcSihYxTfKohoBhtNVfRUaqoBRRhv04Q_wAFtrtjOlR_nrixnX_PlI3mSjZhj2Osfx7Eu-zee_YL97v7QuvTlyubyjKLT-hCdpn-RH5SNosTxcG4_aqCwdHNQj-1feWHatLopNNl2DlJqvWRdlV01d4X6XGVMfS8nwRW6w9ObDsjYqQq8nstw4WS0p2BgDrVje17Gyv5lF5eeD1mlQsL5y-mx4EavWXG1W6ancMIcZFHoLfHF15O2SUqoaAfcAlmB_S3KhY2Muo8WF7gy1tQsyV09CnhGp8ErTNanvd7-_KPmg05Nyr-zL8XHFAHvnDTQc8bnDqqZHjaJbbuva8AWK-s9IBcJdycoEdnvsEh80Msk1WK6hZtsbsEn1yoVQyoP3U--0PwcukfbnV1IxtxdHsds487etbvc6K9OobhLEnELakpoAbHklhRPDujy2Zm3sGGeDjJBxG3OXTiE00DJkCYQ1h1H5eokKPjMSROTH4nFNgXQGuUav6z1iAy7rUTrXVihUSnghoKXAU9a3K5NmUq7mU6oVhBAtfLlU1ESYZCZ1HKwAtnV6YpBlg1YpaD4JqwuPsba_ZevgQWmg9WdolE5ttILm65OEUr0MHdxjEWTH8xi3OdONncTCGg2wGpyePwo8JERQy5GxlRUoCSKSSOsR1uHmEJshn2xlH2zYYNHMUtlmJ_1Q1NdtihdJqbSxKg7Jk1r4ztSxmmmG4DVPFNIFfXU7EpOxIKepYG-tmEnO2LR8msNwdn8bEGHP1iZFbNrsR-OQWz_bk3edRSXXyImQLaIIAjIs21A-r1JYIe3-ssFVEPkV9TLpG32LnMdwu-4TMOt-miavfleMknLwlqk-JNPdBd8MrRrHnbw86ltn_fPVHPVv35wYfrGYTXpT2it5XdJtquky3wStIP98NXzkuTqxVa1q8VZBAbEBmdIZm3jn510kHlGRnrA2NWBafmtLYR3DIAM8bXy3UqA5XOS7vvrz9dEmZXTxzbz8HDyL1FXFkxK_r-BhU7th8kayQxSud43W3Y6x9-O-mbDiuYYqAOEwDCEvzfmX3oOoY3ff-j2c72bCvqA17vW31v_qlkiSzXG-Ezm-NVWpopeCa4vRP--Rb0nK765sjOAzbzwagHCp4f91rGOTfC0_fn2WcQAyI2mblehSNu3Rw9cgJC3uux9kXY9IYrN8T9eKeb4ofseFzN1B5hw7OJsEzMs35kfD8YkKRnfN1hn1mRFSc6B4HsuFwblRekD4CHd7VGpTWeciKkNZVbJTolvDVVyxUfzuf6Clxlco50GEaJmqqY_VoHeSqnz9yyuM0p3WeM9P8M05TJUENHQwAtP1tSkVPRNon4kZHNRw5MqUW4WWM6qvTP5CmsoL_EXip61xaTWPUsaYULGKEgMJiLArhtjETW_ZB9tfMubToWal6es8nWvLRiJTSVpPVWRD09p48xesGHRXqa5J57NVcAlrizlp7pd4B2NkrJTFZ1_-waqTfzWi_EqCOr3DaHrowFwHpGFYp-PzbstM2m2nHwTqJiy7a7Gr7AQjLyQjhiDXnv-_PnrLlwpz3oyBTOLOJRqpMXnf33Vf-9Un5d8v4DS1lvg-YdxQ-8rldfvhIM9GGHJ6OMngBE68O3-ZcnnYNka9CU-POAx_9g4S_Cnz6ZP-tun349faS_zYx9XMIxzKJsm5hHky_obT3vaaitDSK09Ta1g6r09gHupRgzoX7zcKzl4zp8PlqNRkUxuXTTtiV1N5SitQd1s3BjmEKrIDv8UltCnOs5z7jutyCb1vRzvEdR8kmFXhGgfRNMEOQspg2hPlR2hULw1_aMpq-rjd7UbXbats9EJ9wab57thYgWODAYyy2N-xihEEhEOrZt11637ZX5eAQYs8BATNL22reuI5Z25E13ZNPssHAQBssHkXpjwNzOS99L_plh3pzJIy_mTD03efeliA1lHGVo1REKKUyLK66LP-uoCWJdD5jR9jY9VGnS9MfUrK4l6Oyy5aj1kXOtEoBmbHSUmO9D0SV0kLinflXHgxAKQcJjJkPK1Sz0L-UWMVCXazPIMG-XSQyrObPvydZq-9Ug4hP6yIOPDBNw7Etqe4geJEn5vm5DnOpRrKgkzh_aKQ9sDZYe0zZbqa9aiQ==","summary":[{"type":"summary_text","text":"**Analyzing periodic agent pulse behavior**"},{"type":"summary_text","text":"**Investigating brain pump periodic CPU bursts**"}]},{"id":"fc_034a6be5a6696b6c016a5a27ae70d08191aa57020f83c86972","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading lia pulse anchor\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json\",\"selector\":\"raw\"}","call_id":"call_maHEtwxd31QXMIotapuGauYt","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27ae70e0819186c18fd4a869cc7e","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding lia pulse events\",\"pattern\":\"lia|PSYCHE|INGEST|COMMUNE|last_active\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-4898\",\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_GXSS1yeQZTjX2550gsDdPVxu","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27ae70ec81919ad4fb11a671d7e0","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating manifest hash reload\",\"pattern\":\"manifest_disk_hash|reload_manifest_if_changed|drop_dirs\\\\(\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_5T4dABbujnPGRjzAFfeVAUWy","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27ae70f481919648e58456abc3c0","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating ingest drops complexity\",\"pattern\":\"pub fn ingest_drops|fn ingest_drops|read_dir|for entry|walk\",\"path\":\"crates/spt-daemon/src;crates/spt-live/src;crates/spt-store/src\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_k5fOsFzPS2NhEU3ulDxW2PX7","name":"grep"}]},"duration":19462.95600000024,"ttft":1901.5109999924898,"contextSnapshot":{"promptTokens":147537,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_maHEtwxd31QXMIotapuGauYt|fc_034a6be5a6696b6c016a5a27ae70d08191aa57020f83c86972","toolName":"read","startedAt":"2026-07-17T13:01:34.994Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json"},"intent":"Reading lia pulse anchor"},"id":"0b3ea2e5","parentId":"59339d34","timestamp":"2026-07-17T13:01:34.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GXSS1yeQZTjX2550gsDdPVxu|fc_034a6be5a6696b6c016a5a27ae70e0819186c18fd4a869cc7e","toolName":"grep","startedAt":"2026-07-17T13:01:34.994Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding lia pulse events"},"id":"d3d40c88","parentId":"0b3ea2e5","timestamp":"2026-07-17T13:01:34.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5T4dABbujnPGRjzAFfeVAUWy|fc_034a6be5a6696b6c016a5a27ae70ec81919ad4fb11a671d7e0","toolName":"grep","startedAt":"2026-07-17T13:01:34.994Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Locating manifest hash reload"},"id":"28d4f5ec","parentId":"d3d40c88","timestamp":"2026-07-17T13:01:34.994Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_k5fOsFzPS2NhEU3ulDxW2PX7|fc_034a6be5a6696b6c016a5a27ae70f481919648e58456abc3c0","toolName":"grep","startedAt":"2026-07-17T13:01:34.995Z","args":{"path":"crates/spt-daemon/src;crates/spt-live/src;crates/spt-store/src"},"intent":"Locating ingest drops complexity"},"id":"bcc435c6","parentId":"28d4f5ec","timestamp":"2026-07-17T13:01:34.995Z"}
{"type":"message","id":"f56bd17a","parentId":"bcc435c6","timestamp":"2026-07-17T13:01:35.005Z","message":{"role":"toolResult","toolCallId":"call_5T4dABbujnPGRjzAFfeVAUWy|fc_034a6be5a6696b6c016a5a27ae70ec81919ad4fb11a671d7e0","toolName":"grep","content":[{"type":"text","text":" 451|    /// Refresh this endpoint's manifest + runtime in place — a thin delegate to\n*452|    /// the shared cell. The production trigger is [`reload_manifest_if_changed`]\n 453|    /// (the brain pulling an on-disk swap); this direct entry exists for tests and\n 454|    /// any in-process caller. Brain-parity: nothing else cycles. (W3c)\n 455|    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n...\n 463|    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n*464|    fn manifest_disk_hash(&self) -> Option<String> {\n 465|        let dir = self.install_dir.as_ref()?;\n 466|        let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;\n 467|        Some(crate::release::sha256_hex(&bytes))\n...\n 482|    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n*483|    fn reload_manifest_if_changed(&self, last: &mut Option<String>) {\n 484|        let Some(dir) = self.install_dir.as_ref() else {\n 485|            return;\n 486|        };\n...\n 540|    /// The unique watched drop dirs (commune + signoff; usually the same dir).\n*541|    fn drop_dirs(&self) -> Vec<PathBuf> {\n 542|        let mut dirs: Vec<PathBuf> = Vec::new();\n 543|        for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]\n 544|            .into_iter()\n...\n 632|        let mut ingested = Vec::new();\n*633|        for raw in self.drop_dirs() {\n 634|            match resolve_endpoint_drop_dir(&raw, cwd_path) {\n 635|                Some(dir) => {\n 636|                    let mut got =\n...\n 724|        // the initial state.\n*725|        let mut manifest_hash = self.manifest_disk_hash();\n 726|        // F-030 W1: consecutive per-event turn-failure count (C3(b) budget). Lives\n 727|        // in the loop's local state — the loop is per-endpoint + single-threaded, so\n 728|        // this is the simplest correct home (no lock, no cross-endpoint bleed).\n...\n 740|            // tick (psyche turn / echo) runs against the fresh manifest. (W3c)\n*741|            self.reload_manifest_if_changed(&mut manifest_hash);\n 742|            match self.pulse_tick(session_id) {\n 743|                Ok(report) => {\n 744|                    // F-030 W1: feed a fired turn's outcome to the failure budget.\n...\n 2771|\n*2772|            let mut last = host.manifest_disk_hash();\n 2773|            assert!(last.is_some(), \"seeded last from the on-disk v1\");\n 2774|            assert_eq!(\n 2775|                host.cell.manifest_snapshot().adapter.version,\n...\n 2781|            seed_install_manifest(install.path(), drops.path(), \"2\");\n*2782|            let new_hash = host.manifest_disk_hash();\n*2783|            host.reload_manifest_if_changed(&mut last);\n 2784|\n 2785|            assert_eq!(\n 2786|                host.cell.manifest_snapshot().adapter.version,\n...\n 2817|\n*2818|            let seeded = host.manifest_disk_hash();\n 2819|            let mut last = seeded.clone();\n 2820|\n 2821|            // No write between seed and poll.\n*2822|            host.reload_manifest_if_changed(&mut last);\n 2823|\n 2824|            assert_eq!(\n 2825|                host.cell.manifest_snapshot().adapter.version,\n...\n 2851|\n*2852|            let seeded = host.manifest_disk_hash();\n 2853|            let mut last = seeded.clone();\n 2854|\n 2855|            // Garbage: not valid TOML / not a valid manifest.\n...\n 2860|            .unwrap();\n*2861|            host.reload_manifest_if_changed(&mut last);\n 2862|\n 2863|            assert_eq!(\n 2864|                host.cell.manifest_snapshot().adapter.version,\n...\n 2874|            seed_install_manifest(install.path(), drops.path(), \"2\");\n*2875|            host.reload_manifest_if_changed(&mut last);\n 2876|            assert_eq!(\n 2877|                host.cell.manifest_snapshot().adapter.version,\n 2878|                \"2\",\n...\n 2880|            );\n*2881|            assert_eq!(last, host.manifest_disk_hash(), \"and `last` finally advances\");\n 2882|        });\n 2883|    }\n 2884|\n...\n 2897|            assert!(\n*2898|                host.manifest_disk_hash().is_none(),\n 2899|                \"no install dir ⇒ no disk hash\"\n 2900|            );\n 2901|\n 2902|            let mut last: Option<String> = None;\n*2903|            host.reload_manifest_if_changed(&mut last);\n 2904|\n 2905|            assert_eq!(last, None, \"no install dir ⇒ `last` stays None (clean no-op)\");\n 2906|            assert_eq!("}],"details":{"scopePath":"crates/spt-daemon/src/lifecycle.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":18,"fileCount":1,"files":["crates/spt-daemon/src/lifecycle.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/lifecycle.rs","count":18}],"truncated":false,"displayContent":"  451│    /// Refresh this endpoint's manifest + runtime in place — a thin delegate to\n *452│    /// the shared cell. The production trigger is [`reload_manifest_if_changed`]\n  453│    /// (the brain pulling an on-disk swap); this direct entry exists for tests and\n  454│    /// any in-process caller. Brain-parity: nothing else cycles. (W3c)\n  455│    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n     │...\n  463│    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n *464│    fn manifest_disk_hash(&self) -> Option<String> {\n  465│        let dir = self.install_dir.as_ref()?;\n  466│        let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;\n  467│        Some(crate::release::sha256_hex(&bytes))\n     │...\n  482│    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n *483│    fn reload_manifest_if_changed(&self, last: &mut Option<String>) {\n  484│        let Some(dir) = self.install_dir.as_ref() else {\n  485│            return;\n  486│        };\n     │...\n  540│    /// The unique watched drop dirs (commune + signoff; usually the same dir).\n *541│    fn drop_dirs(&self) -> Vec<PathBuf> {\n  542│        let mut dirs: Vec<PathBuf> = Vec::new();\n  543│        for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]\n  544│            .into_iter()\n     │...\n  632│        let mut ingested = Vec::new();\n *633│        for raw in self.drop_dirs() {\n  634│            match resolve_endpoint_drop_dir(&raw, cwd_path) {\n  635│                Some(dir) => {\n  636│                    let mut got =\n     │...\n  724│        // the initial state.\n *725│        let mut manifest_hash = self.manifest_disk_hash();\n  726│        // F-030 W1: consecutive per-event turn-failure count (C3(b) budget). Lives\n  727│        // in the loop's local state — the loop is per-endpoint + single-threaded, so\n  728│        // this is the simplest correct home (no lock, no cross-endpoint bleed).\n     │...\n  740│            // tick (psyche turn / echo) runs against the fresh manifest. (W3c)\n *741│            self.reload_manifest_if_changed(&mut manifest_hash);\n  742│            match self.pulse_tick(session_id) {\n  743│                Ok(report) => {\n  744│                    // F-030 W1: feed a fired turn's outcome to the failure budget.\n     │...\n 2771│\n*2772│            let mut last = host.manifest_disk_hash();\n 2773│            assert!(last.is_some(), \"seeded last from the on-disk v1\");\n 2774│            assert_eq!(\n 2775│                host.cell.manifest_snapshot().adapter.version,\n     │...\n 2781│            seed_install_manifest(install.path(), drops.path(), \"2\");\n*2782│            let new_hash = host.manifest_disk_hash();\n*2783│            host.reload_manifest_if_changed(&mut last);\n 2784│\n 2785│            assert_eq!(\n 2786│                host.cell.manifest_snapshot().adapter.version,\n     │...\n 2817│\n*2818│            let seeded = host.manifest_disk_hash();\n 2819│            let mut last = seeded.clone();\n 2820│\n 2821│            // No write between seed and poll.\n*2822│            host.reload_manifest_if_changed(&mut last);\n 2823│\n 2824│            assert_eq!(\n 2825│                host.cell.manifest_snapshot().adapter.version,\n     │...\n 2851│\n*2852│            let seeded = host.manifest_disk_hash();\n 2853│            let mut last = seeded.clone();\n 2854│\n 2855│            // Garbage: not valid TOML / not a valid manifest.\n     │...\n 2860│            .unwrap();\n*2861│            host.reload_manifest_if_changed(&mut last);\n 2862│\n 2863│            assert_eq!(\n 2864│                host.cell.manifest_snapshot().adapter.version,\n     │...\n 2874│            seed_install_manifest(install.path(), drops.path(), \"2\");\n*2875│            host.reload_manifest_if_changed(&mut last);\n 2876│            assert_eq!(\n 2877│                host.cell.manifest_snapshot().adapter.version,\n 2878│                \"2\",\n     │...\n 2880│            );\n*2881│            assert_eq!(last, host.manifest_disk_hash(), \"and `last` finally advances\");\n 2882│        });\n 2883│    }\n 2884│\n     │...\n 2897│            assert!(\n*2898│                host.manifest_disk_hash().is_none(),\n 2899│                \"no install dir ⇒ no disk hash\"\n 2900│            );\n 2901│\n 2902│            let mut last: Option<String> = None;\n*2903│            host.reload_manifest_if_changed(&mut last);\n 2904│\n 2905│            assert_eq!(last, None, \"no install dir ⇒ `last` stays None (clean no-op)\");\n 2906│            assert_eq!("},"isError":false,"timestamp":1784293295005}}
{"type":"message","id":"d1c84737","parentId":"f56bd17a","timestamp":"2026-07-17T13:01:35.006Z","message":{"role":"toolResult","toolCallId":"call_GXSS1yeQZTjX2550gsDdPVxu|fc_034a6be5a6696b6c016a5a27ae70e0819186c18fd4a869cc7e","toolName":"grep","content":[{"type":"text","text":" 1002|CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1003|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1005|BRAIN_RESTART: planned update respawn (generation 1)\n*1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1007|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008|=== spt brain stderr — generation 1 — pid 76764 ===\n 1009|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n 1010|CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1024|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1025|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1026|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n*1027|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1028|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 1029|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1030|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1031|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":7,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":7}],"truncated":false,"displayContent":" 1002│CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1003│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 1004│CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1005│BRAIN_RESTART: planned update respawn (generation 1)\n*1006│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1007│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008│=== spt brain stderr — generation 1 — pid 76764 ===\n 1009│BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 76764, generation 1, start-reason update)\n 1010│CONN_LIFECYCLE: conn=405 role=brain wall_ms=1784292560293 mono_ms=145929 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1024│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1025│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1026│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]\n*1027│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n*1028│CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]\n 1029│CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1030│CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1031│CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293295006}}
{"type":"message","id":"14b4e825","parentId":"d1c84737","timestamp":"2026-07-17T13:01:35.007Z","message":{"role":"toolResult","toolCallId":"call_maHEtwxd31QXMIotapuGauYt|fc_034a6be5a6696b6c016a5a27ae70d08191aa57020f83c86972","toolName":"read","content":[{"type":"text","text":"{\"anchor_ms\":1784292415570,\"interval_ms\":5000}"}],"details":{"displayContent":{"text":"{\"anchor_ms\":1784292415570,\"interval_ms\":5000}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json"}}},"isError":false,"timestamp":1784293295007}}
{"type":"message","id":"dbd7a02b","parentId":"14b4e825","timestamp":"2026-07-17T13:01:35.025Z","message":{"role":"toolResult","toolCallId":"call_k5fOsFzPS2NhEU3ulDxW2PX7|fc_034a6be5a6696b6c016a5a27ae70f481919648e58456abc3c0","toolName":"grep","content":[{"type":"text","text":"# crates/\n\n## spt-daemon/src/\n### autostart.rs\n 45|    let node_label = spt_store::hostlabel::node_fill_label(None);\n*46|    for entry in entries {\n 47|        // Re-resolve the adapter option fresh (an adapter updated between\n 48|        // restarts is honored; an uninstalled one is a loud skip, never a wedge).\n 49|        let (record, manifest) =\n### broker.rs\n 284|/// The impure probe feeding [`zombie_verdict`] for a claimed live session —\n*285|/// runs OFF every broker lock (a process-table walk is real work; KH 7.12).\n 286|/// `spawned_ms_ago` comes from the session's `spawned_at`; callers on the\n 287|/// KIND_SESSIONS reply use the additive `SessionInfo` fields, so the CLI\n 288|/// preflight and the broker gate consult the SAME authority.\n### crc_swap.rs\n 31|\n*32|/// Walk `staging` and return the files whose content differs from their\n 33|/// `install_dir` counterpart — or that are absent in `install_dir`. Files whose\n 34|/// content is byte-identical are skipped, so a still-running unchanged binary is\n 35|/// never disturbed. Read-only: does not mutate either tree. The returned plan is\n...\n 52|) -> std::io::Result<()> {\n*53|    for entry in std::fs::read_dir(dir)? {\n 54|        let entry = entry?;\n 55|        let path = entry.path();\n 56|        if path.is_dir() {\n...\n 226|    let dashed = format!(\"{base}-\");\n*227|    let Ok(entries) = std::fs::read_dir(dir) else {\n 228|        return;\n 229|    };\n*230|    for entry in entries.flatten() {\n 231|        if let Some(name) = entry.file_name().to_str() {\n 232|            if name == base || name.starts_with(&dashed) {\n 233|                let _ = std::fs::remove_file(entry.path());\n...\n 302|        let mut found = false;\n*303|        fn walk(dir: &Path, found: &mut bool) {\n*304|            for entry in fs::read_dir(dir).unwrap() {\n 305|                let path = entry.unwrap().path();\n 306|                if path.is_dir() {\n*307|                    walk(&path, found);\n 308|                    continue;\n 309|                }\n 310|                if let Some(ext) = path.extension() {\n...\n 316|        }\n*317|        walk(dir, &mut found);\n 318|        found\n 319|    }\n 320|\n...\n 353|\n*354|    /// The walk recurses into nested directories and reports the correct nested\n 355|    /// `rel` (so a changed file deep in the tree is found, not just top-level).\n 356|    // [unit->REQ-ADAPTER-LIVE-UPDATE]\n 357|    #[test]\n### dispatch.rs\n 1770|    // [unit->REQ-DISPATCH-HYGIENE-TELEMETRY] the pool bound under a cold\n*1771|    // flood (Amendment fix 7): walking a cold enumeration through the loop's\n 1772|    // admission gate claims exactly MAX_DISPATCH_WORKERS rows per poll —\n 1773|    // the rest wait for the next tick; a freed slot re-admits.\n 1774|    #[test]\n### livehost.rs\n 977|        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n*978|        let Ok(entries) = std::fs::read_dir(&perch) else {\n 979|            continue;\n 980|        };\n*981|        for entry in entries.flatten() {\n 982|            let name = entry.file_name();\n 983|            let name = name.to_string_lossy();\n 984|            // The live own-copy dir + any already-displaced `.live-bin.old*` litter.\n...\n 2065|        );\n*2066|        let displaced: Vec<_> = std::fs::read_dir(&perch)\n 2067|            .unwrap()\n 2068|            .flatten()\n 2069|            .filter(|e| e.file_name().to_string_lossy().starts_with(\".live-bin.old\"))\n### notif.rs\n 481|/// Resurface undismissed notifs to `endpoint` at a reported boundary\n*482|/// (`api boundary clear|compact` / new-session-start; wake = D9). Walks every\n 483|/// member subnet's undismissed rows and applies the gates in module-doc\n 484|/// order: visibility → seen-per-endpoint → suppression window. Suppression\n 485|/// compares against the max-merged `last_surfaced_ms` with\n### presence.rs\n 59|    let mut out = BTreeMap::new();\n*60|    let Ok(entries) = std::fs::read_dir(dir) else {\n 61|        return out;\n 62|    };\n*63|    for entry in entries.flatten() {\n 64|        let path = entry.path();\n 65|        if path.extension().and_then(|e| e.to_str()) != Some(\"json\") {\n 66|            continue;\n### projwriter.rs\n 48|\n*49|/// Queue poll cadence (a single `read_dir` — pure file I/O). Runtime-env\n 50|/// overridable for int rigs (`SPT_PROJINDEX_POLL_MS`), never for production.\n 51|const POLL_MS: u64 = 500;\n 52|/// Debounce window after the first observed event — a burst (an adapter\n...\n 559|fn enumerate_perches(owlery: &Path) -> Vec<(String, PathBuf, Option<String>)> {\n*560|    let Ok(entries) = std::fs::read_dir(owlery) else {\n 561|        return Vec::new();\n 562|    };\n 563|    let mut out = Vec::new();\n*564|    for entry in entries.flatten() {\n 565|        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 566|            continue;\n 567|        }\n...\n 577|/// (a normal checkout) or the `.git` gitfile itself (a linked worktree — the\n*578|/// file's content moves when the repo pointer moves). Pure filesystem walk,\n 579|/// NO git spawn — this is what lets cache validity be checked per cycle for\n 580|/// free.\n 581|fn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n### seedproofx.rs\n 542|    };\n*543|    // Intersection in a deterministic (sorted) order both sides walk identically.\n 544|    let mut shared: Vec<String> = dialer_names\n 545|        .into_iter()\n 546|        .filter(|s| by_name.contains_key(s.as_str()))\n\n### pump/\n#### mod.rs\n 1846|    #[test]\n*1847|    fn resolve_submit_addr_walks_the_route_chain() {\n 1848|        let dir = tempfile::tempdir().unwrap();\n 1849|        let seeds = dir.path().join(\"peer-addrs.json\");\n 1850|        let seeded_addr = serde_json::json!({\"id\": \"ab\", \"addrs\": [\"192.168.1.7:4711\"]});\n\n## spt-live/src/\n### ingest.rs\n 201|// [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\n*202|pub fn ingest_drops(\n 203|    drop_dir: &Path,\n 204|    id: &str,\n 205|    project_id: &str,\n\n## spt-store/src/\n### atomic.rs\n 211|    fn no_tmp_sibling_remains(dir: &Path) {\n*212|        let leftover: Vec<String> = fs::read_dir(dir)\n 213|            .unwrap()\n 214|            .flatten()\n 215|            .filter_map(|e| e.file_name().into_string().ok())\n### branchstore.rs\n 595|    let mut candidates = vec![git_dir.join(\"index.lock\")];\n*596|    if let Ok(entries) = std::fs::read_dir(git_dir.join(\"worktrees\")) {\n 597|        for e in entries.flatten() {\n 598|            candidates.push(e.path().join(\"index.lock\"));\n 599|        }\n### contextmark.rs\n 88|        let mut map = BTreeMap::new();\n*89|        for entry in s.split(',') {\n 90|            if let Some((node, epoch)) = entry.rsplit_once(':') {\n 91|                if let Ok(e) = epoch.trim().parse::<u64>() {\n 92|                    if !node.trim().is_empty() {\n### contextstore.rs\n 284|        let mut out = Vec::new();\n*285|        let Ok(entries) = std::fs::read_dir(&dir) else {\n 286|            return Ok(out); // no dir = no conflicts\n 287|        };\n 288|        let prefix = file_rel.map(|f| format!(\"{}.\", f.replace(['/', '\\\\'], \"_\")));\n...\n 368|        let projects = self.root.join(\"projects\");\n*369|        if let Ok(entries) = std::fs::read_dir(&projects) {\n*370|            for entry in entries.flatten() {\n 371|                let wt = entry.path();\n 372|                if !wt.join(\".git\").exists() || !wt.join(old_id).exists() {\n 373|                    continue;\n...\n 429|        let projects = self.root.join(\"projects\");\n*430|        if let Ok(entries) = std::fs::read_dir(&projects) {\n*431|            for entry in entries.flatten() {\n 432|                let wt = entry.path();\n 433|                let src_file = wt.join(src).join(PROJECT_CONTEXT_FILE);\n 434|                if !wt.join(\".git\").exists() || !src_file.exists() {\n...\n 491|        let projects = self.root.join(\"projects\");\n*492|        if let Ok(entries) = std::fs::read_dir(&projects) {\n*493|            for entry in entries.flatten() {\n 494|                let wt = entry.path();\n 495|                if !wt.join(\".git\").exists() || !wt.join(id).exists() {\n 496|                    continue;\n### perch.rs\n 422|pub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {\n*423|    let Ok(entries) = std::fs::read_dir(owlery) else {\n 424|        return Vec::new();\n 425|    };\n 426|    let mut ids = Vec::new();\n*427|    for entry in entries.flatten() {\n 428|        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 429|            continue;\n 430|        }\n...\n 454|    let mut dirs = Vec::new();\n*455|    let Ok(top) = std::fs::read_dir(owlery) else {\n 456|        return dirs;\n 457|    };\n*458|    for entry in top.flatten() {\n 459|        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 460|            continue;\n 461|        }\n...\n 467|        // Its nested Psyche/Worker children under `<parent>/nested/`.\n*468|        if let Ok(children) = std::fs::read_dir(path.join(\"nested\")) {\n 469|            for child in children.flatten() {\n 470|                if child.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 471|                    let cpath = child.path();\n### proc.rs\n 130|/// Windows: `NtQueryInformationProcess(ProcessCommandLineInformation)` — a single\n*131|/// query returning a `UNICODE_STRING` (no PEB walk; Win8.1+), mirroring the\n 132|/// non-hanging `NtQueryInformationProcess` path [`parent_pid`] uses. Linux: the\n 133|/// NUL-separated `/proc/<pid>/cmdline`, joined on spaces. Other unix: `None`.\n 134|// [impl->REQ-HAZARD-BRAIN-RESTART-PSYCHE-DUP]\n...\n 295|/// (which answers only for the current process via the fast pseudo-handle) so the\n*296|/// process ANCESTRY can be walked for self-identification when the env self-id legs\n 297|/// are absent (REQ-MSG-SELF-DETECT-ANCESTRY). `None` on query failure / dead pid /\n 298|/// unsupported platform (a non-Linux unix has no `/proc`, so only the direct\n 299|/// `getppid` self-parent is knowable there — see [`process_ancestry`]).\n...\n 409|\n*410|/// One full process snapshot as `(pid, parent_pid)` pairs — the FORWARD-walk\n 411|/// substrate [`parent_pid_of`] lacks (it answers child→parent only, one pid at a\n*412|/// time). This is the map a scope-strict DESCENDANT walk ([`process_descendants`])\n 413|/// needs to find a process's whole subtree for a tree-kill. Best-effort: an\n 414|/// unreadable snapshot yields an empty vec (never a panic); a non-Linux unix has\n 415|/// no `/proc`, so it too returns empty (the caller degrades to a single-pid kill).\n...\n 418|/// sweep — coherent enough (a momentary snapshot; pid recycling across the sweep is\n*419|/// bounded by the descendant walk's own visited-set). Linux: `/proc/<pid>/stat`\n 420|/// field-4 ppid over every numeric `/proc` entry (the same last-`)`-split parse as\n 421|/// `parent_pid_of`, tolerant of a `comm` with spaces/parens).\n 422|// [impl->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN]\n...\n 426|        let mut out = Vec::new();\n*427|        let Ok(entries) = std::fs::read_dir(\"/proc\") else {\n 428|            return out;\n 429|        };\n*430|        for entry in entries.flatten() {\n 431|            let name = entry.file_name();\n 432|            let Some(pid) = name.to_str().and_then(|s| s.parse::<u32>().ok()) else {\n 433|                continue; // non-numeric /proc entry (self, sys, …)\n...\n 442|    {\n*443|        Vec::new() // no /proc — no forward walk; caller degrades to single-pid kill\n 444|    }\n 445|    #[cfg(windows)]\n 446|    {\n...\n 489|/// parent→children map. Scope-strict: ONLY processes whose parent-chain reaches\n*490|/// `root`; never a parent/ancestor walk, never a basename heuristic. Cycle-guarded\n*491|/// (a recycled pid that appears to parent an ancestor cannot loop the walk).\n 492|/// Root-first BFS order, so a tree-kill reverses it to strike LEAVES first (a\n 493|/// parent can't re-spawn a just-killed child mid-teardown). Empty when the platform\n 494|/// has no snapshot (non-Linux unix) or `root` has no live children.\n...\n 765|\n*766|    // [unit->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN] the forward-walk snapshot lists\n 767|    // the current process (Linux/Windows). On a non-Linux unix the table is empty by\n 768|    // design (no /proc) — the caller degrades to a single-pid kill there.\n 769|    #[test]\n...\n 785|    // [unit->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN] a spawned child appears in THIS\n*786|    // process's descendant subtree — the scope-strict forward walk a tree-kill needs.\n*787|    // (Skipped where there is no /proc snapshot to walk.)\n 788|    #[cfg(any(target_os = \"linux\", windows))]\n 789|    #[test]\n 790|    fn descendants_include_a_spawned_child() {\n...\n 837|    // goes red on the live descendant. Scoped to our own spawned tree — never a\n*838|    // machine-wide sweep. (Skipped where there is no /proc snapshot to walk.)\n 839|    #[cfg(any(target_os = \"linux\", windows))]\n 840|    #[test]\n 841|    fn kill_pid_tree_kills_the_whole_subtree() {\n### projderive.rs\n 78|/// daemon writer can inject its cwd cache). `entries` arrive oldest→newest\n*79|/// (the ledger order); walked REVERSED so the most recent project sorts\n 80|/// first. A store-only project (in the branches but never a session cwd) is\n 81|/// appended with an empty dir and the id as its display.\n 82|// [impl->REQ-PROJECT-INDEX-WRITER]\n...\n 170|\n*171|        // Newest session cwd wins (ledger arrives oldest→newest; reversed walk).\n 172|        let entries = vec![entry(Some(\"/p/Older\")), entry(Some(\"/p/Newest\"))];\n 173|        let refs = project_refs_from(\n 174|            &entries,\n...\n 223|            refs[0].dir, \"/other/PROJ-A\",\n*224|            \"newest cwd (reversed walk) carries the ref\"\n 225|        );\n 226|        assert_eq!(\n 227|            derive_calls.get(),\n### projinval.rs\n 10|//! `$SPT_HOME/index/invalidations/`; the writer polls the directory cheaply\n*11|//! (one `read_dir` — pure file I/O, no git), DRAINS all pending events, and\n 12|//! coalesces them into one refresh (multiple invalidations → one reconcile).\n 13|//! Daemon-offline nudges simply accumulate and are consumed at the next brain\n 14|//! start — the same recover-by-reading-state stance as the rest of the store.\n...\n 90|/// Whether any event is pending in `dir` — the writer's cheap poll (one\n*91|/// `read_dir`, first entry short-circuits; a missing dir is \"nothing pending\").\n 92|pub fn pending_at(dir: &Path) -> bool {\n*93|    std::fs::read_dir(dir)\n 94|        .map(|mut d| d.next().is_some())\n 95|        .unwrap_or(false)\n 96|}\n...\n 98|/// Drain EVERY pending event out of `dir`: read + delete each file, tolerant\n*99|/// of unparseable bodies (skipped + removed) and of files vanishing mid-walk\n 100|/// (a concurrent drain — only the daemon writer drains in production, but the\n 101|/// contract must not depend on that). The returned list is the coalescing\n 102|/// input: the caller unions scopes into one refresh.\n...\n 104|pub fn drain_at(dir: &Path) -> Vec<InvalScope> {\n*105|    let Ok(entries) = std::fs::read_dir(dir) else {\n 106|        return Vec::new();\n 107|    };\n 108|    let mut out = Vec::new();\n*109|    for entry in entries.flatten() {\n 110|        let path = entry.path();\n 111|        if let Ok(body) = std::fs::read_to_string(&path) {\n 112|            if let Ok(scope) = serde_json::from_str::<InvalScope>(&body) {\n### psyche_custody.rs\n 99|/// stolen bind carried a psyche sid as the new pin; refusing the collision here\n*100|/// makes the CLASS unreachable for any future leak vector. Layout walked:\n 101|/// `owlery/<parent>/nested/<child>/psyche-custody.json` — only psyches carry a\n 102|/// custody file, so a match IS a psyche. Tolerant like [`read_psyche_sid`]:\n 103|/// unreadable dirs/files simply don't match (the guard can only refuse on\n...\n 106|pub fn custody_squatter(owlery: &Path, sid: &str) -> Option<String> {\n*107|    let tops = std::fs::read_dir(owlery).ok()?;\n 108|    for top in tops.flatten() {\n*109|        let Ok(children) = std::fs::read_dir(top.path().join(\"nested\")) else {\n 110|            continue;\n 111|        };\n 112|        for child in children.flatten() {\n...\n 216|    // [unit->REQ-BIND-PSYCHE-CUSTODY-SQUAT-GUARD] the bind-time squat scan: given a\n*217|    // sid, walk owlery/<parent>/nested/<child>/psyche-custody.json and return the\n 218|    // psyche's dir name whose OWN custody sid matches; a sid no psyche holds returns\n 219|    // None. This is exactly what `establish_perch` reads to refuse a seat-theft bind.\n 220|    #[test]\n...\n 250|        let owlery = d.path();\n*251|        // A parent with no nested/ dir at all → read_dir(nested) errs → skipped.\n 252|        std::fs::create_dir_all(owlery.join(\"lonely\")).unwrap();\n 253|        // A parent whose nested child carries an unparseable custody file → reads None.\n 254|        let corrupt = owlery.join(\"wrecked\").join(\"nested\").join(\"wrecked-psyche\");\n\nShowing files 1-20 of 23. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"crates/spt-daemon/src, crates/spt-live/src, crates/spt-store/src","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":68,"fileCount":20,"files":["crates/spt-daemon/src/autostart.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/crc_swap.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/src/presence.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/seedproofx.rs","crates/spt-live/src/ingest.rs","crates/spt-store/src/atomic.rs","crates/spt-store/src/branchstore.rs","crates/spt-store/src/contextmark.rs","crates/spt-store/src/contextstore.rs","crates/spt-store/src/perch.rs","crates/spt-store/src/proc.rs","crates/spt-store/src/projderive.rs","crates/spt-store/src/projinval.rs","crates/spt-store/src/psyche_custody.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/autostart.rs","count":1},{"path":"crates/spt-daemon/src/broker.rs","count":1},{"path":"crates/spt-daemon/src/crc_swap.rs","count":9},{"path":"crates/spt-daemon/src/dispatch.rs","count":1},{"path":"crates/spt-daemon/src/livehost.rs","count":3},{"path":"crates/spt-daemon/src/notif.rs","count":1},{"path":"crates/spt-daemon/src/presence.rs","count":2},{"path":"crates/spt-daemon/src/projwriter.rs","count":4},{"path":"crates/spt-daemon/src/pump/mod.rs","count":1},{"path":"crates/spt-daemon/src/seedproofx.rs","count":1},{"path":"crates/spt-live/src/ingest.rs","count":1},{"path":"crates/spt-store/src/atomic.rs","count":1},{"path":"crates/spt-store/src/branchstore.rs","count":1},{"path":"crates/spt-store/src/contextmark.rs","count":1},{"path":"crates/spt-store/src/contextstore.rs","count":7},{"path":"crates/spt-store/src/perch.rs","count":5},{"path":"crates/spt-store/src/proc.rs","count":14},{"path":"crates/spt-store/src/projderive.rs","count":3},{"path":"crates/spt-store/src/projinval.rs","count":6},{"path":"crates/spt-store/src/psyche_custody.rs","count":5}],"truncated":true,"fileLimitReached":20,"displayContent":"# crates/\n\n## spt-daemon/src/\n### autostart.rs\n 45│    let node_label = spt_store::hostlabel::node_fill_label(None);\n*46│    for entry in entries {\n 47│        // Re-resolve the adapter option fresh (an adapter updated between\n 48│        // restarts is honored; an uninstalled one is a loud skip, never a wedge).\n 49│        let (record, manifest) =\n### broker.rs\n 284│/// The impure probe feeding [`zombie_verdict`] for a claimed live session —\n*285│/// runs OFF every broker lock (a process-table walk is real work; KH 7.12).\n 286│/// `spawned_ms_ago` comes from the session's `spawned_at`; callers on the\n 287│/// KIND_SESSIONS reply use the additive `SessionInfo` fields, so the CLI\n 288│/// preflight and the broker gate consult the SAME authority.\n### crc_swap.rs\n  31│\n *32│/// Walk `staging` and return the files whose content differs from their\n  33│/// `install_dir` counterpart — or that are absent in `install_dir`. Files whose\n  34│/// content is byte-identical are skipped, so a still-running unchanged binary is\n  35│/// never disturbed. Read-only: does not mutate either tree. The returned plan is\n    │...\n  52│) -> std::io::Result<()> {\n *53│    for entry in std::fs::read_dir(dir)? {\n  54│        let entry = entry?;\n  55│        let path = entry.path();\n  56│        if path.is_dir() {\n    │...\n 226│    let dashed = format!(\"{base}-\");\n*227│    let Ok(entries) = std::fs::read_dir(dir) else {\n 228│        return;\n 229│    };\n*230│    for entry in entries.flatten() {\n 231│        if let Some(name) = entry.file_name().to_str() {\n 232│            if name == base || name.starts_with(&dashed) {\n 233│                let _ = std::fs::remove_file(entry.path());\n    │...\n 302│        let mut found = false;\n*303│        fn walk(dir: &Path, found: &mut bool) {\n*304│            for entry in fs::read_dir(dir).unwrap() {\n 305│                let path = entry.unwrap().path();\n 306│                if path.is_dir() {\n*307│                    walk(&path, found);\n 308│                    continue;\n 309│                }\n 310│                if let Some(ext) = path.extension() {\n    │...\n 316│        }\n*317│        walk(dir, &mut found);\n 318│        found\n 319│    }\n 320│\n    │...\n 353│\n*354│    /// The walk recurses into nested directories and reports the correct nested\n 355│    /// `rel` (so a changed file deep in the tree is found, not just top-level).\n 356│    // [unit->REQ-ADAPTER-LIVE-UPDATE]\n 357│    #[test]\n### dispatch.rs\n 1770│    // [unit->REQ-DISPATCH-HYGIENE-TELEMETRY] the pool bound under a cold\n*1771│    // flood (Amendment fix 7): walking a cold enumeration through the loop's\n 1772│    // admission gate claims exactly MAX_DISPATCH_WORKERS rows per poll —\n 1773│    // the rest wait for the next tick; a freed slot re-admits.\n 1774│    #[test]\n### livehost.rs\n  977│        let perch = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n *978│        let Ok(entries) = std::fs::read_dir(&perch) else {\n  979│            continue;\n  980│        };\n *981│        for entry in entries.flatten() {\n  982│            let name = entry.file_name();\n  983│            let name = name.to_string_lossy();\n  984│            // The live own-copy dir + any already-displaced `.live-bin.old*` litter.\n     │...\n 2065│        );\n*2066│        let displaced: Vec<_> = std::fs::read_dir(&perch)\n 2067│            .unwrap()\n 2068│            .flatten()\n 2069│            .filter(|e| e.file_name().to_string_lossy().starts_with(\".live-bin.old\"))\n### notif.rs\n 481│/// Resurface undismissed notifs to `endpoint` at a reported boundary\n*482│/// (`api boundary clear|compact` / new-session-start; wake = D9). Walks every\n 483│/// member subnet's undismissed rows and applies the gates in module-doc\n 484│/// order: visibility → seen-per-endpoint → suppression window. Suppression\n 485│/// compares against the max-merged `last_surfaced_ms` with\n### presence.rs\n 59│    let mut out = BTreeMap::new();\n*60│    let Ok(entries) = std::fs::read_dir(dir) else {\n 61│        return out;\n 62│    };\n*63│    for entry in entries.flatten() {\n 64│        let path = entry.path();\n 65│        if path.extension().and_then(|e| e.to_str()) != Some(\"json\") {\n 66│            continue;\n### projwriter.rs\n  48│\n *49│/// Queue poll cadence (a single `read_dir` — pure file I/O). Runtime-env\n  50│/// overridable for int rigs (`SPT_PROJINDEX_POLL_MS`), never for production.\n  51│const POLL_MS: u64 = 500;\n  52│/// Debounce window after the first observed event — a burst (an adapter\n    │...\n 559│fn enumerate_perches(owlery: &Path) -> Vec<(String, PathBuf, Option<String>)> {\n*560│    let Ok(entries) = std::fs::read_dir(owlery) else {\n 561│        return Vec::new();\n 562│    };\n 563│    let mut out = Vec::new();\n*564│    for entry in entries.flatten() {\n 565│        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 566│            continue;\n 567│        }\n    │...\n 577│/// (a normal checkout) or the `.git` gitfile itself (a linked worktree — the\n*578│/// file's content moves when the repo pointer moves). Pure filesystem walk,\n 579│/// NO git spawn — this is what lets cache validity be checked per cycle for\n 580│/// free.\n 581│fn discover_git_marker(dir: &Path) -> Option<PathBuf> {\n### seedproofx.rs\n 542│    };\n*543│    // Intersection in a deterministic (sorted) order both sides walk identically.\n 544│    let mut shared: Vec<String> = dialer_names\n 545│        .into_iter()\n 546│        .filter(|s| by_name.contains_key(s.as_str()))\n\n### pump/\n#### mod.rs\n 1846│    #[test]\n*1847│    fn resolve_submit_addr_walks_the_route_chain() {\n 1848│        let dir = tempfile::tempdir().unwrap();\n 1849│        let seeds = dir.path().join(\"peer-addrs.json\");\n 1850│        let seeded_addr = serde_json::json!({\"id\": \"ab\", \"addrs\": [\"192.168.1.7:4711\"]});\n\n## spt-live/src/\n### ingest.rs\n 201│// [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\n*202│pub fn ingest_drops(\n 203│    drop_dir: &Path,\n 204│    id: &str,\n 205│    project_id: &str,\n\n## spt-store/src/\n### atomic.rs\n 211│    fn no_tmp_sibling_remains(dir: &Path) {\n*212│        let leftover: Vec<String> = fs::read_dir(dir)\n 213│            .unwrap()\n 214│            .flatten()\n 215│            .filter_map(|e| e.file_name().into_string().ok())\n### branchstore.rs\n 595│    let mut candidates = vec![git_dir.join(\"index.lock\")];\n*596│    if let Ok(entries) = std::fs::read_dir(git_dir.join(\"worktrees\")) {\n 597│        for e in entries.flatten() {\n 598│            candidates.push(e.path().join(\"index.lock\"));\n 599│        }\n### contextmark.rs\n 88│        let mut map = BTreeMap::new();\n*89│        for entry in s.split(',') {\n 90│            if let Some((node, epoch)) = entry.rsplit_once(':') {\n 91│                if let Ok(e) = epoch.trim().parse::<u64>() {\n 92│                    if !node.trim().is_empty() {\n### contextstore.rs\n 284│        let mut out = Vec::new();\n*285│        let Ok(entries) = std::fs::read_dir(&dir) else {\n 286│            return Ok(out); // no dir = no conflicts\n 287│        };\n 288│        let prefix = file_rel.map(|f| format!(\"{}.\", f.replace(['/', '\\\\'], \"_\")));\n    │...\n 368│        let projects = self.root.join(\"projects\");\n*369│        if let Ok(entries) = std::fs::read_dir(&projects) {\n*370│            for entry in entries.flatten() {\n 371│                let wt = entry.path();\n 372│                if !wt.join(\".git\").exists() || !wt.join(old_id).exists() {\n 373│                    continue;\n    │...\n 429│        let projects = self.root.join(\"projects\");\n*430│        if let Ok(entries) = std::fs::read_dir(&projects) {\n*431│            for entry in entries.flatten() {\n 432│                let wt = entry.path();\n 433│                let src_file = wt.join(src).join(PROJECT_CONTEXT_FILE);\n 434│                if !wt.join(\".git\").exists() || !src_file.exists() {\n    │...\n 491│        let projects = self.root.join(\"projects\");\n*492│        if let Ok(entries) = std::fs::read_dir(&projects) {\n*493│            for entry in entries.flatten() {\n 494│                let wt = entry.path();\n 495│                if !wt.join(\".git\").exists() || !wt.join(id).exists() {\n 496│                    continue;\n### perch.rs\n 422│pub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {\n*423│    let Ok(entries) = std::fs::read_dir(owlery) else {\n 424│        return Vec::new();\n 425│    };\n 426│    let mut ids = Vec::new();\n*427│    for entry in entries.flatten() {\n 428│        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 429│            continue;\n 430│        }\n    │...\n 454│    let mut dirs = Vec::new();\n*455│    let Ok(top) = std::fs::read_dir(owlery) else {\n 456│        return dirs;\n 457│    };\n*458│    for entry in top.flatten() {\n 459│        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 460│            continue;\n 461│        }\n    │...\n 467│        // Its nested Psyche/Worker children under `<parent>/nested/`.\n*468│        if let Ok(children) = std::fs::read_dir(path.join(\"nested\")) {\n 469│            for child in children.flatten() {\n 470│                if child.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n 471│                    let cpath = child.path();\n### proc.rs\n 130│/// Windows: `NtQueryInformationProcess(ProcessCommandLineInformation)` — a single\n*131│/// query returning a `UNICODE_STRING` (no PEB walk; Win8.1+), mirroring the\n 132│/// non-hanging `NtQueryInformationProcess` path [`parent_pid`] uses. Linux: the\n 133│/// NUL-separated `/proc/<pid>/cmdline`, joined on spaces. Other unix: `None`.\n 134│// [impl->REQ-HAZARD-BRAIN-RESTART-PSYCHE-DUP]\n    │...\n 295│/// (which answers only for the current process via the fast pseudo-handle) so the\n*296│/// process ANCESTRY can be walked for self-identification when the env self-id legs\n 297│/// are absent (REQ-MSG-SELF-DETECT-ANCESTRY). `None` on query failure / dead pid /\n 298│/// unsupported platform (a non-Linux unix has no `/proc`, so only the direct\n 299│/// `getppid` self-parent is knowable there — see [`process_ancestry`]).\n    │...\n 409│\n*410│/// One full process snapshot as `(pid, parent_pid)` pairs — the FORWARD-walk\n 411│/// substrate [`parent_pid_of`] lacks (it answers child→parent only, one pid at a\n*412│/// time). This is the map a scope-strict DESCENDANT walk ([`process_descendants`])\n 413│/// needs to find a process's whole subtree for a tree-kill. Best-effort: an\n 414│/// unreadable snapshot yields an empty vec (never a panic); a non-Linux unix has\n 415│/// no `/proc`, so it too returns empty (the caller degrades to a single-pid kill).\n    │...\n 418│/// sweep — coherent enough (a momentary snapshot; pid recycling across the sweep is\n*419│/// bounded by the descendant walk's own visited-set). Linux: `/proc/<pid>/stat`\n 420│/// field-4 ppid over every numeric `/proc` entry (the same last-`)`-split parse as\n 421│/// `parent_pid_of`, tolerant of a `comm` with spaces/parens).\n 422│// [impl->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN]\n    │...\n 426│        let mut out = Vec::new();\n*427│        let Ok(entries) = std::fs::read_dir(\"/proc\") else {\n 428│            return out;\n 429│        };\n*430│        for entry in entries.flatten() {\n 431│            let name = entry.file_name();\n 432│            let Some(pid) = name.to_str().and_then(|s| s.parse::<u32>().ok()) else {\n 433│                continue; // non-numeric /proc entry (self, sys, …)\n    │...\n 442│    {\n*443│        Vec::new() // no /proc — no forward walk; caller degrades to single-pid kill\n 444│    }\n 445│    #[cfg(windows)]\n 446│    {\n    │...\n 489│/// parent→children map. Scope-strict: ONLY processes whose parent-chain reaches\n*490│/// `root`; never a parent/ancestor walk, never a basename heuristic. Cycle-guarded\n*491│/// (a recycled pid that appears to parent an ancestor cannot loop the walk).\n 492│/// Root-first BFS order, so a tree-kill reverses it to strike LEAVES first (a\n 493│/// parent can't re-spawn a just-killed child mid-teardown). Empty when the platform\n 494│/// has no snapshot (non-Linux unix) or `root` has no live children.\n    │...\n 765│\n*766│    // [unit->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN] the forward-walk snapshot lists\n 767│    // the current process (Linux/Windows). On a non-Linux unix the table is empty by\n 768│    // design (no /proc) — the caller degrades to a single-pid kill there.\n 769│    #[test]\n    │...\n 785│    // [unit->REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN] a spawned child appears in THIS\n*786│    // process's descendant subtree — the scope-strict forward walk a tree-kill needs.\n*787│    // (Skipped where there is no /proc snapshot to walk.)\n 788│    #[cfg(any(target_os = \"linux\", windows))]\n 789│    #[test]\n 790│    fn descendants_include_a_spawned_child() {\n    │...\n 837│    // goes red on the live descendant. Scoped to our own spawned tree — never a\n*838│    // machine-wide sweep. (Skipped where there is no /proc snapshot to walk.)\n 839│    #[cfg(any(target_os = \"linux\", windows))]\n 840│    #[test]\n 841│    fn kill_pid_tree_kills_the_whole_subtree() {\n### projderive.rs\n  78│/// daemon writer can inject its cwd cache). `entries` arrive oldest→newest\n *79│/// (the ledger order); walked REVERSED so the most recent project sorts\n  80│/// first. A store-only project (in the branches but never a session cwd) is\n  81│/// appended with an empty dir and the id as its display.\n  82│// [impl->REQ-PROJECT-INDEX-WRITER]\n    │...\n 170│\n*171│        // Newest session cwd wins (ledger arrives oldest→newest; reversed walk).\n 172│        let entries = vec![entry(Some(\"/p/Older\")), entry(Some(\"/p/Newest\"))];\n 173│        let refs = project_refs_from(\n 174│            &entries,\n    │...\n 223│            refs[0].dir, \"/other/PROJ-A\",\n*224│            \"newest cwd (reversed walk) carries the ref\"\n 225│        );\n 226│        assert_eq!(\n 227│            derive_calls.get(),\n### projinval.rs\n  10│//! `$SPT_HOME/index/invalidations/`; the writer polls the directory cheaply\n *11│//! (one `read_dir` — pure file I/O, no git), DRAINS all pending events, and\n  12│//! coalesces them into one refresh (multiple invalidations → one reconcile).\n  13│//! Daemon-offline nudges simply accumulate and are consumed at the next brain\n  14│//! start — the same recover-by-reading-state stance as the rest of the store.\n    │...\n  90│/// Whether any event is pending in `dir` — the writer's cheap poll (one\n *91│/// `read_dir`, first entry short-circuits; a missing dir is \"nothing pending\").\n  92│pub fn pending_at(dir: &Path) -> bool {\n *93│    std::fs::read_dir(dir)\n  94│        .map(|mut d| d.next().is_some())\n  95│        .unwrap_or(false)\n  96│}\n    │...\n  98│/// Drain EVERY pending event out of `dir`: read + delete each file, tolerant\n *99│/// of unparseable bodies (skipped + removed) and of files vanishing mid-walk\n 100│/// (a concurrent drain — only the daemon writer drains in production, but the\n 101│/// contract must not depend on that). The returned list is the coalescing\n 102│/// input: the caller unions scopes into one refresh.\n    │...\n 104│pub fn drain_at(dir: &Path) -> Vec<InvalScope> {\n*105│    let Ok(entries) = std::fs::read_dir(dir) else {\n 106│        return Vec::new();\n 107│    };\n 108│    let mut out = Vec::new();\n*109│    for entry in entries.flatten() {\n 110│        let path = entry.path();\n 111│        if let Ok(body) = std::fs::read_to_string(&path) {\n 112│            if let Ok(scope) = serde_json::from_str::<InvalScope>(&body) {\n### psyche_custody.rs\n  99│/// stolen bind carried a psyche sid as the new pin; refusing the collision here\n*100│/// makes the CLASS unreachable for any future leak vector. Layout walked:\n 101│/// `owlery/<parent>/nested/<child>/psyche-custody.json` — only psyches carry a\n 102│/// custody file, so a match IS a psyche. Tolerant like [`read_psyche_sid`]:\n 103│/// unreadable dirs/files simply don't match (the guard can only refuse on\n    │...\n 106│pub fn custody_squatter(owlery: &Path, sid: &str) -> Option<String> {\n*107│    let tops = std::fs::read_dir(owlery).ok()?;\n 108│    for top in tops.flatten() {\n*109│        let Ok(children) = std::fs::read_dir(top.path().join(\"nested\")) else {\n 110│            continue;\n 111│        };\n 112│        for child in children.flatten() {\n    │...\n 216│    // [unit->REQ-BIND-PSYCHE-CUSTODY-SQUAT-GUARD] the bind-time squat scan: given a\n*217│    // sid, walk owlery/<parent>/nested/<child>/psyche-custody.json and return the\n 218│    // psyche's dir name whose OWN custody sid matches; a sid no psyche holds returns\n 219│    // None. This is exactly what `establish_perch` reads to refuse a seat-theft bind.\n 220│    #[test]\n    │...\n 250│        let owlery = d.path();\n*251│        // A parent with no nested/ dir at all → read_dir(nested) errs → skipped.\n 252│        std::fs::create_dir_all(owlery.join(\"lonely\")).unwrap();\n 253│        // A parent whose nested child carries an unparseable custody file → reads None.\n 254│        let corrupt = owlery.join(\"wrecked\").join(\"nested\").join(\"wrecked-psyche\");"},"isError":false,"timestamp":1784293295025}}
{"type":"message","id":"52e2f9d0","parentId":"dbd7a02b","timestamp":"2026-07-17T13:01:42.059Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying need for targeted ingest**"},{"type":"toolCall","id":"call_EFaWRNsxQ2qFZX79YKGJ5z8z|fc_034a6be5a6696b6c016a5a27b552388191a507f129608db0f7","name":"read","arguments":{"i":"Reading drop ingestion scan","path":"crates/spt-live/src/ingest.rs","selector":"180-300"}},{"type":"toolCall","id":"call_CCO8wZZRuMKwV0V0F3p61Fd1|fc_034a6be5a6696b6c016a5a27b552608191a7ea91ae1dbd1971","name":"read","arguments":{"i":"Reading manifest reload poll","path":"crates/spt-daemon/src/lifecycle.rs","selector":"440-560"}},{"type":"toolCall","id":"call_tGKrkfFen6J4Lpmpzq51mblL|fc_034a6be5a6696b6c016a5a27b5526881919648898e994c13c2","name":"read","arguments":{"i":"Reading daemon config live cadence","path":"C:/Users/decid/AppData/Local/spt-core/daemon.json","selector":"raw"}},{"type":"toolCall","id":"call_GLxPw6F8Pvb16Wxyns5Fv0hq|fc_034a6be5a6696b6c016a5a27b553908191bcae838f04f01394","name":"read","arguments":{"i":"Reading project index status","path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","selector":"raw"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":10653,"output":192,"cacheRead":144896,"cacheWrite":0,"totalTokens":155741,"reasoningTokens":18,"cost":{"input":0.05326500000000001,"output":0.00576,"cacheRead":0.072448,"cacheWrite":0,"total":0.131473}},"stopReason":"toolUse","timestamp":1784293295040,"responseId":"resp_034a6be5a6696b6c016a5a27af753c81919bff43c0f1a5857f","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27b1bea08191ba8e0fd5c4b08b91","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWie1Fe3A0M37BmS7NWBRhxWbQ8lZanxoIyx203ERo4Q8GG3spwpGfHoE0tLylp7PrOcYbiAGw1eEppYl9t_RB2vh-WJlws0Se5067qDx9M75nC7giTkxMk_VBcDrTnOwvslJvSIlV9GL9g4eLvV6i85pCnxh09GicFW7ashBD2RWxL631G_m3sS8t0GLN-XNTHFY9zNb3nM8lOA94r_Eqq9PZvY1nRZxa6P8WRQ1lg5ryc8SjavrdSIlv2NkafBS5F7l5XJ0sglTMHhPCTbDTLNMBNgD5k9XqOYrKZeoKkW1QS27pqczG-uAiRGjoiSh6_FbxYHcBZ5qGr2ICk-z-9065cdwr1KHLBbdNTxozwthnXS_UF2xcrZHGJ-j2BqXVoseKI-aRvUOXTcBtK2j_odXYnrFqHx10XpCez6cPlPEMoLw3-a_eoshaG-FRhsJzLIl_HNXN6JtAm8OW_AHJ17gyGTLZoy7vmClOcQKENWtYQuMgPEgpJUF2InJkGNivhTWathfk-mIEGd1-oDNw4GbtQLJPAoquFSFfam1opFeH7JVZnkCZ2TGUtKiUZc_s0pWiuKUqesCf7OJjuN9OrNG_1rf92PsD61B0zditjt7CHDfA5RfGDYzZI9kvr8ddS0LrO5gmjD1pxX_KlwYAyrPdpddpzY6wjjYn9CyacBo1cXb3Sf7qStwpRltsvPWrOhBs4GyJXqPnvBHS322M_sqLF9Tmn28IR1StbjrqI7glwlOunFoWnj3cy7aCYmlCeMnadRvJ6iHMJvuD8sYVWus_zH6D6eeEn4hBXAUpEY87ZL23BBb2fc5GupQElCf_jEgLvreCUFe2NtUDIhP1-Mlr1SsLEXtSp-gL43Pj_On-9aZ4uoF13FiwI0wOc8rWiigSdgkrsO5as3VBymzlwdhT2NzrHO5kGRgbCRNDegSj1W3r5yFge5300hJez8ZyRdoYumR5IduNytqXvbfzeS3a5W1DlvS--Cyus-wg2uCGThteH05z7K_GHv9v5QQ0-LX","summary":[{"type":"summary_text","text":"**Identifying need for targeted ingest**"}]},{"id":"fc_034a6be5a6696b6c016a5a27b552388191a507f129608db0f7","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading drop ingestion scan\",\"path\":\"crates/spt-live/src/ingest.rs\",\"selector\":\"180-300\"}","call_id":"call_EFaWRNsxQ2qFZX79YKGJ5z8z","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27b552608191a7ea91ae1dbd1971","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading manifest reload poll\",\"path\":\"crates/spt-daemon/src/lifecycle.rs\",\"selector\":\"440-560\"}","call_id":"call_CCO8wZZRuMKwV0V0F3p61Fd1","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27b5526881919648898e994c13c2","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading daemon config live cadence\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/daemon.json\",\"selector\":\"raw\"}","call_id":"call_tGKrkfFen6J4Lpmpzq51mblL","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27b553908191bcae838f04f01394","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project index status\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json\",\"selector\":\"raw\"}","call_id":"call_GLxPw6F8Pvb16Wxyns5Fv0hq","name":"read"}]},"duration":7018.562800005078,"ttft":2783.0403999984264,"contextSnapshot":{"promptTokens":155549,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_EFaWRNsxQ2qFZX79YKGJ5z8z|fc_034a6be5a6696b6c016a5a27b552388191a507f129608db0f7","toolName":"read","startedAt":"2026-07-17T13:01:42.059Z","args":{"path":"crates/spt-live/src/ingest.rs"},"intent":"Reading drop ingestion scan"},"id":"1db0275e","parentId":"52e2f9d0","timestamp":"2026-07-17T13:01:42.059Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CCO8wZZRuMKwV0V0F3p61Fd1|fc_034a6be5a6696b6c016a5a27b552608191a7ea91ae1dbd1971","toolName":"read","startedAt":"2026-07-17T13:01:42.059Z","args":{"path":"crates/spt-daemon/src/lifecycle.rs"},"intent":"Reading manifest reload poll"},"id":"83949027","parentId":"1db0275e","timestamp":"2026-07-17T13:01:42.059Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_tGKrkfFen6J4Lpmpzq51mblL|fc_034a6be5a6696b6c016a5a27b5526881919648898e994c13c2","toolName":"read","startedAt":"2026-07-17T13:01:42.059Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/daemon.json"},"intent":"Reading daemon config live cadence"},"id":"83dee77c","parentId":"83949027","timestamp":"2026-07-17T13:01:42.059Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GLxPw6F8Pvb16Wxyns5Fv0hq|fc_034a6be5a6696b6c016a5a27b553908191bcae838f04f01394","toolName":"read","startedAt":"2026-07-17T13:01:42.059Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json"},"intent":"Reading project index status"},"id":"fd5cb0d7","parentId":"83dee77c","timestamp":"2026-07-17T13:01:42.059Z"}
{"type":"message","id":"692f8c82","parentId":"fd5cb0d7","timestamp":"2026-07-17T13:01:42.064Z","message":{"role":"toolResult","toolCallId":"call_tGKrkfFen6J4Lpmpzq51mblL|fc_034a6be5a6696b6c016a5a27b5526881919648898e994c13c2","toolName":"read","content":[{"type":"text","text":"{\n  \"pulse_period_ms\": 5000,\n  \"protection_window_ms\": 2000,\n  \"crash_grace_ms\": 2000,\n  \"full_auto_update\": false,\n  \"relay\": \"n0\",\n  \"peer_pump\": true,\n  \"registry_pump_period_ms\": 30000,\n  \"registry_evict_after_ms\": 300000,\n  \"notif_pump_period_ms\": 15000,\n  \"sync_pull_period_ms\": 60000,\n  \"update_check_period_ms\": 3600000,\n  \"detached_subnets\": [],\n  \"worker_reap_ttl_secs\": 86400,\n  \"startup_endpoints\": [\n    {\n      \"id\": \"mobile-gw\",\n      \"adapter\": \"mobile\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    },\n    {\n      \"id\": \"lia\",\n      \"adapter\": \"claude-spt\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    }\n  ]\n}"}],"details":{"displayContent":{"text":"{\n  \"pulse_period_ms\": 5000,\n  \"protection_window_ms\": 2000,\n  \"crash_grace_ms\": 2000,\n  \"full_auto_update\": false,\n  \"relay\": \"n0\",\n  \"peer_pump\": true,\n  \"registry_pump_period_ms\": 30000,\n  \"registry_evict_after_ms\": 300000,\n  \"notif_pump_period_ms\": 15000,\n  \"sync_pull_period_ms\": 60000,\n  \"update_check_period_ms\": 3600000,\n  \"detached_subnets\": [],\n  \"worker_reap_ttl_secs\": 86400,\n  \"startup_endpoints\": [\n    {\n      \"id\": \"mobile-gw\",\n      \"adapter\": \"mobile\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    },\n    {\n      \"id\": \"lia\",\n      \"adapter\": \"claude-spt\",\n      \"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"\n    }\n  ]\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/daemon.json"}}},"isError":false,"timestamp":1784293302063}}
{"type":"message","id":"f8b809d5","parentId":"692f8c82","timestamp":"2026-07-17T13:01:42.064Z","message":{"role":"toolResult","toolCallId":"call_GLxPw6F8Pvb16Wxyns5Fv0hq|fc_034a6be5a6696b6c016a5a27b553908191bcae838f04f01394","toolName":"read","content":[{"type":"text","text":"{\"generated_ms\":1784293163753,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784293163753,\"last_duration_ms\":549,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":37,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":0,\"derivations\":0},\"cumulative\":{\"branch_enumerations\":3,\"tree_scans\":8,\"derivations\":11}}"}],"details":{"displayContent":{"text":"{\"generated_ms\":1784293163753,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784293163753,\"last_duration_ms\":549,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":37,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":0,\"derivations\":0},\"cumulative\":{\"branch_enumerations\":3,\"tree_scans\":8,\"derivations\":11}}","startLine":1,"lineNumbers":[1]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json"}}},"isError":false,"timestamp":1784293302064}}
{"type":"message","id":"f330bb40","parentId":"f8b809d5","timestamp":"2026-07-17T13:01:42.071Z","message":{"role":"toolResult","toolCallId":"call_EFaWRNsxQ2qFZX79YKGJ5z8z|fc_034a6be5a6696b6c016a5a27b552388191a507f129608db0f7","toolName":"read","content":[{"type":"text","text":"/// `id`: route each into the two-tier context store (precedence-guarded, llm\n/// source) and **delete** it (spt-core single-writer; the mind never deletes).\n///\n/// A drop is deleted whether its writes `Written` or `Suppressed` — both mean\n/// \"consumed\" (a suppressed drop was a stale snapshot, correctly discarded). A\n/// read/write *error* leaves the drop in place to retry on the next pass.\n///\n/// **Commit-before-delete (F-032, KNOWN-HAZARDS 7.40):** a non-empty\n/// `<project-context>` slice with an EMPTY `project_id` (the endpoint's anchor\n/// cwd unresolved/owlery-internal at ingest time) was never committed anywhere\n/// — deleting the drop would black-hole it. That slice is instead **preserved\n/// as a project-only pending slice under the COMMUNE suffix** (whatever the\n/// source drop's kind — a signoff-suffix pending would be reaped by the\n/// stale-signoff sweep on the next listener start): the live slice (just\n/// committed) is dropped from the pending so a retry never re-commits it, and\n/// the next ingest with a resolvable `project_id` commits + deletes. The\n/// rewrite is idempotent (the pending form re-parses to itself — no churn on\n/// steady retries), and a NEWER commune from the mind overwriting the pending\n/// file is a supersede (a fresher LLM snapshot), not a loss. An endpoint whose\n/// project id NEVER resolves (a psyche-host anchor) retains the pending\n/// indefinitely — a bounded no-op per pass, intentionally preferred over any\n/// deletion heuristic.\n// [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\npub fn ingest_drops(\n    drop_dir: &Path,\n    id: &str,\n    project_id: &str,\n    now_ms: u64,\n    window_ms: u64,\n) -> std::io::Result<Vec<Ingested>> {\n    let mut out = Vec::new();\n    for (kind, suffix) in [\n        (DropKind::Commune, COMMUNE_SUFFIX),\n        (DropKind::Signoff, SIGNOFF_SUFFIX),\n    ] {\n        let drop_path = drop_dir.join(format!(\"{id}{suffix}\"));\n        if !drop_path.exists() {\n            continue;\n        }\n        let body = std::fs::read_to_string(&drop_path)?;\n        // A dropped commune/signoff is an LLM-authored snapshot.\n        let slices = parse_two_slice(&body);\n        let writes = route_slices(\n            id,\n            project_id,\n            slices.live.as_deref(),\n            slices.project.as_deref(),\n            now_ms,\n            window_ms,\n        )?;\n        // Un-committable-now ≠ consumed: the project tier is gated on a real\n        // project_id (route_slices), so a non-empty project slice under an\n        // empty id was parsed but never written — preserve it (marker-only\n        // slices route nowhere and are NOT preserved; they carry no content).\n        // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\n        let deferred_project = project_id.is_empty()\n            && slices\n                .project\n                .as_deref()\n                .map(strip_checkpoint_markers)\n                .is_some_and(|p| !p.trim().is_empty());\n        if deferred_project {\n            let pending = format!(\n                \"<project-context>\\n{}\\n</project-context>\\n\",\n                slices.project.as_deref().unwrap_or_default()\n            );\n            // The pending ALWAYS lives under the COMMUNE suffix, whatever the\n            // source drop's kind (doyle #81 gate ruling): a `<id>-signoff.md`\n            // pending would be reaped by `signoff::sweep_stale_signoff` on the\n            // next listener start (\"a leftover must never read as a live\n            // signoff\") — recreating the black-hole on the signoff path. The\n            // pending is a pure project-slice carrier, both suffixes ingest\n            // identically, and the stale-signoff sweep never sees the commune\n            // name. A fresh commune clobbering it = the documented supersede.\n            // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\n            let pending_path = drop_dir.join(format!(\"{id}{COMMUNE_SUFFIX}\"));\n            // Idempotent: a preserved drop re-ingested before the project id\n            // resolves re-parses to this same pending form — rewrite (and log)\n            // only on a state change, never per retry tick.\n            let current = std::fs::read_to_string(&pending_path).unwrap_or_default();\n            if current != pending {\n                spt_store::atomic::atomic_write_string(&pending_path, &pending)?;\n                eprintln!(\n                    \"COMMUNE_PROJECT_DEFERRED:{id}: project context un-committable now \\\n                     (unresolved project id) — preserved as a project-only pending \\\n                     commune slice for a later resolvable ingest\"\n                );\n            }\n            // A SIGNOFF source is consumed as a drop once its deferred slice is\n            // safely carried by the commune-suffix pending: the signoff file\n            // itself must never linger (write-once-per-generation sentinel —\n            // the sweep rationale), and the live slice was committed above.\n            if kind == DropKind::Signoff {\n                std::fs::remove_file(&drop_path)?;\n            }\n            out.push(Ingested {\n                kind,\n                writes,\n                drop_path,\n                preserved: true,\n            });\n            continue;\n        }\n        // [impl->REQ-HAZARD-DROP-FILE-SINGLE-WRITER] spt-core deletes the drop\n        // after consuming it; the mind never does.\n        std::fs::remove_file(&drop_path)?;\n        out.push(Ingested {\n            kind,\n            writes,\n            drop_path,\n            preserved: false,\n        });\n    }\n    Ok(out)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::context::DEFAULT_PROTECTION_WINDOW_MS;\n    use crate::test_support::with_home;\n    use spt_store::contextstore::{live_context_file, project_context_file};\n    use spt_store::perch::tracked_dir;\n\n    fn read_live(id: &str) -> String {\n…\n    }\n…\n}\n\n[Showing lines 179-303 of 889. Use :304 to continue]"}],"details":{"truncation":{"content":"/// `id`: route each into the two-tier context store (precedence-guarded, llm\r\n/// source) and **delete** it (spt-core single-writer; the mind never deletes).\r\n///\r\n/// A drop is deleted whether its writes `Written` or `Suppressed` — both mean\r\n/// \"consumed\" (a suppressed drop was a stale snapshot, correctly discarded). A\r\n/// read/write *error* leaves the drop in place to retry on the next pass.\r\n///\r\n/// **Commit-before-delete (F-032, KNOWN-HAZARDS 7.40):** a non-empty\r\n/// `<project-context>` slice with an EMPTY `project_id` (the endpoint's anchor\r\n/// cwd unresolved/owlery-internal at ingest time) was never committed anywhere\r\n/// — deleting the drop would black-hole it. That slice is instead **preserved\r\n/// as a project-only pending slice under the COMMUNE suffix** (whatever the\r\n/// source drop's kind — a signoff-suffix pending would be reaped by the\r\n/// stale-signoff sweep on the next listener start): the live slice (just\r\n/// committed) is dropped from the pending so a retry never re-commits it, and\r\n/// the next ingest with a resolvable `project_id` commits + deletes. The\r\n/// rewrite is idempotent (the pending form re-parses to itself — no churn on\r\n/// steady retries), and a NEWER commune from the mind overwriting the pending\r\n/// file is a supersede (a fresher LLM snapshot), not a loss. An endpoint whose\r\n/// project id NEVER resolves (a psyche-host anchor) retains the pending\r\n/// indefinitely — a bounded no-op per pass, intentionally preferred over any\r\n/// deletion heuristic.\r\n// [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\npub fn ingest_drops(\r\n    drop_dir: &Path,\r\n    id: &str,\r\n    project_id: &str,\r\n    now_ms: u64,\r\n    window_ms: u64,\r\n) -> std::io::Result<Vec<Ingested>> {\r\n    let mut out = Vec::new();\r\n    for (kind, suffix) in [\r\n        (DropKind::Commune, COMMUNE_SUFFIX),\r\n        (DropKind::Signoff, SIGNOFF_SUFFIX),\r\n    ] {\r\n        let drop_path = drop_dir.join(format!(\"{id}{suffix}\"));\r\n        if !drop_path.exists() {\r\n            continue;\r\n        }\r\n        let body = std::fs::read_to_string(&drop_path)?;\r\n        // A dropped commune/signoff is an LLM-authored snapshot.\r\n        let slices = parse_two_slice(&body);\r\n        let writes = route_slices(\r\n            id,\r\n            project_id,\r\n            slices.live.as_deref(),\r\n            slices.project.as_deref(),\r\n            now_ms,\r\n            window_ms,\r\n        )?;\r\n        // Un-committable-now ≠ consumed: the project tier is gated on a real\r\n        // project_id (route_slices), so a non-empty project slice under an\r\n        // empty id was parsed but never written — preserve it (marker-only\r\n        // slices route nowhere and are NOT preserved; they carry no content).\r\n        // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\n        let deferred_project = project_id.is_empty()\r\n            && slices\r\n                .project\r\n                .as_deref()\r\n                .map(strip_checkpoint_markers)\r\n                .is_some_and(|p| !p.trim().is_empty());\r\n        if deferred_project {\r\n            let pending = format!(\r\n                \"<project-context>\\n{}\\n</project-context>\\n\",\r\n                slices.project.as_deref().unwrap_or_default()\r\n            );\r\n            // The pending ALWAYS lives under the COMMUNE suffix, whatever the\r\n            // source drop's kind (doyle #81 gate ruling): a `<id>-signoff.md`\r\n            // pending would be reaped by `signoff::sweep_stale_signoff` on the\r\n            // next listener start (\"a leftover must never read as a live\r\n            // signoff\") — recreating the black-hole on the signoff path. The\r\n            // pending is a pure project-slice carrier, both suffixes ingest\r\n            // identically, and the stale-signoff sweep never sees the commune\r\n            // name. A fresh commune clobbering it = the documented supersede.\r\n            // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\n            let pending_path = drop_dir.join(format!(\"{id}{COMMUNE_SUFFIX}\"));\r\n            // Idempotent: a preserved drop re-ingested before the project id\r\n            // resolves re-parses to this same pending form — rewrite (and log)\r\n            // only on a state change, never per retry tick.\r\n            let current = std::fs::read_to_string(&pending_path).unwrap_or_default();\r\n            if current != pending {\r\n                spt_store::atomic::atomic_write_string(&pending_path, &pending)?;\r\n                eprintln!(\r\n                    \"COMMUNE_PROJECT_DEFERRED:{id}: project context un-committable now \\\r\n                     (unresolved project id) — preserved as a project-only pending \\\r\n                     commune slice for a later resolvable ingest\"\r\n                );\r\n            }\r\n            // A SIGNOFF source is consumed as a drop once its deferred slice is\r\n            // safely carried by the commune-suffix pending: the signoff file\r\n            // itself must never linger (write-once-per-generation sentinel —\r\n            // the sweep rationale), and the live slice was committed above.\r\n            if kind == DropKind::Signoff {\r\n                std::fs::remove_file(&drop_path)?;\r\n            }\r\n            out.push(Ingested {\r\n                kind,\r\n                writes,\r\n                drop_path,\r\n                preserved: true,\r\n            });\r\n            continue;\r\n        }\r\n        // [impl->REQ-HAZARD-DROP-FILE-SINGLE-WRITER] spt-core deletes the drop\r\n        // after consuming it; the mind never does.\r\n        std::fs::remove_file(&drop_path)?;\r\n        out.push(Ingested {\r\n            kind,\r\n            writes,\r\n            drop_path,\r\n            preserved: false,\r\n        });\r\n    }\r\n    Ok(out)\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::context::DEFAULT_PROTECTION_WINDOW_MS;\r\n    use crate::test_support::with_home;\r\n    use spt_store::contextstore::{live_context_file, project_context_file};\r\n    use spt_store::perch::tracked_dir;\r\n\r\n    fn read_live(id: &str) -> String {\r","truncated":true,"truncatedBy":"lines","totalLines":711,"totalBytes":6015,"outputLines":125,"outputBytes":6015,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// `id`: route each into the two-tier context store (precedence-guarded, llm\r\n/// source) and **delete** it (spt-core single-writer; the mind never deletes).\r\n///\r\n/// A drop is deleted whether its writes `Written` or `Suppressed` — both mean\r\n/// \"consumed\" (a suppressed drop was a stale snapshot, correctly discarded). A\r\n/// read/write *error* leaves the drop in place to retry on the next pass.\r\n///\r\n/// **Commit-before-delete (F-032, KNOWN-HAZARDS 7.40):** a non-empty\r\n/// `<project-context>` slice with an EMPTY `project_id` (the endpoint's anchor\r\n/// cwd unresolved/owlery-internal at ingest time) was never committed anywhere\r\n/// — deleting the drop would black-hole it. That slice is instead **preserved\r\n/// as a project-only pending slice under the COMMUNE suffix** (whatever the\r\n/// source drop's kind — a signoff-suffix pending would be reaped by the\r\n/// stale-signoff sweep on the next listener start): the live slice (just\r\n/// committed) is dropped from the pending so a retry never re-commits it, and\r\n/// the next ingest with a resolvable `project_id` commits + deletes. The\r\n/// rewrite is idempotent (the pending form re-parses to itself — no churn on\r\n/// steady retries), and a NEWER commune from the mind overwriting the pending\r\n/// file is a supersede (a fresher LLM snapshot), not a loss. An endpoint whose\r\n/// project id NEVER resolves (a psyche-host anchor) retains the pending\r\n/// indefinitely — a bounded no-op per pass, intentionally preferred over any\r\n/// deletion heuristic.\r\n// [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\npub fn ingest_drops(\r\n    drop_dir: &Path,\r\n    id: &str,\r\n    project_id: &str,\r\n    now_ms: u64,\r\n    window_ms: u64,\r\n) -> std::io::Result<Vec<Ingested>> {\r\n    let mut out = Vec::new();\r\n    for (kind, suffix) in [\r\n        (DropKind::Commune, COMMUNE_SUFFIX),\r\n        (DropKind::Signoff, SIGNOFF_SUFFIX),\r\n    ] {\r\n        let drop_path = drop_dir.join(format!(\"{id}{suffix}\"));\r\n        if !drop_path.exists() {\r\n            continue;\r\n        }\r\n        let body = std::fs::read_to_string(&drop_path)?;\r\n        // A dropped commune/signoff is an LLM-authored snapshot.\r\n        let slices = parse_two_slice(&body);\r\n        let writes = route_slices(\r\n            id,\r\n            project_id,\r\n            slices.live.as_deref(),\r\n            slices.project.as_deref(),\r\n            now_ms,\r\n            window_ms,\r\n        )?;\r\n        // Un-committable-now ≠ consumed: the project tier is gated on a real\r\n        // project_id (route_slices), so a non-empty project slice under an\r\n        // empty id was parsed but never written — preserve it (marker-only\r\n        // slices route nowhere and are NOT preserved; they carry no content).\r\n        // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\n        let deferred_project = project_id.is_empty()\r\n            && slices\r\n                .project\r\n                .as_deref()\r\n                .map(strip_checkpoint_markers)\r\n                .is_some_and(|p| !p.trim().is_empty());\r\n        if deferred_project {\r\n            let pending = format!(\r\n                \"<project-context>\\n{}\\n</project-context>\\n\",\r\n                slices.project.as_deref().unwrap_or_default()\r\n            );\r\n            // The pending ALWAYS lives under the COMMUNE suffix, whatever the\r\n            // source drop's kind (doyle #81 gate ruling): a `<id>-signoff.md`\r\n            // pending would be reaped by `signoff::sweep_stale_signoff` on the\r\n            // next listener start (\"a leftover must never read as a live\r\n            // signoff\") — recreating the black-hole on the signoff path. The\r\n            // pending is a pure project-slice carrier, both suffixes ingest\r\n            // identically, and the stale-signoff sweep never sees the commune\r\n            // name. A fresh commune clobbering it = the documented supersede.\r\n            // [impl->REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE]\r\n            let pending_path = drop_dir.join(format!(\"{id}{COMMUNE_SUFFIX}\"));\r\n            // Idempotent: a preserved drop re-ingested before the project id\r\n            // resolves re-parses to this same pending form — rewrite (and log)\r\n            // only on a state change, never per retry tick.\r\n            let current = std::fs::read_to_string(&pending_path).unwrap_or_default();\r\n            if current != pending {\r\n                spt_store::atomic::atomic_write_string(&pending_path, &pending)?;\r\n                eprintln!(\r\n                    \"COMMUNE_PROJECT_DEFERRED:{id}: project context un-committable now \\\r\n                     (unresolved project id) — preserved as a project-only pending \\\r\n                     commune slice for a later resolvable ingest\"\r\n                );\r\n            }\r\n            // A SIGNOFF source is consumed as a drop once its deferred slice is\r\n            // safely carried by the commune-suffix pending: the signoff file\r\n            // itself must never linger (write-once-per-generation sentinel —\r\n            // the sweep rationale), and the live slice was committed above.\r\n            if kind == DropKind::Signoff {\r\n                std::fs::remove_file(&drop_path)?;\r\n            }\r\n            out.push(Ingested {\r\n                kind,\r\n                writes,\r\n                drop_path,\r\n                preserved: true,\r\n            });\r\n            continue;\r\n        }\r\n        // [impl->REQ-HAZARD-DROP-FILE-SINGLE-WRITER] spt-core deletes the drop\r\n        // after consuming it; the mind never does.\r\n        std::fs::remove_file(&drop_path)?;\r\n        out.push(Ingested {\r\n            kind,\r\n            writes,\r\n            drop_path,\r\n            preserved: false,\r\n        });\r\n    }\r\n    Ok(out)\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::context::DEFAULT_PROTECTION_WINDOW_MS;\r\n    use crate::test_support::with_home;\r\n    use spt_store::contextstore::{live_context_file, project_context_file};\r\n    use spt_store::perch::tracked_dir;\r\n\r\n    fn read_live(id: &str) -> String {\r\n…\n    }\n…\n}","startLine":179,"lineNumbers":[179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,null,305,null,888]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-live\\src\\ingest.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":889,"totalBytes":6015,"outputLines":125,"outputBytes":6015,"shownRange":{"start":179,"end":303},"nextOffset":304}}},"isError":false,"timestamp":1784293302071}}
{"type":"message","id":"22decc6f","parentId":"f330bb40","timestamp":"2026-07-17T13:01:42.089Z","message":{"role":"toolResult","toolCallId":"call_CCO8wZZRuMKwV0V0F3p61Fd1|fc_034a6be5a6696b6c016a5a27b552608191a7ea91ae1dbd1971","toolName":"read","content":[{"type":"text","text":"    pub fn with_config_in(\n…\n    ) -> Option<BrainLifecycle> {\n…\n        Some(BrainLifecycle {\n            cell: ManifestCell::new(manifest.clone(), install_dir),\n            install_dir: install_dir.map(Path::to_path_buf),\n            id: id.to_string(),\n            commune_dir,\n            signoff_dir: manifest.session.signoff_dir.as_ref().map(PathBuf::from),\n            cfg,\n            // Resolve the advertised label once, here (brain startup), not per fill.\n            node_label: spt_store::hostlabel::node_fill_label(None),\n        })\n    }\n\n    /// Refresh this endpoint's manifest + runtime in place — a thin delegate to\n    /// the shared cell. The production trigger is [`reload_manifest_if_changed`]\n    /// (the brain pulling an on-disk swap); this direct entry exists for tests and\n    /// any in-process caller. Brain-parity: nothing else cycles. (W3c)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    pub fn refresh_manifest(&self, new: Manifest, install_dir: Option<&Path>) {\n        self.cell.refresh(new, install_dir);\n    }\n\n    /// The sha256 of this endpoint's on-disk manifest (`<install_dir>/manifest.toml`),\n    /// or `None` when there is no pinned install dir / the file can't be read.\n    /// The W3c reload-on-dirty change detector. (W3c)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    fn manifest_disk_hash(&self) -> Option<String> {\n        let dir = self.install_dir.as_ref()?;\n        let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;\n        Some(crate::release::sha256_hex(&bytes))\n    }\n\n    /// W3c reload-on-dirty. If the on-disk manifest hash differs from `last`,\n    /// re-read + parse it and [`refresh`](ManifestCell::refresh) the live cell in\n    /// place — so a daemon-coordinated adapter update (W3d) that swapped the\n    /// install dir takes effect within one pulse, WITHOUT restarting the brain or\n    /// the endpoint. The broker (`daemon run`) and this brain (`daemon brain`\n    /// child) are SEPARATE PROCESSES with no shared memory, so the apply cannot\n    /// push an `Arc` handle across — the brain PULLS the change from disk here\n    /// (corrects ADR-0025 step 3 + the W3 verdict's \"broker registers the brain's\n    /// handle\" caution). Re-parses the SAME bytes it hashed; W3b's atomic rename\n    /// guarantees a whole old-or-new file (never a torn read). A transient\n    /// unparseable manifest leaves the cell on the last-good one and retries next\n    /// pulse (does not advance `last`), and never kills the loop. (W3c, ADR-0025)\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\n    fn reload_manifest_if_changed(&self, last: &mut Option<String>) {\n        let Some(dir) = self.install_dir.as_ref() else {\n            return;\n        };\n        let Ok(bytes) = std::fs::read(dir.join(\"manifest.toml\")) else {\n            return;\n        };\n        let hash = crate::release::sha256_hex(&bytes);\n        if last.as_deref() == Some(hash.as_str()) {\n            return;\n        }\n        match std::str::from_utf8(&bytes)\n            .ok()\n            .and_then(|s| Manifest::from_toml_str(s).ok())\n        {\n            Some(new) => {\n                self.cell.refresh(new, Some(dir));\n                *last = Some(hash);\n            }\n            None => { /* unparseable mid-publish: keep last-good, retry next pulse */ }\n        }\n    }\n\n    /// The configured pulse period (config-driven, not a constant).\n    pub fn pulse_period(&self) -> Duration {\n        self.cfg.pulse_period\n    }\n\n    /// Base substitution keys spt-core fills for the lifecycle templates.\n    fn base_keys(&self, session_id: Option<&str>) -> BTreeMap<String, String> {\n        let mut k = BTreeMap::new();\n        k.insert(\"id\".to_string(), self.id.clone());\n        if let Some(sid) = session_id {\n            k.insert(\"session_id\".to_string(), sid.to_string());\n        }\n        // `{node}` (REQ-MANIFEST-NODE-KEY): the startup-resolved advertised label,\n        // inserted ONLY when known — absent → a `{node}` reference fails LOUD, never\n        // an empty token.\n        if let Some(node) = self.node_label.as_deref().filter(|s| !s.is_empty()) {\n            k.insert(\"node\".to_string(), node.to_string());\n        }\n        // `{subnet}` (F-030 W4, REQ-PSYCHE-NESTED-RESOLUTION): the endpoint's\n        // home-subnet label (`own_subnet` — the parent info.json `home_subnet`, `local`\n        // when unhomed). Inserted ONLY when non-empty — the SAME insert-when-known,\n        // loud-if-absent contract as `{node}` (a referenced-but-absent key fails LOUD,\n        // never an empty token). `own_subnet` is TOTAL (`local` fallback), so this is\n        // always present in practice; the guard preserves the loud-absent invariant for\n        // any future caller that builds keys without it. NO `{home}` key (doyle W4 Q1:\n        // `home:` is already the subnet-name qualifier position — a `{home}` key would\n        // invite meaning-drift).\n        let subnet = self.own_subnet();\n        if !subnet.is_empty() {\n            k.insert(\"subnet\".to_string(), subnet);\n        }\n        k\n    }\n\n    /// The unique watched drop dirs (commune + signoff; usually the same dir).\n    fn drop_dirs(&self) -> Vec<PathBuf> {\n        let mut dirs: Vec<PathBuf> = Vec::new();\n        for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]\n            .into_iter()\n            .flatten()\n        {\n            if !dirs.contains(d) {\n                dirs.push(d.clone());\n            }\n        }\n        dirs\n    }\n\n    /// Sweep a stale signoff sentinel on start (3.2). No-op without a signoff dir.\n    pub fn sweep_on_start(&self) {\n        if let Some(dir) = &self.signoff_dir {\n            let _ = sweep_stale_signoff(dir, &self.id);\n        }\n    }\n\n    /// Mark a daemon-hosted perch `offline` — the teardown counterpart of the\n    /// `online` stamp a daemon-hosted perch carries (a hosted psyche perch, an\n    /// spt-hosted Self). From this point the single liveness resolver reports the\n\n[Showing lines 439-563 of 2921. Use :564 to continue]"}],"details":{"truncation":{"content":"        Some(BrainLifecycle {\r\n            cell: ManifestCell::new(manifest.clone(), install_dir),\r\n            install_dir: install_dir.map(Path::to_path_buf),\r\n            id: id.to_string(),\r\n            commune_dir,\r\n            signoff_dir: manifest.session.signoff_dir.as_ref().map(PathBuf::from),\r\n            cfg,\r\n            // Resolve the advertised label once, here (brain startup), not per fill.\r\n            node_label: spt_store::hostlabel::node_fill_label(None),\r\n        })\r\n    }\r\n\r\n    /// Refresh this endpoint's manifest + runtime in place — a thin delegate to\r\n    /// the shared cell. The production trigger is [`reload_manifest_if_changed`]\r\n    /// (the brain pulling an on-disk swap); this direct entry exists for tests and\r\n    /// any in-process caller. Brain-parity: nothing else cycles. (W3c)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    pub fn refresh_manifest(&self, new: Manifest, install_dir: Option<&Path>) {\r\n        self.cell.refresh(new, install_dir);\r\n    }\r\n\r\n    /// The sha256 of this endpoint's on-disk manifest (`<install_dir>/manifest.toml`),\r\n    /// or `None` when there is no pinned install dir / the file can't be read.\r\n    /// The W3c reload-on-dirty change detector. (W3c)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    fn manifest_disk_hash(&self) -> Option<String> {\r\n        let dir = self.install_dir.as_ref()?;\r\n        let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;\r\n        Some(crate::release::sha256_hex(&bytes))\r\n    }\r\n\r\n    /// W3c reload-on-dirty. If the on-disk manifest hash differs from `last`,\r\n    /// re-read + parse it and [`refresh`](ManifestCell::refresh) the live cell in\r\n    /// place — so a daemon-coordinated adapter update (W3d) that swapped the\r\n    /// install dir takes effect within one pulse, WITHOUT restarting the brain or\r\n    /// the endpoint. The broker (`daemon run`) and this brain (`daemon brain`\r\n    /// child) are SEPARATE PROCESSES with no shared memory, so the apply cannot\r\n    /// push an `Arc` handle across — the brain PULLS the change from disk here\r\n    /// (corrects ADR-0025 step 3 + the W3 verdict's \"broker registers the brain's\r\n    /// handle\" caution). Re-parses the SAME bytes it hashed; W3b's atomic rename\r\n    /// guarantees a whole old-or-new file (never a torn read). A transient\r\n    /// unparseable manifest leaves the cell on the last-good one and retries next\r\n    /// pulse (does not advance `last`), and never kills the loop. (W3c, ADR-0025)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    fn reload_manifest_if_changed(&self, last: &mut Option<String>) {\r\n        let Some(dir) = self.install_dir.as_ref() else {\r\n            return;\r\n        };\r\n        let Ok(bytes) = std::fs::read(dir.join(\"manifest.toml\")) else {\r\n            return;\r\n        };\r\n        let hash = crate::release::sha256_hex(&bytes);\r\n        if last.as_deref() == Some(hash.as_str()) {\r\n            return;\r\n        }\r\n        match std::str::from_utf8(&bytes)\r\n            .ok()\r\n            .and_then(|s| Manifest::from_toml_str(s).ok())\r\n        {\r\n            Some(new) => {\r\n                self.cell.refresh(new, Some(dir));\r\n                *last = Some(hash);\r\n            }\r\n            None => { /* unparseable mid-publish: keep last-good, retry next pulse */ }\r\n        }\r\n    }\r\n\r\n    /// The configured pulse period (config-driven, not a constant).\r\n    pub fn pulse_period(&self) -> Duration {\r\n        self.cfg.pulse_period\r\n    }\r\n\r\n    /// Base substitution keys spt-core fills for the lifecycle templates.\r\n    fn base_keys(&self, session_id: Option<&str>) -> BTreeMap<String, String> {\r\n        let mut k = BTreeMap::new();\r\n        k.insert(\"id\".to_string(), self.id.clone());\r\n        if let Some(sid) = session_id {\r\n            k.insert(\"session_id\".to_string(), sid.to_string());\r\n        }\r\n        // `{node}` (REQ-MANIFEST-NODE-KEY): the startup-resolved advertised label,\r\n        // inserted ONLY when known — absent → a `{node}` reference fails LOUD, never\r\n        // an empty token.\r\n        if let Some(node) = self.node_label.as_deref().filter(|s| !s.is_empty()) {\r\n            k.insert(\"node\".to_string(), node.to_string());\r\n        }\r\n        // `{subnet}` (F-030 W4, REQ-PSYCHE-NESTED-RESOLUTION): the endpoint's\r\n        // home-subnet label (`own_subnet` — the parent info.json `home_subnet`, `local`\r\n        // when unhomed). Inserted ONLY when non-empty — the SAME insert-when-known,\r\n        // loud-if-absent contract as `{node}` (a referenced-but-absent key fails LOUD,\r\n        // never an empty token). `own_subnet` is TOTAL (`local` fallback), so this is\r\n        // always present in practice; the guard preserves the loud-absent invariant for\r\n        // any future caller that builds keys without it. NO `{home}` key (doyle W4 Q1:\r\n        // `home:` is already the subnet-name qualifier position — a `{home}` key would\r\n        // invite meaning-drift).\r\n        let subnet = self.own_subnet();\r\n        if !subnet.is_empty() {\r\n            k.insert(\"subnet\".to_string(), subnet);\r\n        }\r\n        k\r\n    }\r\n\r\n    /// The unique watched drop dirs (commune + signoff; usually the same dir).\r\n    fn drop_dirs(&self) -> Vec<PathBuf> {\r\n        let mut dirs: Vec<PathBuf> = Vec::new();\r\n        for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]\r\n            .into_iter()\r\n            .flatten()\r\n        {\r\n            if !dirs.contains(d) {\r\n                dirs.push(d.clone());\r\n            }\r\n        }\r\n        dirs\r\n    }\r\n\r\n    /// Sweep a stale signoff sentinel on start (3.2). No-op without a signoff dir.\r\n    pub fn sweep_on_start(&self) {\r\n        if let Some(dir) = &self.signoff_dir {\r\n            let _ = sweep_stale_signoff(dir, &self.id);\r\n        }\r\n    }\r\n\r\n    /// Mark a daemon-hosted perch `offline` — the teardown counterpart of the\r\n    /// `online` stamp a daemon-hosted perch carries (a hosted psyche perch, an\r\n    /// spt-hosted Self). From this point the single liveness resolver reports the\r","truncated":true,"truncatedBy":"lines","totalLines":2483,"totalBytes":6013,"outputLines":125,"outputBytes":6013,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn with_config_in(\n…\n    ) -> Option<BrainLifecycle> {\n…\n        Some(BrainLifecycle {\r\n            cell: ManifestCell::new(manifest.clone(), install_dir),\r\n            install_dir: install_dir.map(Path::to_path_buf),\r\n            id: id.to_string(),\r\n            commune_dir,\r\n            signoff_dir: manifest.session.signoff_dir.as_ref().map(PathBuf::from),\r\n            cfg,\r\n            // Resolve the advertised label once, here (brain startup), not per fill.\r\n            node_label: spt_store::hostlabel::node_fill_label(None),\r\n        })\r\n    }\r\n\r\n    /// Refresh this endpoint's manifest + runtime in place — a thin delegate to\r\n    /// the shared cell. The production trigger is [`reload_manifest_if_changed`]\r\n    /// (the brain pulling an on-disk swap); this direct entry exists for tests and\r\n    /// any in-process caller. Brain-parity: nothing else cycles. (W3c)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    pub fn refresh_manifest(&self, new: Manifest, install_dir: Option<&Path>) {\r\n        self.cell.refresh(new, install_dir);\r\n    }\r\n\r\n    /// The sha256 of this endpoint's on-disk manifest (`<install_dir>/manifest.toml`),\r\n    /// or `None` when there is no pinned install dir / the file can't be read.\r\n    /// The W3c reload-on-dirty change detector. (W3c)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    fn manifest_disk_hash(&self) -> Option<String> {\r\n        let dir = self.install_dir.as_ref()?;\r\n        let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;\r\n        Some(crate::release::sha256_hex(&bytes))\r\n    }\r\n\r\n    /// W3c reload-on-dirty. If the on-disk manifest hash differs from `last`,\r\n    /// re-read + parse it and [`refresh`](ManifestCell::refresh) the live cell in\r\n    /// place — so a daemon-coordinated adapter update (W3d) that swapped the\r\n    /// install dir takes effect within one pulse, WITHOUT restarting the brain or\r\n    /// the endpoint. The broker (`daemon run`) and this brain (`daemon brain`\r\n    /// child) are SEPARATE PROCESSES with no shared memory, so the apply cannot\r\n    /// push an `Arc` handle across — the brain PULLS the change from disk here\r\n    /// (corrects ADR-0025 step 3 + the W3 verdict's \"broker registers the brain's\r\n    /// handle\" caution). Re-parses the SAME bytes it hashed; W3b's atomic rename\r\n    /// guarantees a whole old-or-new file (never a torn read). A transient\r\n    /// unparseable manifest leaves the cell on the last-good one and retries next\r\n    /// pulse (does not advance `last`), and never kills the loop. (W3c, ADR-0025)\r\n    // [impl->REQ-ADAPTER-LIVE-UPDATE]\r\n    fn reload_manifest_if_changed(&self, last: &mut Option<String>) {\r\n        let Some(dir) = self.install_dir.as_ref() else {\r\n            return;\r\n        };\r\n        let Ok(bytes) = std::fs::read(dir.join(\"manifest.toml\")) else {\r\n            return;\r\n        };\r\n        let hash = crate::release::sha256_hex(&bytes);\r\n        if last.as_deref() == Some(hash.as_str()) {\r\n            return;\r\n        }\r\n        match std::str::from_utf8(&bytes)\r\n            .ok()\r\n            .and_then(|s| Manifest::from_toml_str(s).ok())\r\n        {\r\n            Some(new) => {\r\n                self.cell.refresh(new, Some(dir));\r\n                *last = Some(hash);\r\n            }\r\n            None => { /* unparseable mid-publish: keep last-good, retry next pulse */ }\r\n        }\r\n    }\r\n\r\n    /// The configured pulse period (config-driven, not a constant).\r\n    pub fn pulse_period(&self) -> Duration {\r\n        self.cfg.pulse_period\r\n    }\r\n\r\n    /// Base substitution keys spt-core fills for the lifecycle templates.\r\n    fn base_keys(&self, session_id: Option<&str>) -> BTreeMap<String, String> {\r\n        let mut k = BTreeMap::new();\r\n        k.insert(\"id\".to_string(), self.id.clone());\r\n        if let Some(sid) = session_id {\r\n            k.insert(\"session_id\".to_string(), sid.to_string());\r\n        }\r\n        // `{node}` (REQ-MANIFEST-NODE-KEY): the startup-resolved advertised label,\r\n        // inserted ONLY when known — absent → a `{node}` reference fails LOUD, never\r\n        // an empty token.\r\n        if let Some(node) = self.node_label.as_deref().filter(|s| !s.is_empty()) {\r\n            k.insert(\"node\".to_string(), node.to_string());\r\n        }\r\n        // `{subnet}` (F-030 W4, REQ-PSYCHE-NESTED-RESOLUTION): the endpoint's\r\n        // home-subnet label (`own_subnet` — the parent info.json `home_subnet`, `local`\r\n        // when unhomed). Inserted ONLY when non-empty — the SAME insert-when-known,\r\n        // loud-if-absent contract as `{node}` (a referenced-but-absent key fails LOUD,\r\n        // never an empty token). `own_subnet` is TOTAL (`local` fallback), so this is\r\n        // always present in practice; the guard preserves the loud-absent invariant for\r\n        // any future caller that builds keys without it. NO `{home}` key (doyle W4 Q1:\r\n        // `home:` is already the subnet-name qualifier position — a `{home}` key would\r\n        // invite meaning-drift).\r\n        let subnet = self.own_subnet();\r\n        if !subnet.is_empty() {\r\n            k.insert(\"subnet\".to_string(), subnet);\r\n        }\r\n        k\r\n    }\r\n\r\n    /// The unique watched drop dirs (commune + signoff; usually the same dir).\r\n    fn drop_dirs(&self) -> Vec<PathBuf> {\r\n        let mut dirs: Vec<PathBuf> = Vec::new();\r\n        for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]\r\n            .into_iter()\r\n            .flatten()\r\n        {\r\n            if !dirs.contains(d) {\r\n                dirs.push(d.clone());\r\n            }\r\n        }\r\n        dirs\r\n    }\r\n\r\n    /// Sweep a stale signoff sentinel on start (3.2). No-op without a signoff dir.\r\n    pub fn sweep_on_start(&self) {\r\n        if let Some(dir) = &self.signoff_dir {\r\n            let _ = sweep_stale_signoff(dir, &self.id);\r\n        }\r\n    }\r\n\r\n    /// Mark a daemon-hosted perch `offline` — the teardown counterpart of the\r\n    /// `online` stamp a daemon-hosted perch carries (a hosted psyche perch, an\r\n    /// spt-hosted Self). From this point the single liveness resolver reports the\r","startLine":423,"lineNumbers":[423,null,428,null,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\lifecycle.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2921,"totalBytes":6013,"outputLines":125,"outputBytes":6013,"shownRange":{"start":439,"end":563},"nextOffset":564}}},"isError":false,"timestamp":1784293302089}}
{"type":"message","id":"40d0e66e","parentId":"22decc6f","timestamp":"2026-07-17T13:02:11.419Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing pump CPU usage impact**\n\n**Analyzing pump periodic failure cadence**\n\n**Tracing failure handling timing clusters**"},{"type":"thinking","thinking":"**Verifying feed batch processing**"},{"type":"toolCall","id":"call_Fz9oB9JuGZTIQv2SeKfmPnDM|fc_034a6be5a6696b6c016a5a27d2f35081919e162a10d6b9acf5","name":"read","arguments":{"i":"Reading registry dispatcher worker","path":"crates/spt-daemon/src/dispatch.rs","selector":"960-1085"}},{"type":"toolCall","id":"call_CllDX580odkF5Mk8hb8T3Elz|fc_034a6be5a6696b6c016a5a27d2f3a881918edfcc2405f9cb65","name":"read","arguments":{"i":"Reading registry apply transaction","path":"crates/spt-daemon/src/registryhost.rs","selector":"1050-1210"}},{"type":"toolCall","id":"call_PQIP2YnMDzHKJc003nSe4AwF|fc_034a6be5a6696b6c016a5a27d2f3bc819182164ca9f3ab7267","name":"read","arguments":{"i":"Reading registry advertise scan","path":"crates/spt-daemon/src/registryhost.rs","selector":"430-600"}},{"type":"toolCall","id":"call_sou7DaghQQJ7xU0lsiW5oeo4|fc_034a6be5a6696b6c016a5a27d2f3c48191bfec2b8f9e5797f9","name":"read","arguments":{"i":"Reading pump constants","path":"crates/spt-daemon/src/pump/mod.rs","selector":"85-125"}},{"type":"toolCall","id":"call_9BpW5Cee6yCePYHs9XgJmLQJ|fc_034a6be5a6696b6c016a5a27d2f3c8819182d16ace3d6eccd0","name":"read","arguments":{"i":"Reading pump configuration constants","path":"crates/spt-daemon/src/config.rs","selector":"15-50"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5910,"output":837,"cacheRead":153088,"cacheWrite":0,"totalTokens":159835,"reasoningTokens":636,"cost":{"input":0.029550000000000003,"output":0.02511,"cacheRead":0.076544,"cacheWrite":0,"total":0.131204}},"stopReason":"toolUse","timestamp":1784293302139,"responseId":"resp_034a6be5a6696b6c016a5a27b6c90481918d3679b28195d7dd","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27ba5b60819196933ed6849902b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWifNoDxjt2DoAI94JsdOxjeyUmjzDUWzepH2eYpLlxoncieJhbUuUkW37xEEbakCP5Y_MggHLsWMMmH-LdfeFVeB51IWo6AvB5Hi9YPewdNzcMc7b18Skkkuuisir63ZAszzT5Ufl3Gh1kQCdnPWXJTb4382DNEGnoQYYHmwqedbKejFthGQEuir163pb4zH5Vz76h7wUJTPaNSBRiNBQmdZANpKrv2qAyVS9qbl6D1lj4kqEHTSlEKu_rpqsr5OT1WjeEFSGF57B8CuxyowjvFyB30GS0yt7LUtGTYzktzUjUqHhnynmjo8KACWNMtd5xXrCSdWlQ0E-D8GkADqJIdyGsyMvWdLiwCK1KOrlMMO8oLlT9UOjJTZh4IcCJxjL8SHeA4frrn2_1xFoJ9vNuSPT_AyaImiumMccefZ9fHDxEhAZAtytJBy6rHNfEMVxw_Gj-XN5JY-vaEYtbxWz7KybLjSOMpk6cu8Q_hUh80f0IUASxXO727K-3jNYs8jSzWcuB4haVOPeK85veQJ0AJpng9E4b-WQSVtRMdtY1-aS_7IKe6JG4fjVXGmws4A0yADJXKbBzas7umoM7I1SNzd6YRdxaxU0wA3O8R76rv1KcLBL2xq_8KxuFwZFEVaO1oomXA7HpHvqpPeKRYrWVrGo2yntunxh68PZmn0Y9EWrtgdxHacx65JyG1atYOlFWiGRF6yTVHsEE5JfjDrNi5HYWlBhVcCz9paR3JODtBiR9lJbSDeKxUoZhw21vOSP-71PBsXo1eJ6r2Z1v8SFya1-41PafwHEU_I4HXh4BNWVIbpp9jv6In6PbFrGfzZBi3t992VMLkM4wT45gJczlOwXkfLhommnaPAy1YE0rAi1791j8Law6N61WDdbO0TSbDm5HF0qEyfAxIUs-7bXICSFUg6P_PyR4y4JSjRUL1cvnB2inK_DdmT0AbE7V9wPeIeNJi1_ut54rZSUobmclmJrR2RCPubmKlOf5G7Kgom8U2YLDKf_kPbXHPGFJ1XdwuZQs864BADZ3l0XfT6z2BBaxkUfXKa0z3qVTuMxaHipIfTf5Lc9Q7RtC191GwjvmnYVy2YyuzaGyu3IlfhpV4FNFnf3GvWrHo-mE8t94MZXmRMEi3sVivllmDrRF5tb8CSsPNTUmW3RLf_S6Vofkm56RneQQI0hmZm21dLYkatJLmk6HmTxW56c3zmjra0el0XwS1NDnahiPABTKAISygb-bDDXoAoKPTgX8CyYVc7OI028bVcZDInqQWD4XztMDiyVgCOVF3QVSoF2YSqSuiRBts_0hMNYgKZvc8SZAJHxPSUfulTK3Xb4PEhiFTZQN1Zk1yVK_E4dfILryLqYPQr--9rDZiTZAFlb03jSLxQHgdEI_4dFCK0RlKOOKkReEvrvC9h7E_JuLAaEAUrA6mUwaPMAR49elX1se3EBVa1_S9VDhiiPFBihz1JvSkNp4fS8DPdi1VjKiezbuQQ2d8Wtj-apAQrEpgX0LYhaCLRhtn-XJfDaeyk4tkBuHu_RPIDDE7erL7s7Mm51MRA9Pz04M0z1B1Tyy9PtW79OxeYfvTpbRag_iB5cvOgAvBdupvUciBlmwrWVw-HSxxf6HUWcpeYMp5pP5n-sj3gLAoWE2HhWVh0vc5pHWPsQdsNobz1OLUJ_2vZ2CfMhB37cl409_6VJugSY4Ygaol7ra1Xas3tCOwlGgvJ9qRdwyIWy8b4nWCQshPQ5ijSAfbVa5BoTVpNtmujGmdZcsN1MX0edAoIC2AQ_l1Q-4LQcvolpTJjw6NDpIbhl8un25_QCIjXL_Vcdt0dH0-K5u56sx_F8Kx1qgDN0f9ssOjxNSE180wvuSul9Qc9OSOZzBt3jxl4wpVFfbzTRPnviVfbkyiJSLDhbpjxDeA6umixs1B5WspTuTmaxkzOg7o7o_BoC0SXx2Mo1FThbLJ689DriIkODTSzFWPxj6EuV-y969PFfU-jLfOEkW0Ox2TyOKm-wvMpTtArZwAd8ysnBlMUs45fDQx5BOw3z6AN2aHx9umSfNc5MWjhJDKxnK86oOnLQE0zPqBOLg4cedrwUOAi_jNFOoi-m-2ltDZ2eqAE2eupZouiZUVykdzoj_18oBDAJX6RNKRb9_R88j6ChFXj0lHaXvclrqEV33Xs0amp8luiXWMIMcoYvrJualhkiX-vUw5FSVpiK7cJEMErW8GQESJkXRm5OIYlKX_zU4pOGTyJORhtuxDJqnao87h51T-A3D9jBkg4WSA_s9fLfpZckUyugvoHlK714i-78_DnizEPQC5kEQ4GmQ76_xsY7vPwHOHT7iqdp7-Q-3F-UwYtB9LeehvHedHG_NW9e3k_ZB7aya0OGGzlcK_xzP7-4LosnVff7DZNpaK6YLG-Yu1ehH2jbWRVsayaE8IuUMJACu12gbwDA3pyrtMxuwttio9RHnrw-txfwVj7FZA8usspMoBJdud-oK06U6RYpTE4u0H80hP9KQ0GcLcYNuUe1CW3eWrYIotWY9Hkya0bKFlabXFYOqli9jWlxaWOY8NHMprZer0w8vxTFtoG6BZHnpyVt92pa7hVjhlCa0wKyGT4A_QWSqIjYSLvYAm8wzGevsuDCGCFapJcYj_tMNifLrobIjFTPHVCwtdrmSr3Gnx08A4msytAJfCwHZ4_fXhI8ObgDSFu5CkhIaQbdhKXR8lIZFHlbwJZ2bXN3OWpsNerTmtq8p3Qdv8j546b391nBsmYWxx-jyPzBr7p_5ufH8nwNTC7XKv0AUUdmrlmw0-qAjXkcSF9Vby3ktxMYVp5u2Ot_-o_b0A6GHvQd7uetYjVtd5_I5PNaZVufjgAelVYwQVe3Y54LKiMg-1WBIu59P_re57NqaXGeAUdy2KA11XNmkxMJD0yubjZ5KtwyQjfzcafdg-owBFUywm4_NViOXvUkzPpxtdVwrzFjS59rH3bVTHYdVnEEpV33pFVweaVf_gL14SZ0OgSkbmb35d-C8bfjn6RfC_JkRRcUB_339UNW2XkhXWJf49nfvL8ZDMwMejl5T-SeY4hDQn0oTtYSnOuQmOdYXtsRvTiduRet3RZfyQNPhVCmDLPTFA904aE2ojxd_QrnCUjJ-TRp9JEwZRUkzcEG2asb08eMBqIi6B418p_SNK8f4EdVaelas0BnZ77pHKxbhjPTaXClgEKSf8agZtCPuw0vUM88FVCbMzyYsCSeld1zqTyWUu0qrIm-QONurU2D_kkceTvqhiFjEHl2D5AfiGKs4G1qkgere3L5qHYOTQn0fdU3ZhJrs_JT-IobCMLQsaDR9ED_-nO8nkV_WA4opyrYoz_6oGtEANLzB9Cs2gf0UlOw1K_LmjZL9cjUgrltU-mcXY5QU43EjTFOzV_-TaoWlpqS8Y6nyJ0Clp8-mNCayPJAuPN03kr9MGsCG23c34WfsW6VzTuhTzuj75hdv8NBA-V_GbXNv45c1S1mh6zLG6j2gJYgW69lUkFIdl6f4r7zj3LpWsiEI6RIYkD8J-HGtg_QOQQD5w9nGGy2CdeiNY8AkPWxkoTQAoI8OZL6MVM-lJvK_X23H-36Kw0KcKGhf9eVyX3XijkS-wC9yXCG9dKwpn0heoCMB_OjijEuTnd9IvAS1NCiVzHekjzJ_CKCV0NqUh4tbFbj92GVT-bOqix_pCOU9SnaLoIHW-uodqMyv2mnzNsAX3YjlpOfatSGHWbEzMoj17bVz_KbjytrJaaJV_QiXxYBPN_hQOp79YMCSzpcxoFb_D89sQqcfPitMMehc5DJ-6xthQAl4wV5fuLqe49Sdtvzw8Ol81z0WVCEQJqxYDer0O6aDI8-w3OdFZ4dzXyA-Spmr5KPStqGwkkEgHo92tYzlz-8TMt91Uexm7m56YhNtzp8cZ1WDHy5bF_1SOKrUCQJSo_iMlpYp4D6EIt-pFjA9Rs-G0HlO02L4qunDbGLtVrBsIEt3kE3vYdBKiNX7T-BGUjLgl8257x81E_8Ifu4k3YIk1YMdVpvo_d5Hccq-S9lPHlEZ2D34bh2AQtArbOY1CLhNM5omBWkXq8PCWDRpkKgjry_FEF1l8LhLTYmEJwjk5T","summary":[{"type":"summary_text","text":"**Assessing pump CPU usage impact**"},{"type":"summary_text","text":"**Analyzing pump periodic failure cadence**"},{"type":"summary_text","text":"**Tracing failure handling timing clusters**"}]},{"id":"rs_034a6be5a6696b6c016a5a27cd60648191b7ab911e1e203f91","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWifS7MY2wm9qaQOMR5rSwo2yDCdk4bwZ3CKG97_7a-u1MQdiGNX2ljXIB1jMIwfNS35Ro5ig6gavjCazAHkeCXKjyjainL8lzGg_bkdkkhnGhYyaDzPFj9Gtoxa2UDUFcLO_C2B2SOovgLS3gOQ3U_ev28ExsikTOs-WTQh3oTBli9Q8M_ptcmVe4PMg7m-wEZhwe6e_FPoJ0nJGGQzWK9qm5GfE-ja2kdXfwAa4s1JKJbzQAsgJcmfE9XceXrJ0YIlDGjIO9_iAS45tg7g4RgE3vdUwkP3DI_oMlertqL0aRNC-JjIkAyZei7Vpn4EHUnF5JOqigB1pZpAfQdhT5M8c2QEA-PHO1UbkL24TYiQ1DrWxqRR4FhvYjgiUirwnVqRXjoTos6wEnwZcJwcGmBRij8dn8g_1qTR4brPFmHyn-GMdw_QZKYlcWvkfgHUOWfvHBot7NBeAm5v0Kss55ivIQH9CaDEaPNjE_DTpwhcD53ollSYHihyn3sMUu9-84lFcFg0Q589E_Ped_H7QK6N3pEIA7rqJZMlgpfNhKf1u2qHcdhuQ_2hY4DMXHDkI2wh-mFDaRDMD4fHJdCKosrGbq6TUp4P-S8Rcxm5BllCeB2D6prPmd7lQgPVuttY89q5gkYqHs2V8IqzwSK3KwxaAAnpvsMb6mOsqceLhjiJyEUBZwj77qnvOt0Ulqhl2SOoIhqpxjt-5u0JYMTUVztK9yo6mgPH4yziQCcFEWNwH6Clup0q_kzFWohEOuAYmYW6m2531oYmHZy3hZCYLU9KBsB4nDZ2rf3I0M0OqImNHGRGCpRSGhyyScxQV4XjaQOoNRcSqD7nD2Tqlu0lXtFS85g-fwbg9ZBGE2ANlHLie6yTK6vJrHWZpot-4olZ-8nKWt_2JYY6tUMWD77dh-nN9I42okIMQxWXvIhaAjsifoK6z1ncTKUeZP-4DZEQlQRQNR_oBPYoa_Xq6KwCrrdsrqKrU5Q0eHwW3fZiYmUhmvmr2QlOKtUXmkUoxmTMhU16aPXa04tmY50EM9yNC686XLhq8RgTte9rSzcN1uW3czRpXk_TK4HK0061OZ6VxyHlmFcQX34kj5GGZJdYf-lw2VSwmVq23r0feK7s7qqg4vEGkYyQbSNp-d5xMC6rjfbxpqZhUfdM4i6BLK9JIHUeThCIMLB-2mKnC2i5Bp-yNS3uhQIHrAYKziuVYfC5WGmP9wYh9mM30td0TS7aTFS0qKR-O01MP9YPZL9Q4RP2YK0xfzee53c4lqHu5B_43gwXJAp4YUyn-QzuMmhCZDTfGZKZ6pgvUx6heKX-cnKsaM_bSkRcmR2-PIkuM2m5PTrUFThvvajutRo1u3teogp3-z4B61kgakFbT-HR4DMcRSdWppXyuvxBfBtUBxPnGU2dZmC9eEEIVymkgGfOOg7dyqT0wdmUC_VxXpoWILwmXJJB3qZfeH_zrZUDjGSnNNV2_9XBNbzQVrIL68NjKBLeRudAq8PLGywxAF-ikUxQ2kPqa-GtLixW82fTR9HJ3Mw3uJGSttb2VHvflKnXXyVfczMImewpWBjj_ni1HtkBmvL2Jf4jcofKpqz6i-9Hdhn3Z32qELvI3qt1qD7SvJ9D1_pn3631BpwysJKpoNQdVTM35ZyI5a6c6F6kUI8L_Imci","summary":[{"type":"summary_text","text":"**Verifying feed batch processing**"}]},{"id":"fc_034a6be5a6696b6c016a5a27d2f35081919e162a10d6b9acf5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry dispatcher worker\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"960-1085\"}","call_id":"call_Fz9oB9JuGZTIQv2SeKfmPnDM","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27d2f3a881918edfcc2405f9cb65","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry apply transaction\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"1050-1210\"}","call_id":"call_CllDX580odkF5Mk8hb8T3Elz","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27d2f3bc819182164ca9f3ab7267","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry advertise scan\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"430-600\"}","call_id":"call_PQIP2YnMDzHKJc003nSe4AwF","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27d2f3c48191bfec2b8f9e5797f9","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump constants\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"85-125\"}","call_id":"call_sou7DaghQQJ7xU0lsiW5oeo4","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27d2f3c8819182d16ace3d6eccd0","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump configuration constants\",\"path\":\"crates/spt-daemon/src/config.rs\",\"selector\":\"15-50\"}","call_id":"call_9BpW5Cee6yCePYHs9XgJmLQJ","name":"read"}]},"duration":29259.464900001884,"ttft":4296.250900000334,"contextSnapshot":{"promptTokens":158998,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Fz9oB9JuGZTIQv2SeKfmPnDM|fc_034a6be5a6696b6c016a5a27d2f35081919e162a10d6b9acf5","toolName":"read","startedAt":"2026-07-17T13:02:11.420Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading registry dispatcher worker"},"id":"ccafb008","parentId":"40d0e66e","timestamp":"2026-07-17T13:02:11.420Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CllDX580odkF5Mk8hb8T3Elz|fc_034a6be5a6696b6c016a5a27d2f3a881918edfcc2405f9cb65","toolName":"read","startedAt":"2026-07-17T13:02:11.420Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry apply transaction"},"id":"f3cf6113","parentId":"ccafb008","timestamp":"2026-07-17T13:02:11.420Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PQIP2YnMDzHKJc003nSe4AwF|fc_034a6be5a6696b6c016a5a27d2f3bc819182164ca9f3ab7267","toolName":"read","startedAt":"2026-07-17T13:02:11.420Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry advertise scan"},"id":"055608c4","parentId":"f3cf6113","timestamp":"2026-07-17T13:02:11.420Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_sou7DaghQQJ7xU0lsiW5oeo4|fc_034a6be5a6696b6c016a5a27d2f3c48191bfec2b8f9e5797f9","toolName":"read","startedAt":"2026-07-17T13:02:11.420Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump constants"},"id":"e867c637","parentId":"055608c4","timestamp":"2026-07-17T13:02:11.420Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_9BpW5Cee6yCePYHs9XgJmLQJ|fc_034a6be5a6696b6c016a5a27d2f3c8819182d16ace3d6eccd0","toolName":"read","startedAt":"2026-07-17T13:02:11.420Z","args":{"path":"crates/spt-daemon/src/config.rs"},"intent":"Reading pump configuration constants"},"id":"1418bb36","parentId":"e867c637","timestamp":"2026-07-17T13:02:11.420Z"}
{"type":"message","id":"5827b30f","parentId":"1418bb36","timestamp":"2026-07-17T13:02:11.429Z","message":{"role":"toolResult","toolCallId":"call_9BpW5Cee6yCePYHs9XgJmLQJ|fc_034a6be5a6696b6c016a5a27d2f3c8819182d16ace3d6eccd0","toolName":"read","content":[{"type":"text","text":"use std::path::{Path, PathBuf};\nuse std::time::Duration;\n\nuse serde::{Deserialize, Serialize};\n\n/// The interim default pulse period carried forward as the config default. The\n/// daemon now treats this as a *fallback*, not a constant: `daemon.json` may\n/// override it per machine.\npub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\n\n/// Default drop-file precedence protection window (epoch-ms), mirroring the\n/// interim `spt_live` guard. Surfaced here so the one config source owns it.\npub const DEFAULT_PROTECTION_WINDOW_MS: u64 = 2_000;\n\n/// Default orphan-watch grace window (B7): how long the supervised-crash teardown\n/// waits after observing a hosted Self's harness owner gone before it rechecks\n/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\n/// — a binary handoff relaunch or a brief stale poll — without delaying a real\n/// teardown for long. Configurable per machine via `crash_grace_ms`.\npub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\n\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\n/// Conservative defaults — every loop is a thin call over an idempotent\n/// driver, so a missed tick costs only latency, never correctness.\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\n\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\n/// authored by a node not heard within this window are evicted on the next\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\n/// inside the window keeps its rows), short enough that a dead node identity\n/// stops poisoning bare-id resolution within minutes.\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\n\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\n\n[Showing lines 14-53 of 652. Use :54 to continue]"}],"details":{"truncation":{"content":"use std::path::{Path, PathBuf};\r\nuse std::time::Duration;\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\n/// The interim default pulse period carried forward as the config default. The\r\n/// daemon now treats this as a *fallback*, not a constant: `daemon.json` may\r\n/// override it per machine.\r\npub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\r\n\r\n/// Default drop-file precedence protection window (epoch-ms), mirroring the\r\n/// interim `spt_live` guard. Surfaced here so the one config source owns it.\r\npub const DEFAULT_PROTECTION_WINDOW_MS: u64 = 2_000;\r\n\r\n/// Default orphan-watch grace window (B7): how long the supervised-crash teardown\r\n/// waits after observing a hosted Self's harness owner gone before it rechecks\r\n/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\r\n/// — a binary handoff relaunch or a brief stale poll — without delaying a real\r\n/// teardown for long. Configurable per machine via `crash_grace_ms`.\r\npub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\r\n\r\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\r\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\r\n/// Conservative defaults — every loop is a thin call over an idempotent\r\n/// driver, so a missed tick costs only latency, never correctness.\r\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\r\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\r\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\r\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\r\n\r\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\r\n/// authored by a node not heard within this window are evicted on the next\r\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\r\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\r\n/// inside the window keeps its rows), short enough that a dead node identity\r\n/// stops poisoning bare-id resolution within minutes.\r\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\r\n\r\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\r\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\r","truncated":true,"truncatedBy":"lines","totalLines":639,"totalBytes":2340,"outputLines":40,"outputBytes":2340,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"use std::path::{Path, PathBuf};\r\nuse std::time::Duration;\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\n/// The interim default pulse period carried forward as the config default. The\r\n/// daemon now treats this as a *fallback*, not a constant: `daemon.json` may\r\n/// override it per machine.\r\npub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);\r\n\r\n/// Default drop-file precedence protection window (epoch-ms), mirroring the\r\n/// interim `spt_live` guard. Surfaced here so the one config source owns it.\r\npub const DEFAULT_PROTECTION_WINDOW_MS: u64 = 2_000;\r\n\r\n/// Default orphan-watch grace window (B7): how long the supervised-crash teardown\r\n/// waits after observing a hosted Self's harness owner gone before it rechecks\r\n/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery\r\n/// — a binary handoff relaunch or a brief stale poll — without delaying a real\r\n/// teardown for long. Configurable per machine via `crash_grace_ms`.\r\npub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);\r\n\r\n/// Default peer-pump cadences (D9-1): how often the daemon pushes its\r\n/// registry/notif feeds to trusted peers and pulls context syncs from them.\r\n/// Conservative defaults — every loop is a thin call over an idempotent\r\n/// driver, so a missed tick costs only latency, never correctness.\r\npub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);\r\npub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);\r\npub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);\r\npub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);\r\n\r\n/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows\r\n/// authored by a node not heard within this window are evicted on the next\r\n/// registry pump tick. Sized to ~10 default pump cadences — generous against\r\n/// transient drops (a peer re-advertises every cadence, so one admitted feed\r\n/// inside the window keeps its rows), short enough that a dead node identity\r\n/// stops poisoning bare-id resolution within minutes.\r\npub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);\r\n\r\n/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) —\r\n/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in\r","startLine":14,"lineNumbers":[14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\config.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":652,"totalBytes":2340,"outputLines":40,"outputBytes":2340,"shownRange":{"start":14,"end":53},"nextOffset":54}}},"isError":false,"timestamp":1784293331429}}
{"type":"message","id":"f99c1989","parentId":"5827b30f","timestamp":"2026-07-17T13:02:11.443Z","message":{"role":"toolResult","toolCallId":"call_Fz9oB9JuGZTIQv2SeKfmPnDM|fc_034a6be5a6696b6c016a5a27d2f35081919e162a10d6b9acf5","toolName":"read","content":[{"type":"text","text":"    let outcome = match family {\n…\n        StreamFamily::Attach => {\n…\n            // `endpoint` is the gate subject; `remote_session` carries the\n            // dispatcher-resolved session id on the cross-node leg (resolved HERE,\n            // before serve_attach subscribes — never mid-serve, which would swallow\n            // interleaved attach records) and `None` on the local path.\n            let (endpoint, remote_session) = match line\n                .get(\"endpoint_id\")\n                .and_then(|v| v.as_str())\n                .filter(|e| !e.is_empty())\n            {\n                Some(ep) => match crate::attach::resolve_local_session(&mut brain, ep) {\n                    Some(sid) => (Some(ep.to_string()), Some(sid)),\n                    None => (None, None),\n                },\n                None => {\n                    let session_id = line.get(\"session_id\").and_then(|v| v.as_u64());\n                    let endpoint = session_id.and_then(|sid| {\n                        brain.sessions().ok().and_then(|reply| {\n                            reply\n                                .sessions\n                                .iter()\n                                .find(|s| s.session_id == sid && !s.endpoint.is_empty())\n                                .map(|s| s.endpoint.clone())\n                        })\n                    });\n                    (endpoint, None)\n                }\n            };\n            match endpoint {\n                // Seed the serve loop with the DURABLE opener Request\n                // (ADR-0038 B): after a ring roll the wire replay no longer\n                // carries the Request record, so the serve would idle forever\n                // waiting for one. The pinned opener IS that record — hand it\n                // over so reconstruction resumes the same operator stream.\n                // Subscribe from the ring FLOOR: a rolled ring's chunk 0 is\n                // gone, and a below-floor cursor trips the brain's gap check.\n                // [impl->REQ-STREAM-OPENER-DURABLE]\n                Some(endpoint) => match serve_attach(\n                    &mut brain,\n                    broker_name,\n                    stream_id,\n                    &endpoint,\n                    origin,\n                    floor_seq,\n                    remote_session,\n                    serde_json::from_value(line.clone()).ok(),\n                ) {\n                    Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                    Err(e) => DispatchOutcome::Failed(e.to_string()),\n                },\n                None => {\n                    // Refuse politely: finish our send side, claim stays.\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\n                }\n            }\n        }\n        StreamFamily::Xfer => {\n            // The wire names whose whitelist gates (the rule set); the origin\n            // it is checked against stays handshake-proven. Blank refuses.\n            let endpoint = line\n                .get(\"endpoint\")\n                .and_then(|v| v.as_str())\n                .filter(|e| !e.is_empty())\n                .map(str::to_string);\n            match endpoint {\n                Some(endpoint) => {\n                    let root = spt_store::xfer::transfers_dir();\n                    let progress = paths.scratch.join(\"xfer-progress\");\n                    match serve_xfer(\n                        &mut brain, stream_id, &endpoint, origin, 0, &root, &progress,\n                    ) {\n                        Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                        Err(e) => DispatchOutcome::Failed(e.to_string()),\n                    }\n                }\n                None => {\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\n                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\n                }\n            }\n        }\n        StreamFamily::Rest => {\n            // The wire names whose whitelist gates (the xfer posture); the\n            // origin stays handshake-proven. The serve applies the event\n            // through the LOCAL transition host — echo gate, wake effects,\n            // and shell cascade run on this node, where the instance lives.\n            // [impl->REQ-INST-6]\n            let knob = crate::config::DaemonConfig::load().auto_suspend_after_ms;\n            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::ShellLink => {\n            // The wire names the owner whose whitelist gates AND whose shell\n            // tree resolves (owner exclusivity = resolution scope); the\n            // action runs against the LOCAL owlery — perch, manifest, spool,\n            // and binary all live here, the shell's node.\n            // [impl->REQ-SHELL-2]\n            match crate::linkhost::serve_shell_link(&mut brain, stream_id, origin, &paths.owlery) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::ServeProbe => {\n            // No gate (serveprobe module docs): the answer is public\n            // serve-state for a named subnet, read fresh from this node's\n            // own stores — the QUIC handshake is the only subject.\n            // [impl->REQ-SUBNET-5]\n            match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\n            }\n        }\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\n    };\n    // Physical row release for a COMPLETED serve (ADR-0040 decisions 1+5):\n    // this runs on the worker's OWN conn, so it is ordered BEHIND every reply\n    // frame the serve loop sent (same serial IPC handler) — the late-reply\n    // overtake race that forced ADR-0038's eligibility-only retire cannot\n    // happen here. Without it, every completed serve on the long-lived pump\n    // carrier retains its row + reply ring until a conn-close sweep that\n    // never comes (the hertz census's 524→6411 stream growth). ATTACH is\n    // excluded: attach rows are Durable-class (brain-swap re-attach\n    // continuity) — they keep the completion-closure's eligibility-only\n    // retire exactly as before.\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\n    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\n        let _ = brain.net_stream_retire_terminal(stream_id);\n    }\n\n[Showing lines 959-1088 of 1920. Use :1089 to continue]"}],"details":{"truncation":{"content":"            // `endpoint` is the gate subject; `remote_session` carries the\r\n            // dispatcher-resolved session id on the cross-node leg (resolved HERE,\r\n            // before serve_attach subscribes — never mid-serve, which would swallow\r\n            // interleaved attach records) and `None` on the local path.\r\n            let (endpoint, remote_session) = match line\r\n                .get(\"endpoint_id\")\r\n                .and_then(|v| v.as_str())\r\n                .filter(|e| !e.is_empty())\r\n            {\r\n                Some(ep) => match crate::attach::resolve_local_session(&mut brain, ep) {\r\n                    Some(sid) => (Some(ep.to_string()), Some(sid)),\r\n                    None => (None, None),\r\n                },\r\n                None => {\r\n                    let session_id = line.get(\"session_id\").and_then(|v| v.as_u64());\r\n                    let endpoint = session_id.and_then(|sid| {\r\n                        brain.sessions().ok().and_then(|reply| {\r\n                            reply\r\n                                .sessions\r\n                                .iter()\r\n                                .find(|s| s.session_id == sid && !s.endpoint.is_empty())\r\n                                .map(|s| s.endpoint.clone())\r\n                        })\r\n                    });\r\n                    (endpoint, None)\r\n                }\r\n            };\r\n            match endpoint {\r\n                // Seed the serve loop with the DURABLE opener Request\r\n                // (ADR-0038 B): after a ring roll the wire replay no longer\r\n                // carries the Request record, so the serve would idle forever\r\n                // waiting for one. The pinned opener IS that record — hand it\r\n                // over so reconstruction resumes the same operator stream.\r\n                // Subscribe from the ring FLOOR: a rolled ring's chunk 0 is\r\n                // gone, and a below-floor cursor trips the brain's gap check.\r\n                // [impl->REQ-STREAM-OPENER-DURABLE]\r\n                Some(endpoint) => match serve_attach(\r\n                    &mut brain,\r\n                    broker_name,\r\n                    stream_id,\r\n                    &endpoint,\r\n                    origin,\r\n                    floor_seq,\r\n                    remote_session,\r\n                    serde_json::from_value(line.clone()).ok(),\r\n                ) {\r\n                    Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                    Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n                },\r\n                None => {\r\n                    // Refuse politely: finish our send side, claim stays.\r\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\r\n                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\r\n                }\r\n            }\r\n        }\r\n        StreamFamily::Xfer => {\r\n            // The wire names whose whitelist gates (the rule set); the origin\r\n            // it is checked against stays handshake-proven. Blank refuses.\r\n            let endpoint = line\r\n                .get(\"endpoint\")\r\n                .and_then(|v| v.as_str())\r\n                .filter(|e| !e.is_empty())\r\n                .map(str::to_string);\r\n            match endpoint {\r\n                Some(endpoint) => {\r\n                    let root = spt_store::xfer::transfers_dir();\r\n                    let progress = paths.scratch.join(\"xfer-progress\");\r\n                    match serve_xfer(\r\n                        &mut brain, stream_id, &endpoint, origin, 0, &root, &progress,\r\n                    ) {\r\n                        Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                        Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n                    }\r\n                }\r\n                None => {\r\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\r\n                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\r\n                }\r\n            }\r\n        }\r\n        StreamFamily::Rest => {\r\n            // The wire names whose whitelist gates (the xfer posture); the\r\n            // origin stays handshake-proven. The serve applies the event\r\n            // through the LOCAL transition host — echo gate, wake effects,\r\n            // and shell cascade run on this node, where the instance lives.\r\n            // [impl->REQ-INST-6]\r\n            let knob = crate::config::DaemonConfig::load().auto_suspend_after_ms;\r\n            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::ShellLink => {\r\n            // The wire names the owner whose whitelist gates AND whose shell\r\n            // tree resolves (owner exclusivity = resolution scope); the\r\n            // action runs against the LOCAL owlery — perch, manifest, spool,\r\n            // and binary all live here, the shell's node.\r\n            // [impl->REQ-SHELL-2]\r\n            match crate::linkhost::serve_shell_link(&mut brain, stream_id, origin, &paths.owlery) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::ServeProbe => {\r\n            // No gate (serveprobe module docs): the answer is public\r\n            // serve-state for a named subnet, read fresh from this node's\r\n            // own stores — the QUIC handshake is the only subject.\r\n            // [impl->REQ-SUBNET-5]\r\n            match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\r\n    };\r\n    // Physical row release for a COMPLETED serve (ADR-0040 decisions 1+5):\r\n    // this runs on the worker's OWN conn, so it is ordered BEHIND every reply\r\n    // frame the serve loop sent (same serial IPC handler) — the late-reply\r\n    // overtake race that forced ADR-0038's eligibility-only retire cannot\r\n    // happen here. Without it, every completed serve on the long-lived pump\r\n    // carrier retains its row + reply ring until a conn-close sweep that\r\n    // never comes (the hertz census's 524→6411 stream growth). ATTACH is\r\n    // excluded: attach rows are Durable-class (brain-swap re-attach\r\n    // continuity) — they keep the completion-closure's eligibility-only\r\n    // retire exactly as before.\r\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\r\n    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\r\n        let _ = brain.net_stream_retire_terminal(stream_id);\r\n    }\r","truncated":true,"truncatedBy":"lines","totalLines":962,"totalBytes":6933,"outputLines":130,"outputBytes":6933,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    let outcome = match family {\n…\n        StreamFamily::Attach => {\n…\n            // `endpoint` is the gate subject; `remote_session` carries the\r\n            // dispatcher-resolved session id on the cross-node leg (resolved HERE,\r\n            // before serve_attach subscribes — never mid-serve, which would swallow\r\n            // interleaved attach records) and `None` on the local path.\r\n            let (endpoint, remote_session) = match line\r\n                .get(\"endpoint_id\")\r\n                .and_then(|v| v.as_str())\r\n                .filter(|e| !e.is_empty())\r\n            {\r\n                Some(ep) => match crate::attach::resolve_local_session(&mut brain, ep) {\r\n                    Some(sid) => (Some(ep.to_string()), Some(sid)),\r\n                    None => (None, None),\r\n                },\r\n                None => {\r\n                    let session_id = line.get(\"session_id\").and_then(|v| v.as_u64());\r\n                    let endpoint = session_id.and_then(|sid| {\r\n                        brain.sessions().ok().and_then(|reply| {\r\n                            reply\r\n                                .sessions\r\n                                .iter()\r\n                                .find(|s| s.session_id == sid && !s.endpoint.is_empty())\r\n                                .map(|s| s.endpoint.clone())\r\n                        })\r\n                    });\r\n                    (endpoint, None)\r\n                }\r\n            };\r\n            match endpoint {\r\n                // Seed the serve loop with the DURABLE opener Request\r\n                // (ADR-0038 B): after a ring roll the wire replay no longer\r\n                // carries the Request record, so the serve would idle forever\r\n                // waiting for one. The pinned opener IS that record — hand it\r\n                // over so reconstruction resumes the same operator stream.\r\n                // Subscribe from the ring FLOOR: a rolled ring's chunk 0 is\r\n                // gone, and a below-floor cursor trips the brain's gap check.\r\n                // [impl->REQ-STREAM-OPENER-DURABLE]\r\n                Some(endpoint) => match serve_attach(\r\n                    &mut brain,\r\n                    broker_name,\r\n                    stream_id,\r\n                    &endpoint,\r\n                    origin,\r\n                    floor_seq,\r\n                    remote_session,\r\n                    serde_json::from_value(line.clone()).ok(),\r\n                ) {\r\n                    Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                    Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n                },\r\n                None => {\r\n                    // Refuse politely: finish our send side, claim stays.\r\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\r\n                    DispatchOutcome::Served(\"attach refused: unlabeled/unknown session\".into())\r\n                }\r\n            }\r\n        }\r\n        StreamFamily::Xfer => {\r\n            // The wire names whose whitelist gates (the rule set); the origin\r\n            // it is checked against stays handshake-proven. Blank refuses.\r\n            let endpoint = line\r\n                .get(\"endpoint\")\r\n                .and_then(|v| v.as_str())\r\n                .filter(|e| !e.is_empty())\r\n                .map(str::to_string);\r\n            match endpoint {\r\n                Some(endpoint) => {\r\n                    let root = spt_store::xfer::transfers_dir();\r\n                    let progress = paths.scratch.join(\"xfer-progress\");\r\n                    match serve_xfer(\r\n                        &mut brain, stream_id, &endpoint, origin, 0, &root, &progress,\r\n                    ) {\r\n                        Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                        Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n                    }\r\n                }\r\n                None => {\r\n                    let _ = brain.net_stream_send(stream_id, &[], None, true);\r\n                    DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())\r\n                }\r\n            }\r\n        }\r\n        StreamFamily::Rest => {\r\n            // The wire names whose whitelist gates (the xfer posture); the\r\n            // origin stays handshake-proven. The serve applies the event\r\n            // through the LOCAL transition host — echo gate, wake effects,\r\n            // and shell cascade run on this node, where the instance lives.\r\n            // [impl->REQ-INST-6]\r\n            let knob = crate::config::DaemonConfig::load().auto_suspend_after_ms;\r\n            match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::ShellLink => {\r\n            // The wire names the owner whose whitelist gates AND whose shell\r\n            // tree resolves (owner exclusivity = resolution scope); the\r\n            // action runs against the LOCAL owlery — perch, manifest, spool,\r\n            // and binary all live here, the shell's node.\r\n            // [impl->REQ-SHELL-2]\r\n            match crate::linkhost::serve_shell_link(&mut brain, stream_id, origin, &paths.owlery) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::ServeProbe => {\r\n            // No gate (serveprobe module docs): the answer is public\r\n            // serve-state for a named subnet, read fresh from this node's\r\n            // own stores — the QUIC handshake is the only subject.\r\n            // [impl->REQ-SUBNET-5]\r\n            match crate::serveprobe::serve_subnet_probe(&mut brain, stream_id) {\r\n                Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),\r\n                Err(e) => DispatchOutcome::Failed(e.to_string()),\r\n            }\r\n        }\r\n        StreamFamily::Unknown => DispatchOutcome::Unknown,\r\n    };\r\n    // Physical row release for a COMPLETED serve (ADR-0040 decisions 1+5):\r\n    // this runs on the worker's OWN conn, so it is ordered BEHIND every reply\r\n    // frame the serve loop sent (same serial IPC handler) — the late-reply\r\n    // overtake race that forced ADR-0038's eligibility-only retire cannot\r\n    // happen here. Without it, every completed serve on the long-lived pump\r\n    // carrier retains its row + reply ring until a conn-close sweep that\r\n    // never comes (the hertz census's 524→6411 stream growth). ATTACH is\r\n    // excluded: attach rows are Durable-class (brain-swap re-attach\r\n    // continuity) — they keep the completion-closure's eligibility-only\r\n    // retire exactly as before.\r\n    // [impl->REQ-SEAT-LIFETIME-BOUNDED]\r\n    if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {\r\n        let _ = brain.net_stream_retire_terminal(stream_id);\r\n    }\r","startLine":907,"lineNumbers":[907,null,944,null,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1920,"totalBytes":6933,"outputLines":130,"outputBytes":6933,"shownRange":{"start":959,"end":1088},"nextOffset":1089}}},"isError":false,"timestamp":1784293331443}}
{"type":"message","id":"66c0c98f","parentId":"f99c1989","timestamp":"2026-07-17T13:02:11.458Z","message":{"role":"toolResult","toolCallId":"call_sou7DaghQQJ7xU0lsiW5oeo4|fc_034a6be5a6696b6c016a5a27d2f3c48191bfec2b8f9e5797f9","toolName":"read","content":[{"type":"text","text":"pub mod health;\nuse health::PumpHealth;\n\nmod notif;\nmod registry;\nmod sync;\nmod update;\nuse notif::NotifWorker;\nuse registry::RegistryWorker;\nuse sync::SyncWorker;\nuse update::UpdateWorker;\n\n/// The pump's tick granularity — each cadence fires when its period elapsed.\nconst TICK: Duration = Duration::from_millis(200);\n\n/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall\n/// warning reads 3-cadence staleness, so a few seconds of heartbeat\n/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\nconst HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\n\n/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\n/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\n/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either\n/// way). A read that exceeds this is treated as a poisoned client and\n/// escalated to a supervised restart, NEVER a per-peer retry.\nconst PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);\n\n/// Supervisor backoff floor: the first restart after a pump death.\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Supervisor backoff cap (M8 decision 23): a persistently-crashing pump\n/// retries at most every 5 minutes — visible, bounded, never silent.\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);\n\n/// A run that survived this long before dying counts as healthy — the next\n/// backoff resets to the floor instead of doubling (a once-a-day panic must\n/// not ratchet the pump toward permanent 5-minute outages).\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);\n\n/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the\n/// first failed dial to a peer waits this long before the pump re-dials THAT\n/// peer. Scoped to the peer — a dead peer backs off while live peers stay hot.\nconst PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);\n\n/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most\n\n[Showing lines 84-128 of 2054. Use :129 to continue]"}],"details":{"truncation":{"content":"pub mod health;\r\nuse health::PumpHealth;\r\n\r\nmod notif;\r\nmod registry;\r\nmod sync;\r\nmod update;\r\nuse notif::NotifWorker;\r\nuse registry::RegistryWorker;\r\nuse sync::SyncWorker;\r\nuse update::UpdateWorker;\r\n\r\n/// The pump's tick granularity — each cadence fires when its period elapsed.\r\nconst TICK: Duration = Duration::from_millis(200);\r\n\r\n/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall\r\n/// warning reads 3-cadence staleness, so a few seconds of heartbeat\r\n/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\r\nconst HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\r\n\r\n/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\r\n/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\r\n/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either\r\n/// way). A read that exceeds this is treated as a poisoned client and\r\n/// escalated to a supervised restart, NEVER a per-peer retry.\r\nconst PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);\r\n\r\n/// Supervisor backoff floor: the first restart after a pump death.\r\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);\r\n\r\n/// Supervisor backoff cap (M8 decision 23): a persistently-crashing pump\r\n/// retries at most every 5 minutes — visible, bounded, never silent.\r\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);\r\n\r\n/// A run that survived this long before dying counts as healthy — the next\r\n/// backoff resets to the floor instead of doubling (a once-a-day panic must\r\n/// not ratchet the pump toward permanent 5-minute outages).\r\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);\r\n\r\n/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the\r\n/// first failed dial to a peer waits this long before the pump re-dials THAT\r\n/// peer. Scoped to the peer — a dead peer backs off while live peers stay hot.\r\nconst PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);\r\n\r\n/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most\r","truncated":true,"truncatedBy":"lines","totalLines":1971,"totalBytes":2093,"outputLines":45,"outputBytes":2093,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub mod health;\r\nuse health::PumpHealth;\r\n\r\nmod notif;\r\nmod registry;\r\nmod sync;\r\nmod update;\r\nuse notif::NotifWorker;\r\nuse registry::RegistryWorker;\r\nuse sync::SyncWorker;\r\nuse update::UpdateWorker;\r\n\r\n/// The pump's tick granularity — each cadence fires when its period elapsed.\r\nconst TICK: Duration = Duration::from_millis(200);\r\n\r\n/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall\r\n/// warning reads 3-cadence staleness, so a few seconds of heartbeat\r\n/// granularity is invisible to it — and 5 writes/sec of disk churn is not.\r\nconst HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);\r\n\r\n/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-\r\n/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below\r\n/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either\r\n/// way). A read that exceeds this is treated as a poisoned client and\r\n/// escalated to a supervised restart, NEVER a per-peer retry.\r\nconst PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);\r\n\r\n/// Supervisor backoff floor: the first restart after a pump death.\r\nconst SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);\r\n\r\n/// Supervisor backoff cap (M8 decision 23): a persistently-crashing pump\r\n/// retries at most every 5 minutes — visible, bounded, never silent.\r\nconst SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);\r\n\r\n/// A run that survived this long before dying counts as healthy — the next\r\n/// backoff resets to the floor instead of doubling (a once-a-day panic must\r\n/// not ratchet the pump toward permanent 5-minute outages).\r\nconst SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);\r\n\r\n/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the\r\n/// first failed dial to a peer waits this long before the pump re-dials THAT\r\n/// peer. Scoped to the peer — a dead peer backs off while live peers stay hot.\r\nconst PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);\r\n\r\n/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most\r","startLine":84,"lineNumbers":[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2054,"totalBytes":2093,"outputLines":45,"outputBytes":2093,"shownRange":{"start":84,"end":128},"nextOffset":129}}},"isError":false,"timestamp":1784293331458}}
{"type":"message","id":"9ad5edba","parentId":"66c0c98f","timestamp":"2026-07-17T13:02:11.472Z","message":{"role":"toolResult","toolCallId":"call_CllDX580odkF5Mk8hb8T3Elz|fc_034a6be5a6696b6c016a5a27d2f3a881918edfcc2405f9cb65","toolName":"read","content":[{"type":"text","text":"pub struct RekeyNotice {\n…\n    /// The superseded key (the one last seen for this machine).\n    pub old_hex: String,\n    /// The fresh key the machine now presents (the joiner).\n    pub new_hex: String,\n}\n\n/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\n/// by the pairing host AFTER a completed ceremony: resolve the superseded\n/// identities from the subnet's snapshot, tombstone their roster entries (this\n/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\n/// about others), rewrite the disk snapshot, and note the hexes in the eviction\n/// marker so the pump clears the in-memory rows on its next tick. The caller\n/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the\n/// demoted warn-on-change, REQ-MESH-5) — empty when nothing supersedes.\n///\n/// The roster tombstone is the load-bearing eviction since Mesh-D5a: the\n/// inbound gates authorize on [`RosterStore::is_member`], so a re-keyed identity\n/// that kept its roster entry would stay a member. Tombstone (not a bare remove)\n/// because the roster is a grow-set: a plain delete re-merges from any peer\n/// that still lists the dead key. The D3 tombstone primitive dominates +\n/// suppresses reinsert; a fresh re-pair of that key would clear it (decision\n/// 10), exactly as the joiner's own key is cleared at the call site. (Mesh-D6\n/// deleted the former trust-row drop — the roster is the sole membership record.)\n// [impl->REQ-SUBNET-7]\n// [impl->REQ-MESH-5]\npub fn repair_evict_superseded(\n    roster: &mut spt_store::roster::RosterStore,\n    subnet: &str,\n    joiner_hex: &str,\n    intro: &spt_net::net::pairing::wire::NodeIntro,\n    snap_dir: &Path,\n) -> Vec<RekeyNotice> {\n    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\n    let Some(mut reg) = std::fs::read_to_string(&snap_path)\n        .ok()\n        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\n    else {\n        return Vec::new(); // no gossip yet — nothing to supersede\n    };\n    let dead = superseded_identities(&reg, intro, joiner_hex);\n    if dead.is_empty() {\n        return Vec::new();\n    }\n    let mut notices = Vec::with_capacity(dead.len());\n    for hex in &dead {\n        // The gate-effective eviction (Mesh-D5a moved the gate to the roster).\n        roster.tombstone(subnet, hex, &wall_ms().to_string());\n        // The demoted warn-on-change (REQ-MESH-5): a machine_id-anchored\n        // awareness notice, never a gate. Absent a machine id, `dead` is\n        // empty (superseded_identities requires the id match) — so no false\n        // notice is possible here.\n        eprintln!(\n            \"MACHINE_REKEYED:{subnet} machine '{}' (id {}…): last seen as {}…, now presents {}… \\\n             (roster tombstoned — awareness only, not a block)\",\n            intro.label,\n            spt_net::net::registry::key_prefix(&intro.machine_id),\n            spt_net::net::registry::key_prefix(hex),\n            spt_net::net::registry::key_prefix(joiner_hex),\n        );\n        notices.push(RekeyNotice {\n            label: intro.label.clone(),\n            machine_id: intro.machine_id.clone(),\n            old_hex: hex.clone(),\n            new_hex: joiner_hex.to_string(),\n        });\n    }\n    reg.evict_nodes(|node| dead.iter().any(|d| d == node));\n    if let Ok(json) = serde_json::to_vec_pretty(&reg) {\n        let _ = atomic_write(&snap_path, &json);\n    }\n    // Merge into the marker (several re-pairs can land between pump ticks).\n    let marker = RegistryHost::repair_evict_path(snap_dir);\n    let mut all: std::collections::BTreeSet<String> = std::fs::read_to_string(&marker)\n        .ok()\n        .and_then(|s| serde_json::from_str(&s).ok())\n        .unwrap_or_default();\n    all.extend(dead);\n    if let Ok(json) = serde_json::to_vec_pretty(&all) {\n        let _ = atomic_write(&marker, &json);\n    }\n    notices\n}\n\n/// The event-driven advertisement marker file (M8 decision 15, REQ-CONV-2),\n/// under `identity/` — the [`crate::resting::PULL_MARKER_FILE`] idiom applied\n/// to the registry leg. An endpoint online/offline transition (ready-listener\n/// start/stop, a rest edge) drops it; the pump consumes it and forces a\n/// registry round NOW (advertise_local + peer push) instead of waiting out\n/// the cadence. A WAKE of the existing loop, never a second advertisement\n/// path: the forced round takes the exact same code path, so the epoch lease\n/// and visibility gates ride unchanged. File-based because the transitions\n/// happen in other processes (`spt ready`, `spt endpoint stop`, a wake CLI)\n/// than the pump's daemon.\npub const ADVERTISE_MARKER_FILE: &str = \"advertise-now\";\n\n/// Drop the advertise-now marker at the canonical identity dir (idempotent —\n/// a second transition before the pump's next tick re-requests the same\n/// round). Best-effort: a failed drop costs one cadence, never an error.\n// [impl->REQ-CONV-2]\npub fn request_advertise_now() {\n    let marker = spt_store::perch::identity_dir().join(ADVERTISE_MARKER_FILE);\n    if let Some(parent) = marker.parent() {\n        let _ = std::fs::create_dir_all(parent);\n    }\n    let _ = std::fs::write(&marker, b\"\");\n}\n\n/// Consume the advertise-now marker: `true` exactly once per drop (the\n/// remove is the take — two pump ticks can never both claim one transition).\n// [impl->REQ-CONV-2]\npub fn take_advertise_now(marker_path: &Path) -> bool {\n    std::fs::remove_file(marker_path).is_ok()\n}\n\n/// Wall-clock ms (the heard-map stamp; display/recency only — never a merge\n/// key, the epoch lease owns ordering).\nfn wall_ms() -> u64 {\n    std::time::SystemTime::now()\n        .duration_since(std::time::UNIX_EPOCH)\n        .map(|d| d.as_millis() as u64)\n        .unwrap_or(0)\n}\n\n/// tmp-write + atomic rename with the 5.2 Windows-EBUSY retry posture.\nfn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {\n    let tmp = path.with_extension(\"json.tmp\");\n    std::fs::write(&tmp, bytes)?;\n    for attempt in 0..5 {\n        match std::fs::rename(&tmp, path) {\n            Ok(()) => return Ok(()),\n            Err(_) if attempt < 4 => {\n                std::thread::sleep(std::time::Duration::from_millis(20 << attempt));\n            }\n            Err(e) => return Err(e),\n        }\n    }\n    unreachable!(\"loop returns on every path\")\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::test_home::with_home;\n    use spt_store::info::{self, InfoJson};\n\n    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n    #[test]\n    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n        let tmp = tempfile::tempdir().unwrap();\n        let root = tmp.path();\n        let owlery = root.join(\"owlery\");\n        let perch = owlery.join(\"hall-a\");\n        std::fs::create_dir_all(&perch).unwrap();\n        // Real project dirs OUTSIDE any repo → project_id_for_dir falls back to the\n        // folder name (no remote, no git toplevel).\n        let work = root.join(\"work\");\n        for p in [\"alpha\", \"beta\", \"gamma\"] {\n            std::fs::create_dir_all(work.join(p)).unwrap();\n        }\n        let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal → excluded\n        std::fs::create_dir_all(&psyche).unwrap();\n        let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");\n…\n    }\n…\n}\n\n[Showing lines 1049-1213 of 2429. Use :1214 to continue]"}],"details":{"truncation":{"content":"    /// The superseded key (the one last seen for this machine).\r\n    pub old_hex: String,\r\n    /// The fresh key the machine now presents (the joiner).\r\n    pub new_hex: String,\r\n}\r\n\r\n/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\r\n/// by the pairing host AFTER a completed ceremony: resolve the superseded\r\n/// identities from the subnet's snapshot, tombstone their roster entries (this\r\n/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\r\n/// about others), rewrite the disk snapshot, and note the hexes in the eviction\r\n/// marker so the pump clears the in-memory rows on its next tick. The caller\r\n/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the\r\n/// demoted warn-on-change, REQ-MESH-5) — empty when nothing supersedes.\r\n///\r\n/// The roster tombstone is the load-bearing eviction since Mesh-D5a: the\r\n/// inbound gates authorize on [`RosterStore::is_member`], so a re-keyed identity\r\n/// that kept its roster entry would stay a member. Tombstone (not a bare remove)\r\n/// because the roster is a grow-set: a plain delete re-merges from any peer\r\n/// that still lists the dead key. The D3 tombstone primitive dominates +\r\n/// suppresses reinsert; a fresh re-pair of that key would clear it (decision\r\n/// 10), exactly as the joiner's own key is cleared at the call site. (Mesh-D6\r\n/// deleted the former trust-row drop — the roster is the sole membership record.)\r\n// [impl->REQ-SUBNET-7]\r\n// [impl->REQ-MESH-5]\r\npub fn repair_evict_superseded(\r\n    roster: &mut spt_store::roster::RosterStore,\r\n    subnet: &str,\r\n    joiner_hex: &str,\r\n    intro: &spt_net::net::pairing::wire::NodeIntro,\r\n    snap_dir: &Path,\r\n) -> Vec<RekeyNotice> {\r\n    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\r\n    let Some(mut reg) = std::fs::read_to_string(&snap_path)\r\n        .ok()\r\n        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\r\n    else {\r\n        return Vec::new(); // no gossip yet — nothing to supersede\r\n    };\r\n    let dead = superseded_identities(&reg, intro, joiner_hex);\r\n    if dead.is_empty() {\r\n        return Vec::new();\r\n    }\r\n    let mut notices = Vec::with_capacity(dead.len());\r\n    for hex in &dead {\r\n        // The gate-effective eviction (Mesh-D5a moved the gate to the roster).\r\n        roster.tombstone(subnet, hex, &wall_ms().to_string());\r\n        // The demoted warn-on-change (REQ-MESH-5): a machine_id-anchored\r\n        // awareness notice, never a gate. Absent a machine id, `dead` is\r\n        // empty (superseded_identities requires the id match) — so no false\r\n        // notice is possible here.\r\n        eprintln!(\r\n            \"MACHINE_REKEYED:{subnet} machine '{}' (id {}…): last seen as {}…, now presents {}… \\\r\n             (roster tombstoned — awareness only, not a block)\",\r\n            intro.label,\r\n            spt_net::net::registry::key_prefix(&intro.machine_id),\r\n            spt_net::net::registry::key_prefix(hex),\r\n            spt_net::net::registry::key_prefix(joiner_hex),\r\n        );\r\n        notices.push(RekeyNotice {\r\n            label: intro.label.clone(),\r\n            machine_id: intro.machine_id.clone(),\r\n            old_hex: hex.clone(),\r\n            new_hex: joiner_hex.to_string(),\r\n        });\r\n    }\r\n    reg.evict_nodes(|node| dead.iter().any(|d| d == node));\r\n    if let Ok(json) = serde_json::to_vec_pretty(&reg) {\r\n        let _ = atomic_write(&snap_path, &json);\r\n    }\r\n    // Merge into the marker (several re-pairs can land between pump ticks).\r\n    let marker = RegistryHost::repair_evict_path(snap_dir);\r\n    let mut all: std::collections::BTreeSet<String> = std::fs::read_to_string(&marker)\r\n        .ok()\r\n        .and_then(|s| serde_json::from_str(&s).ok())\r\n        .unwrap_or_default();\r\n    all.extend(dead);\r\n    if let Ok(json) = serde_json::to_vec_pretty(&all) {\r\n        let _ = atomic_write(&marker, &json);\r\n    }\r\n    notices\r\n}\r\n\r\n/// The event-driven advertisement marker file (M8 decision 15, REQ-CONV-2),\r\n/// under `identity/` — the [`crate::resting::PULL_MARKER_FILE`] idiom applied\r\n/// to the registry leg. An endpoint online/offline transition (ready-listener\r\n/// start/stop, a rest edge) drops it; the pump consumes it and forces a\r\n/// registry round NOW (advertise_local + peer push) instead of waiting out\r\n/// the cadence. A WAKE of the existing loop, never a second advertisement\r\n/// path: the forced round takes the exact same code path, so the epoch lease\r\n/// and visibility gates ride unchanged. File-based because the transitions\r\n/// happen in other processes (`spt ready`, `spt endpoint stop`, a wake CLI)\r\n/// than the pump's daemon.\r\npub const ADVERTISE_MARKER_FILE: &str = \"advertise-now\";\r\n\r\n/// Drop the advertise-now marker at the canonical identity dir (idempotent —\r\n/// a second transition before the pump's next tick re-requests the same\r\n/// round). Best-effort: a failed drop costs one cadence, never an error.\r\n// [impl->REQ-CONV-2]\r\npub fn request_advertise_now() {\r\n    let marker = spt_store::perch::identity_dir().join(ADVERTISE_MARKER_FILE);\r\n    if let Some(parent) = marker.parent() {\r\n        let _ = std::fs::create_dir_all(parent);\r\n    }\r\n    let _ = std::fs::write(&marker, b\"\");\r\n}\r\n\r\n/// Consume the advertise-now marker: `true` exactly once per drop (the\r\n/// remove is the take — two pump ticks can never both claim one transition).\r\n// [impl->REQ-CONV-2]\r\npub fn take_advertise_now(marker_path: &Path) -> bool {\r\n    std::fs::remove_file(marker_path).is_ok()\r\n}\r\n\r\n/// Wall-clock ms (the heard-map stamp; display/recency only — never a merge\r\n/// key, the epoch lease owns ordering).\r\nfn wall_ms() -> u64 {\r\n    std::time::SystemTime::now()\r\n        .duration_since(std::time::UNIX_EPOCH)\r\n        .map(|d| d.as_millis() as u64)\r\n        .unwrap_or(0)\r\n}\r\n\r\n/// tmp-write + atomic rename with the 5.2 Windows-EBUSY retry posture.\r\nfn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {\r\n    let tmp = path.with_extension(\"json.tmp\");\r\n    std::fs::write(&tmp, bytes)?;\r\n    for attempt in 0..5 {\r\n        match std::fs::rename(&tmp, path) {\r\n            Ok(()) => return Ok(()),\r\n            Err(_) if attempt < 4 => {\r\n                std::thread::sleep(std::time::Duration::from_millis(20 << attempt));\r\n            }\r\n            Err(e) => return Err(e),\r\n        }\r\n    }\r\n    unreachable!(\"loop returns on every path\")\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::info::{self, InfoJson};\r\n\r\n    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\r\n    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\r\n    // (a psyche-host session is not a project), dedups (a project's newest occurrence\r\n    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\r\n    #[test]\r\n    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let root = tmp.path();\r\n        let owlery = root.join(\"owlery\");\r\n        let perch = owlery.join(\"hall-a\");\r\n        std::fs::create_dir_all(&perch).unwrap();\r\n        // Real project dirs OUTSIDE any repo → project_id_for_dir falls back to the\r\n        // folder name (no remote, no git toplevel).\r\n        let work = root.join(\"work\");\r\n        for p in [\"alpha\", \"beta\", \"gamma\"] {\r\n            std::fs::create_dir_all(work.join(p)).unwrap();\r\n        }\r\n        let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal → excluded\r\n        std::fs::create_dir_all(&psyche).unwrap();\r\n        let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");\r","truncated":true,"truncatedBy":"lines","totalLines":1381,"totalBytes":7732,"outputLines":165,"outputBytes":7732,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub struct RekeyNotice {\n…\n    /// The superseded key (the one last seen for this machine).\r\n    pub old_hex: String,\r\n    /// The fresh key the machine now presents (the joiner).\r\n    pub new_hex: String,\r\n}\r\n\r\n/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run\r\n/// by the pairing host AFTER a completed ceremony: resolve the superseded\r\n/// identities from the subnet's snapshot, tombstone their roster entries (this\r\n/// subnet's scope — the ceremony proved control of THIS subnet's code, nothing\r\n/// about others), rewrite the disk snapshot, and note the hexes in the eviction\r\n/// marker so the pump clears the in-memory rows on its next tick. The caller\r\n/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the\r\n/// demoted warn-on-change, REQ-MESH-5) — empty when nothing supersedes.\r\n///\r\n/// The roster tombstone is the load-bearing eviction since Mesh-D5a: the\r\n/// inbound gates authorize on [`RosterStore::is_member`], so a re-keyed identity\r\n/// that kept its roster entry would stay a member. Tombstone (not a bare remove)\r\n/// because the roster is a grow-set: a plain delete re-merges from any peer\r\n/// that still lists the dead key. The D3 tombstone primitive dominates +\r\n/// suppresses reinsert; a fresh re-pair of that key would clear it (decision\r\n/// 10), exactly as the joiner's own key is cleared at the call site. (Mesh-D6\r\n/// deleted the former trust-row drop — the roster is the sole membership record.)\r\n// [impl->REQ-SUBNET-7]\r\n// [impl->REQ-MESH-5]\r\npub fn repair_evict_superseded(\r\n    roster: &mut spt_store::roster::RosterStore,\r\n    subnet: &str,\r\n    joiner_hex: &str,\r\n    intro: &spt_net::net::pairing::wire::NodeIntro,\r\n    snap_dir: &Path,\r\n) -> Vec<RekeyNotice> {\r\n    let snap_path = RegistryHost::snapshot_path(snap_dir, subnet);\r\n    let Some(mut reg) = std::fs::read_to_string(&snap_path)\r\n        .ok()\r\n        .and_then(|s| serde_json::from_str::<SubnetRegistry>(&s).ok())\r\n    else {\r\n        return Vec::new(); // no gossip yet — nothing to supersede\r\n    };\r\n    let dead = superseded_identities(&reg, intro, joiner_hex);\r\n    if dead.is_empty() {\r\n        return Vec::new();\r\n    }\r\n    let mut notices = Vec::with_capacity(dead.len());\r\n    for hex in &dead {\r\n        // The gate-effective eviction (Mesh-D5a moved the gate to the roster).\r\n        roster.tombstone(subnet, hex, &wall_ms().to_string());\r\n        // The demoted warn-on-change (REQ-MESH-5): a machine_id-anchored\r\n        // awareness notice, never a gate. Absent a machine id, `dead` is\r\n        // empty (superseded_identities requires the id match) — so no false\r\n        // notice is possible here.\r\n        eprintln!(\r\n            \"MACHINE_REKEYED:{subnet} machine '{}' (id {}…): last seen as {}…, now presents {}… \\\r\n             (roster tombstoned — awareness only, not a block)\",\r\n            intro.label,\r\n            spt_net::net::registry::key_prefix(&intro.machine_id),\r\n            spt_net::net::registry::key_prefix(hex),\r\n            spt_net::net::registry::key_prefix(joiner_hex),\r\n        );\r\n        notices.push(RekeyNotice {\r\n            label: intro.label.clone(),\r\n            machine_id: intro.machine_id.clone(),\r\n            old_hex: hex.clone(),\r\n            new_hex: joiner_hex.to_string(),\r\n        });\r\n    }\r\n    reg.evict_nodes(|node| dead.iter().any(|d| d == node));\r\n    if let Ok(json) = serde_json::to_vec_pretty(&reg) {\r\n        let _ = atomic_write(&snap_path, &json);\r\n    }\r\n    // Merge into the marker (several re-pairs can land between pump ticks).\r\n    let marker = RegistryHost::repair_evict_path(snap_dir);\r\n    let mut all: std::collections::BTreeSet<String> = std::fs::read_to_string(&marker)\r\n        .ok()\r\n        .and_then(|s| serde_json::from_str(&s).ok())\r\n        .unwrap_or_default();\r\n    all.extend(dead);\r\n    if let Ok(json) = serde_json::to_vec_pretty(&all) {\r\n        let _ = atomic_write(&marker, &json);\r\n    }\r\n    notices\r\n}\r\n\r\n/// The event-driven advertisement marker file (M8 decision 15, REQ-CONV-2),\r\n/// under `identity/` — the [`crate::resting::PULL_MARKER_FILE`] idiom applied\r\n/// to the registry leg. An endpoint online/offline transition (ready-listener\r\n/// start/stop, a rest edge) drops it; the pump consumes it and forces a\r\n/// registry round NOW (advertise_local + peer push) instead of waiting out\r\n/// the cadence. A WAKE of the existing loop, never a second advertisement\r\n/// path: the forced round takes the exact same code path, so the epoch lease\r\n/// and visibility gates ride unchanged. File-based because the transitions\r\n/// happen in other processes (`spt ready`, `spt endpoint stop`, a wake CLI)\r\n/// than the pump's daemon.\r\npub const ADVERTISE_MARKER_FILE: &str = \"advertise-now\";\r\n\r\n/// Drop the advertise-now marker at the canonical identity dir (idempotent —\r\n/// a second transition before the pump's next tick re-requests the same\r\n/// round). Best-effort: a failed drop costs one cadence, never an error.\r\n// [impl->REQ-CONV-2]\r\npub fn request_advertise_now() {\r\n    let marker = spt_store::perch::identity_dir().join(ADVERTISE_MARKER_FILE);\r\n    if let Some(parent) = marker.parent() {\r\n        let _ = std::fs::create_dir_all(parent);\r\n    }\r\n    let _ = std::fs::write(&marker, b\"\");\r\n}\r\n\r\n/// Consume the advertise-now marker: `true` exactly once per drop (the\r\n/// remove is the take — two pump ticks can never both claim one transition).\r\n// [impl->REQ-CONV-2]\r\npub fn take_advertise_now(marker_path: &Path) -> bool {\r\n    std::fs::remove_file(marker_path).is_ok()\r\n}\r\n\r\n/// Wall-clock ms (the heard-map stamp; display/recency only — never a merge\r\n/// key, the epoch lease owns ordering).\r\nfn wall_ms() -> u64 {\r\n    std::time::SystemTime::now()\r\n        .duration_since(std::time::UNIX_EPOCH)\r\n        .map(|d| d.as_millis() as u64)\r\n        .unwrap_or(0)\r\n}\r\n\r\n/// tmp-write + atomic rename with the 5.2 Windows-EBUSY retry posture.\r\nfn atomic_write(path: &Path, bytes: &[u8]) -> io::Result<()> {\r\n    let tmp = path.with_extension(\"json.tmp\");\r\n    std::fs::write(&tmp, bytes)?;\r\n    for attempt in 0..5 {\r\n        match std::fs::rename(&tmp, path) {\r\n            Ok(()) => return Ok(()),\r\n            Err(_) if attempt < 4 => {\r\n                std::thread::sleep(std::time::Duration::from_millis(20 << attempt));\r\n            }\r\n            Err(e) => return Err(e),\r\n        }\r\n    }\r\n    unreachable!(\"loop returns on every path\")\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use crate::test_home::with_home;\r\n    use spt_store::info::{self, InfoJson};\r\n\r\n    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\r\n    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\r\n    // (a psyche-host session is not a project), dedups (a project's newest occurrence\r\n    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\r\n    #[test]\r\n    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\r\n        let tmp = tempfile::tempdir().unwrap();\r\n        let root = tmp.path();\r\n        let owlery = root.join(\"owlery\");\r\n        let perch = owlery.join(\"hall-a\");\r\n        std::fs::create_dir_all(&perch).unwrap();\r\n        // Real project dirs OUTSIDE any repo → project_id_for_dir falls back to the\r\n        // folder name (no remote, no git toplevel).\r\n        let work = root.join(\"work\");\r\n        for p in [\"alpha\", \"beta\", \"gamma\"] {\r\n            std::fs::create_dir_all(work.join(p)).unwrap();\r\n        }\r\n        let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal → excluded\r\n        std::fs::create_dir_all(&psyche).unwrap();\r\n        let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");\r\n…\n    }\n…\n}","startLine":1044,"lineNumbers":[1044,null,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,null,1233,null,2428]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":7732,"outputLines":165,"outputBytes":7732,"shownRange":{"start":1049,"end":1213},"nextOffset":1214}}},"isError":false,"timestamp":1784293331472}}
{"type":"message","id":"24ea43ec","parentId":"9ad5edba","timestamp":"2026-07-17T13:02:11.492Z","message":{"role":"toolResult","toolCallId":"call_PQIP2YnMDzHKJc003nSe4AwF|fc_034a6be5a6696b6c016a5a27d2f3bc819182164ca9f3ab7267","toolName":"read","content":[{"type":"text","text":"    fn merge_labels_locked(\n…\n    ) -> Vec<RegistryApplyVerdict> {\n        updates\n…\n            .map(|u| {\n…\n                let reg = regs.entry(u.subnet.clone()).or_default();\n                RegistryApplyVerdict::Merged(reg.merge_node_label(\n                    &u.node,\n                    u.label.clone(),\n                    u.epoch,\n                ))\n            })\n            .collect()\n    }\n\n    /// Record an admitted inbound feed (any origin) for the health surface.\n    // [impl->REQ-PUMP-STAGE-TRUTH]\n    fn stamp_admit(&self) {\n        self.last_admit_ms\n            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\n    }\n\n    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\n    /// this process lifetime (ADR-0039 Decision 5 status field).\n    // [impl->REQ-PUMP-STAGE-TRUTH]\n    pub fn last_admit_ms(&self) -> Option<u64> {\n        match self\n            .last_admit_ms\n            .load(std::sync::atomic::Ordering::Relaxed)\n        {\n            0 => None,\n            ms => Some(ms),\n        }\n    }\n\n    /// Scan the owlery and (re-)advertise every self perch into every member\n    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\n    /// the updates to push to peers (the node's own rows only — peers' rows\n    /// reconverge from their own re-advertisement, no transitive gossip in\n    /// v1: trust is pairwise per subnet, a relayed third-party row would\n    /// carry an origin the receiver can't gate honestly).\n    // [impl->REQ-INST-7]\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n        let subnets = SubnetStore::load();\n        let mut vis = VisibilityStore::load();\n        // First-join home adoption (D9-5, REQ-INST-15): within one\n        // advertisement cadence of the node's first join (a pair lands the\n        // subnet record; no pairing-protocol threading needed), unhomed Self\n        // perches adopt the sole subnet + seed their sync scope. Strictly\n        // adopt-if-unset; a multi-subnet store adopts nothing.\n        // [impl->REQ-INST-15]\n        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\n            let _ = vis.save();\n        }\n        let vis = vis;\n        // The node-level resource-blurb seed (D9-4): an endpoint that has not\n        // authored its own blurb advertises this default (config seeds, the\n        // agent refines — CONTEXT §resource advertisement).\n        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\n        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\n        // §Discovery scope): registered kind=\"shell\" adapters that chose\n        // broadcast=subnet ride every row this node authors — the other-node\n        // discovery arm. Computed once per scan (the registration set is\n        // node-level).\n        // [impl->REQ-EP-5]\n        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\n            .iter()\n            .filter(|(r, m)| {\n                r.kind == spt_runtime::manifest::AdapterKind::Shell\n                    && m.shell.as_ref().and_then(|s| s.broadcast)\n                        == Some(spt_runtime::manifest::Broadcast::Subnet)\n            })\n            .map(|(r, _)| r.name.clone())\n            .collect();\n        let mut out = Vec::new();\n        let mut regs = self.regs.lock().unwrap();\n        let mut epoch = self.epoch.lock().unwrap();\n\n        // The set of self perches that still EXIST on disk this round — the\n        // ghost-heal predicate below (a LOCAL registry row whose id is absent\n        // here was erased, REQ-HAZARD-ROSTER-GHOST).\n        let live_ids: std::collections::BTreeSet<String> =\n            perch::list_self_perch_ids(owlery).into_iter().collect();\n\n        for id in perch::list_self_perch_ids(owlery) {\n            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\n            // Advertisement follows the resting-state machine (D9-2,\n            // REQ-INST-3): a live perch with a resting record advertises its\n            // machine state (active / dormant / suspended); a recordless\n            // (pre-D9-2 / interim) or dead perch keeps the legacy\n            // liveness-derived mapping. Every advertisement stamps a fresh\n            // epoch below, so a transition reaches peers as an epoch-bumped\n            // update — the lease orders it (KH 4.8).\n            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\n            let status = advertised_status(&perch_path);\n            // Endpoint-authored blurb wins; the node seed fills the gap\n            // (both-authored, REQ-INST-14). Rides the same epoch lease as\n            // every instance update — a blurb edit reaches peers as an\n            // ordered, epoch-bumped row.\n            // [impl->REQ-INST-14]\n            let info = spt_store::info::read_info(&perch_path);\n            let resources = info\n                .as_ref()\n                .and_then(|i| i.resources.clone())\n                .or_else(|| node_blurb.clone());\n            // The presence datum (M5-D6a, REQ-PRES-1): the perch's heartbeat\n            // stamp (`lifecycle::touch_active` — Active seats only; a resting\n            // seat never stamps) rides the row like the blurb does — same\n            // epoch lease, same visibility gate, no new channel. Subnet-wide\n            // most-recently-active is a projection of these rows (D6b).\n            // [impl->REQ-PRES-1]\n            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\n            // info.json `state` IS the bound endpoint type\n            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\n            // A node advertises ONLY its own endpoints' types; the cross-node\n            // user-msg gate reads this at the receive funnel (T3). A recordless\n            // perch advertises no type → the funnel fail-closes to a re-stamp.\n            // [impl->REQ-MSG-6]\n            let endpoint_type = info.as_ref().map(|i| i.state.clone());\n            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\n            // the SAME local facts the picker's `local_rows` reads off info.json,\n            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\n            // identically instead of reducing every remote row to plain green.\n            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\n            //    so an UNBOUND perch reads false — exactly the fill duality the\n            //    picker keys on).\n            //  - controller_node: the broker-owned `driven_by` (the driving node),\n            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\n            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\n            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\n            //    None self-corrects on the next bind, so it advertises harness-only\n            //    until then, matching the local amber).\n            // [impl->REQ-SUBNET-DISPLAY-PARITY]\n            let bound = is_perch_alive(&perch_path);\n            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\n            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\n            // sets the separate `controlled` flag instead, and its driving node IS\n            // this node — so advertise `self.node_hex`. A remote controller keeps\n            // its own origin. This is what lets a remote viewer see a\n            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\n            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\n            let controller_node = gossip_controller_node(\n                info.as_ref().and_then(|i| i.driven_by.as_deref()),\n                info.as_ref().is_some_and(|i| i.controlled),\n                &self.node_hex,\n            );\n            let harness_only = info.as_ref().is_some_and(|i| {\n                i.state == \"live_agent\" && i.controllable != Some(true)\n            });\n            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\n            // real harness adapter + its recent projects + the EXPLICIT any-controller\n            // truth, gossiped so `from_resource_row` stops faking remote rows.\n            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\n            //    used to show the resources blurb here).\n            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n            let recent_projects = recent_projects_for(&perch_path, owlery);\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status,\n                    epoch: ep,\n                    resources: resources.clone(),\n                    last_active_ms,\n                    shell_adapters: shell_adapters.clone(),\n                    // The node label rides every row this node authors\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n                    // startup, so a rename converges by re-advertisement.\n                    // [impl->REQ-SUBNET-3]\n                    node_label: self.node_label.clone(),\n                    // The hashed machine id rides beside it (M8 decision\n                    // 13/22) — the re-pair overwrite anchor.\n                    // [impl->REQ-SUBNET-7]\n                    machine_id: self.machine_id.clone(),\n…\n                };\n…\n            }\n        }\n…\n    }\n\n[Showing lines 429-603 of 2429. Use :604 to continue]"}],"details":{"truncation":{"content":"                let reg = regs.entry(u.subnet.clone()).or_default();\r\n                RegistryApplyVerdict::Merged(reg.merge_node_label(\r\n                    &u.node,\r\n                    u.label.clone(),\r\n                    u.epoch,\r\n                ))\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Record an admitted inbound feed (any origin) for the health surface.\r\n    // [impl->REQ-PUMP-STAGE-TRUTH]\r\n    fn stamp_admit(&self) {\r\n        self.last_admit_ms\r\n            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\r\n    }\r\n\r\n    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\r\n    /// this process lifetime (ADR-0039 Decision 5 status field).\r\n    // [impl->REQ-PUMP-STAGE-TRUTH]\r\n    pub fn last_admit_ms(&self) -> Option<u64> {\r\n        match self\r\n            .last_admit_ms\r\n            .load(std::sync::atomic::Ordering::Relaxed)\r\n        {\r\n            0 => None,\r\n            ms => Some(ms),\r\n        }\r\n    }\r\n\r\n    /// Scan the owlery and (re-)advertise every self perch into every member\r\n    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\r\n    /// the updates to push to peers (the node's own rows only — peers' rows\r\n    /// reconverge from their own re-advertisement, no transitive gossip in\r\n    /// v1: trust is pairwise per subnet, a relayed third-party row would\r\n    /// carry an origin the receiver can't gate honestly).\r\n    // [impl->REQ-INST-7]\r\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\r\n        let subnets = SubnetStore::load();\r\n        let mut vis = VisibilityStore::load();\r\n        // First-join home adoption (D9-5, REQ-INST-15): within one\r\n        // advertisement cadence of the node's first join (a pair lands the\r\n        // subnet record; no pairing-protocol threading needed), unhomed Self\r\n        // perches adopt the sole subnet + seed their sync scope. Strictly\r\n        // adopt-if-unset; a multi-subnet store adopts nothing.\r\n        // [impl->REQ-INST-15]\r\n        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\r\n            let _ = vis.save();\r\n        }\r\n        let vis = vis;\r\n        // The node-level resource-blurb seed (D9-4): an endpoint that has not\r\n        // authored its own blurb advertises this default (config seeds, the\r\n        // agent refines — CONTEXT §resource advertisement).\r\n        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\r\n        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\r\n        // §Discovery scope): registered kind=\"shell\" adapters that chose\r\n        // broadcast=subnet ride every row this node authors — the other-node\r\n        // discovery arm. Computed once per scan (the registration set is\r\n        // node-level).\r\n        // [impl->REQ-EP-5]\r\n        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\r\n            .iter()\r\n            .filter(|(r, m)| {\r\n                r.kind == spt_runtime::manifest::AdapterKind::Shell\r\n                    && m.shell.as_ref().and_then(|s| s.broadcast)\r\n                        == Some(spt_runtime::manifest::Broadcast::Subnet)\r\n            })\r\n            .map(|(r, _)| r.name.clone())\r\n            .collect();\r\n        let mut out = Vec::new();\r\n        let mut regs = self.regs.lock().unwrap();\r\n        let mut epoch = self.epoch.lock().unwrap();\r\n\r\n        // The set of self perches that still EXIST on disk this round — the\r\n        // ghost-heal predicate below (a LOCAL registry row whose id is absent\r\n        // here was erased, REQ-HAZARD-ROSTER-GHOST).\r\n        let live_ids: std::collections::BTreeSet<String> =\r\n            perch::list_self_perch_ids(owlery).into_iter().collect();\r\n\r\n        for id in perch::list_self_perch_ids(owlery) {\r\n            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n            // Advertisement follows the resting-state machine (D9-2,\r\n            // REQ-INST-3): a live perch with a resting record advertises its\r\n            // machine state (active / dormant / suspended); a recordless\r\n            // (pre-D9-2 / interim) or dead perch keeps the legacy\r\n            // liveness-derived mapping. Every advertisement stamps a fresh\r\n            // epoch below, so a transition reaches peers as an epoch-bumped\r\n            // update — the lease orders it (KH 4.8).\r\n            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\r\n            let status = advertised_status(&perch_path);\r\n            // Endpoint-authored blurb wins; the node seed fills the gap\r\n            // (both-authored, REQ-INST-14). Rides the same epoch lease as\r\n            // every instance update — a blurb edit reaches peers as an\r\n            // ordered, epoch-bumped row.\r\n            // [impl->REQ-INST-14]\r\n            let info = spt_store::info::read_info(&perch_path);\r\n            let resources = info\r\n                .as_ref()\r\n                .and_then(|i| i.resources.clone())\r\n                .or_else(|| node_blurb.clone());\r\n            // The presence datum (M5-D6a, REQ-PRES-1): the perch's heartbeat\r\n            // stamp (`lifecycle::touch_active` — Active seats only; a resting\r\n            // seat never stamps) rides the row like the blurb does — same\r\n            // epoch lease, same visibility gate, no new channel. Subnet-wide\r\n            // most-recently-active is a projection of these rows (D6b).\r\n            // [impl->REQ-PRES-1]\r\n            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\r\n            // info.json `state` IS the bound endpoint type\r\n            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\r\n            // A node advertises ONLY its own endpoints' types; the cross-node\r\n            // user-msg gate reads this at the receive funnel (T3). A recordless\r\n            // perch advertises no type → the funnel fail-closes to a re-stamp.\r\n            // [impl->REQ-MSG-6]\r\n            let endpoint_type = info.as_ref().map(|i| i.state.clone());\r\n            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\r\n            // the SAME local facts the picker's `local_rows` reads off info.json,\r\n            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\r\n            // identically instead of reducing every remote row to plain green.\r\n            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\r\n            //    so an UNBOUND perch reads false — exactly the fill duality the\r\n            //    picker keys on).\r\n            //  - controller_node: the broker-owned `driven_by` (the driving node),\r\n            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\r\n            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\r\n            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\r\n            //    None self-corrects on the next bind, so it advertises harness-only\r\n            //    until then, matching the local amber).\r\n            // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n            let bound = is_perch_alive(&perch_path);\r\n            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\r\n            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\r\n            // sets the separate `controlled` flag instead, and its driving node IS\r\n            // this node — so advertise `self.node_hex`. A remote controller keeps\r\n            // its own origin. This is what lets a remote viewer see a\r\n            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\r\n            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\r\n            let controller_node = gossip_controller_node(\r\n                info.as_ref().and_then(|i| i.driven_by.as_deref()),\r\n                info.as_ref().is_some_and(|i| i.controlled),\r\n                &self.node_hex,\r\n            );\r\n            let harness_only = info.as_ref().is_some_and(|i| {\r\n                i.state == \"live_agent\" && i.controllable != Some(true)\r\n            });\r\n            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\r\n            // real harness adapter + its recent projects + the EXPLICIT any-controller\r\n            // truth, gossiped so `from_resource_row` stops faking remote rows.\r\n            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\r\n            //    used to show the resources blurb here).\r\n            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\r\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\r\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\r\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\r\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\r\n            let recent_projects = recent_projects_for(&perch_path, owlery);\r\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status,\r\n                    epoch: ep,\r\n                    resources: resources.clone(),\r\n                    last_active_ms,\r\n                    shell_adapters: shell_adapters.clone(),\r\n                    // The node label rides every row this node authors\r\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\r\n                    // startup, so a rename converges by re-advertisement.\r\n                    // [impl->REQ-SUBNET-3]\r\n                    node_label: self.node_label.clone(),\r\n                    // The hashed machine id rides beside it (M8 decision\r\n                    // 13/22) — the re-pair overwrite anchor.\r\n                    // [impl->REQ-SUBNET-7]\r\n                    machine_id: self.machine_id.clone(),\r","truncated":true,"truncatedBy":"lines","totalLines":2001,"totalBytes":10180,"outputLines":175,"outputBytes":10180,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn merge_labels_locked(\n…\n    ) -> Vec<RegistryApplyVerdict> {\n        updates\n…\n            .map(|u| {\n…\n                let reg = regs.entry(u.subnet.clone()).or_default();\r\n                RegistryApplyVerdict::Merged(reg.merge_node_label(\r\n                    &u.node,\r\n                    u.label.clone(),\r\n                    u.epoch,\r\n                ))\r\n            })\r\n            .collect()\r\n    }\r\n\r\n    /// Record an admitted inbound feed (any origin) for the health surface.\r\n    // [impl->REQ-PUMP-STAGE-TRUTH]\r\n    fn stamp_admit(&self) {\r\n        self.last_admit_ms\r\n            .store(wall_ms(), std::sync::atomic::Ordering::Relaxed);\r\n    }\r\n\r\n    /// Wall-clock ms of the last admitted inbound registry/label feed, if any\r\n    /// this process lifetime (ADR-0039 Decision 5 status field).\r\n    // [impl->REQ-PUMP-STAGE-TRUTH]\r\n    pub fn last_admit_ms(&self) -> Option<u64> {\r\n        match self\r\n            .last_admit_ms\r\n            .load(std::sync::atomic::Ordering::Relaxed)\r\n        {\r\n            0 => None,\r\n            ms => Some(ms),\r\n        }\r\n    }\r\n\r\n    /// Scan the owlery and (re-)advertise every self perch into every member\r\n    /// subnet it is visible in, each row stamped with a fresh epoch. Returns\r\n    /// the updates to push to peers (the node's own rows only — peers' rows\r\n    /// reconverge from their own re-advertisement, no transitive gossip in\r\n    /// v1: trust is pairwise per subnet, a relayed third-party row would\r\n    /// carry an origin the receiver can't gate honestly).\r\n    // [impl->REQ-INST-7]\r\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\r\n        let subnets = SubnetStore::load();\r\n        let mut vis = VisibilityStore::load();\r\n        // First-join home adoption (D9-5, REQ-INST-15): within one\r\n        // advertisement cadence of the node's first join (a pair lands the\r\n        // subnet record; no pairing-protocol threading needed), unhomed Self\r\n        // perches adopt the sole subnet + seed their sync scope. Strictly\r\n        // adopt-if-unset; a multi-subnet store adopts nothing.\r\n        // [impl->REQ-INST-15]\r\n        if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {\r\n            let _ = vis.save();\r\n        }\r\n        let vis = vis;\r\n        // The node-level resource-blurb seed (D9-4): an endpoint that has not\r\n        // authored its own blurb advertises this default (config seeds, the\r\n        // agent refines — CONTEXT §resource advertisement).\r\n        let node_blurb = crate::config::DaemonConfig::load().resources_blurb;\r\n        // The node's subnet-broadcast shell adapters (M5-D8c, CONTEXT\r\n        // §Discovery scope): registered kind=\"shell\" adapters that chose\r\n        // broadcast=subnet ride every row this node authors — the other-node\r\n        // discovery arm. Computed once per scan (the registration set is\r\n        // node-level).\r\n        // [impl->REQ-EP-5]\r\n        let shell_adapters: Vec<String> = spt_runtime::registry::registered(&perch::adapters_dir())\r\n            .iter()\r\n            .filter(|(r, m)| {\r\n                r.kind == spt_runtime::manifest::AdapterKind::Shell\r\n                    && m.shell.as_ref().and_then(|s| s.broadcast)\r\n                        == Some(spt_runtime::manifest::Broadcast::Subnet)\r\n            })\r\n            .map(|(r, _)| r.name.clone())\r\n            .collect();\r\n        let mut out = Vec::new();\r\n        let mut regs = self.regs.lock().unwrap();\r\n        let mut epoch = self.epoch.lock().unwrap();\r\n\r\n        // The set of self perches that still EXIST on disk this round — the\r\n        // ghost-heal predicate below (a LOCAL registry row whose id is absent\r\n        // here was erased, REQ-HAZARD-ROSTER-GHOST).\r\n        let live_ids: std::collections::BTreeSet<String> =\r\n            perch::list_self_perch_ids(owlery).into_iter().collect();\r\n\r\n        for id in perch::list_self_perch_ids(owlery) {\r\n            let perch_path = perch::resolve_perch_path_in(owlery, &id, ParentHint::Infer);\r\n            // Advertisement follows the resting-state machine (D9-2,\r\n            // REQ-INST-3): a live perch with a resting record advertises its\r\n            // machine state (active / dormant / suspended); a recordless\r\n            // (pre-D9-2 / interim) or dead perch keeps the legacy\r\n            // liveness-derived mapping. Every advertisement stamps a fresh\r\n            // epoch below, so a transition reaches peers as an epoch-bumped\r\n            // update — the lease orders it (KH 4.8).\r\n            // [impl->REQ-INST-3] [impl->REQ-PRESENCE-LIVENESS-TRUTH]\r\n            let status = advertised_status(&perch_path);\r\n            // Endpoint-authored blurb wins; the node seed fills the gap\r\n            // (both-authored, REQ-INST-14). Rides the same epoch lease as\r\n            // every instance update — a blurb edit reaches peers as an\r\n            // ordered, epoch-bumped row.\r\n            // [impl->REQ-INST-14]\r\n            let info = spt_store::info::read_info(&perch_path);\r\n            let resources = info\r\n                .as_ref()\r\n                .and_then(|i| i.resources.clone())\r\n                .or_else(|| node_blurb.clone());\r\n            // The presence datum (M5-D6a, REQ-PRES-1): the perch's heartbeat\r\n            // stamp (`lifecycle::touch_active` — Active seats only; a resting\r\n            // seat never stamps) rides the row like the blurb does — same\r\n            // epoch lease, same visibility gate, no new channel. Subnet-wide\r\n            // most-recently-active is a projection of these rows (D6b).\r\n            // [impl->REQ-PRES-1]\r\n            // The endpoint's own advertised type tag (M9, REQ-MSG-6): the\r\n            // info.json `state` IS the bound endpoint type\r\n            // (`EndpointType::as_tag` — `\"gateway\"` for a Gateway surface).\r\n            // A node advertises ONLY its own endpoints' types; the cross-node\r\n            // user-msg gate reads this at the receive funnel (T3). A recordless\r\n            // perch advertises no type → the funnel fail-closes to a re-stamp.\r\n            // [impl->REQ-MSG-6]\r\n            let endpoint_type = info.as_ref().map(|i| i.state.clone());\r\n            // The unified subnet-display parity datums (REQ-SUBNET-DISPLAY-PARITY):\r\n            // the SAME local facts the picker's `local_rows` reads off info.json,\r\n            // now GOSSIPED so a remote viewer renders bound/controlled/harness-only\r\n            // identically instead of reducing every remote row to plain green.\r\n            //  - bound: a bound live broker session (`is_perch_alive` is bound-gated,\r\n            //    so an UNBOUND perch reads false — exactly the fill duality the\r\n            //    picker keys on).\r\n            //  - controller_node: the broker-owned `driven_by` (the driving node),\r\n            //    if any → the remote blue \"controlled\" + `controlled by <node>` pin.\r\n            //  - harness_only: a LiveAgent with no broker PTY seat — mirrors the\r\n            //    picker's `controllable != Some(true)` for a `live_agent` (a legacy\r\n            //    None self-corrects on the next bind, so it advertises harness-only\r\n            //    until then, matching the local amber).\r\n            // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n            let bound = is_perch_alive(&perch_path);\r\n            // #3 (REQ-GOSSIP-CONTROLLED-ANY): gossip ANY controller, not just a\r\n            // remote one. `driven_by` is remote-only (KH 7.15); a LOCAL controller\r\n            // sets the separate `controlled` flag instead, and its driving node IS\r\n            // this node — so advertise `self.node_hex`. A remote controller keeps\r\n            // its own origin. This is what lets a remote viewer see a\r\n            // locally-controlled endpoint as CONTROLLED, not \"ready to control\".\r\n            // [impl->REQ-GOSSIP-CONTROLLED-ANY]\r\n            let controller_node = gossip_controller_node(\r\n                info.as_ref().and_then(|i| i.driven_by.as_deref()),\r\n                info.as_ref().is_some_and(|i| i.controlled),\r\n                &self.node_hex,\r\n            );\r\n            let harness_only = info.as_ref().is_some_and(|i| {\r\n                i.state == \"live_agent\" && i.controllable != Some(true)\r\n            });\r\n            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\r\n            // real harness adapter + its recent projects + the EXPLICIT any-controller\r\n            // truth, gossiped so `from_resource_row` stops faking remote rows.\r\n            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\r\n            //    used to show the resources blurb here).\r\n            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\r\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\r\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\r\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\r\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\r\n            let recent_projects = recent_projects_for(&perch_path, owlery);\r\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status,\r\n                    epoch: ep,\r\n                    resources: resources.clone(),\r\n                    last_active_ms,\r\n                    shell_adapters: shell_adapters.clone(),\r\n                    // The node label rides every row this node authors\r\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\r\n                    // startup, so a rename converges by re-advertisement.\r\n                    // [impl->REQ-SUBNET-3]\r\n                    node_label: self.node_label.clone(),\r\n                    // The hashed machine id rides beside it (M8 decision\r\n                    // 13/22) — the re-pair overwrite anchor.\r\n                    // [impl->REQ-SUBNET-7]\r\n                    machine_id: self.machine_id.clone(),\r\n…\n                };\n…\n            }\n        }\n…\n    }","startLine":410,"lineNumbers":[410,null,417,418,null,420,null,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,null,620,null,643,644,null,727]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":10180,"outputLines":175,"outputBytes":10180,"shownRange":{"start":429,"end":603},"nextOffset":604}}},"isError":false,"timestamp":1784293331492}}
{"type":"message","id":"2ea3a902","parentId":"24ea43ec","timestamp":"2026-07-17T13:02:18.515Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Searching for serve_registry_feed definition**"},{"type":"toolCall","id":"call_qn2rLWBMcURpv8izGF6u4CCK|fc_034a6be5a6696b6c016a5a27d969548191940515de9630c0f0","name":"grep","arguments":{"i":"Locating registry feed transaction","pattern":"fn serve_registry_feed|FeedAccumulator|apply_feed_batch|commit_feed_batch","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":10623,"output":93,"cacheRead":156160,"cacheWrite":0,"totalTokens":166876,"reasoningTokens":21,"cost":{"input":0.053115,"output":0.00279,"cacheRead":0.07808,"cacheWrite":0,"total":0.133985}},"stopReason":"toolUse","timestamp":1784293331547,"responseId":"resp_034a6be5a6696b6c016a5a27d427008191a562b3aab4fb7149","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27d76c2c8191a41a911f1fe6615b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWifZpzN8sw1uJ0_MRGpVGznGVkB6nvdmKFBdi4v5TTd42xHLWIeRgrQgiW1RLAFHFxu6G7IDGdXD-z_g-K7psSrs_j8kCr2IzoOalaKG438vj9UNBhYaZS1xB6PNHX3X0J1zNwWVzkXUX2uqBDj8rsGIIYlzhwWovZV11xO85lfI2zVlYD6BP_jq4uDXENIHOz5J-sIaov4v8gE-26bQ57u0IzdTJ-VJnK1nU8lfBpU41TEAiDqfzWVOoaw2JdPA9LfObQFj3Slf2pjd3u1d-m0aydfs83BeHs8D8SSBU6PR59qRhiYi_V8vJZfbkBlXmhjzutPwsPnn3DYz-bMVjj70SzaIhaYjSmMUztx7Icjlp3__8S4jC-8DWLtm5x2s7ZPlqsLMWCUun5zkRwLPha9xW9QQt7GyqPocLB6kb8xzQCZi4FmFt8QVCFCkA8ZSEEWuCWnCdDmELf4R48ojOSlDTesd_bA_JHdJluzDsSE4nUGKizavh8EPSHG0UvJiPm2J6IUKnzfT_7fiKv-tANaNfzs9WP-nTLO53n5ExUddU9SLDI9Cynl42RMwtheuxBbPq0aK9PfHbxH22wxoklLzi_9bUC2WrhW6RBjQ4p1rzGVibNRJvFTWqnUaFOWudWMtikvIM66EWABKNIiWJbg_UaJtn4aBcJugyCtYmZ43Balc81ZQBx7Q8C4emMappqE-XlsP5qazqxDDh0o1oMNfXRvFZ6veSTV9vx42K0N9bMkCHBRvFeTJUujFDypQ95tN5NOZhak2w0guLoR06OkKP_-9C-5roeHdxoUpnIz5oz-nN7ZpBBq2Lxw5yh5oIjGB2-j-DWpjsPzojljGFiw3NosXZiCgWlvdxdkFFvCW8WEN-g3lFs4ADirj4OW123TzutWvdTtNwCsjhD-V-qW2Y5UzUXL4wdAacMNLxgAES3kQytn2BJbmihOUfeW-yqe9qpJVmRxmLgydIrKAW02VJ47eE8XPeO66-X3tb1mIJ0nWPfnsDXc-MfTf6f5vS_EkqZV25ZAZNsMXZo6h5hPRnw==","summary":[{"type":"summary_text","text":"**Searching for serve_registry_feed definition**"}]},{"id":"fc_034a6be5a6696b6c016a5a27d969548191940515de9630c0f0","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating registry feed transaction\",\"pattern\":\"fn serve_registry_feed|FeedAccumulator|apply_feed_batch|commit_feed_batch\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_qn2rLWBMcURpv8izGF6u4CCK","name":"grep"}]},"duration":6967.084100008011,"ttft":3954.2692999988794,"contextSnapshot":{"promptTokens":166783,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qn2rLWBMcURpv8izGF6u4CCK|fc_034a6be5a6696b6c016a5a27d969548191940515de9630c0f0","toolName":"grep","startedAt":"2026-07-17T13:02:18.515Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Locating registry feed transaction"},"id":"67fc47e4","parentId":"2ea3a902","timestamp":"2026-07-17T13:02:18.515Z"}
{"type":"message","id":"3755dcf1","parentId":"67fc47e4","timestamp":"2026-07-17T13:02:18.517Z","message":{"role":"toolResult","toolCallId":"call_qn2rLWBMcURpv8izGF6u4CCK|fc_034a6be5a6696b6c016a5a27d969548191940515de9630c0f0","toolName":"grep","content":[{"type":"text","text":" 1117|// [impl->REQ-INST-7]\n*1118|fn serve_registry_feed(\n 1119|    brain: &mut Brain,\n 1120|    stream_id: u64,\n 1121|    origin: &str,\n...\n 1128|    let mut decoder = RegistryDecoder::new();\n*1129|    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130|    let mut merged = 0usize;\n 1131|    let mut shifted: Vec<String> = Vec::new();\n 1132|    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n...\n 1147|                if let Some(batch) = acc.push(decoder.push(&bytes)) {\n*1148|                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n 1149|                }\n 1150|            }\n 1151|            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1152|                if let Some(batch) = acc.finish() {\n*1153|                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n 1154|                }\n 1155|                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n 1156|            }\n...\n 1167|// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*1168|fn commit_feed_batch(\n 1169|    registry: &RegistryHost,\n 1170|    origin: &str,\n 1171|    policy: &RegistryGatePolicy,\n...\n 1174|) -> usize {\n*1175|    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\n 1176|    // Attention shift (D9-2): only ids this node actually hosts (a perch\n 1177|    // with a record); everything else is a no-op here.\n 1178|    // [impl->REQ-INST-3]\n...\n 1228|// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*1229|struct FeedAccumulator {\n 1230|    bound: usize,\n 1231|    batch: FeedBatch,\n 1232|}\n 1233|\n*1234|impl FeedAccumulator {\n*1235|    fn new(bound: usize) -> FeedAccumulator {\n*1236|        FeedAccumulator {\n 1237|            bound: bound.max(1),\n 1238|            batch: FeedBatch::default(),\n 1239|        }\n...\n 1895|        // finish batch carries every record, kind-split.\n*1896|        let mut acc = FeedAccumulator::new(10);\n 1897|        assert!(acc.push(vec![inst(\"a\"), lbl()]).is_none(), \"chunk 1: pooled\");\n 1898|        assert!(acc.push(vec![]).is_none(), \"an empty chunk commits nothing\");\n 1899|        assert!(acc.push(vec![inst(\"b\")]).is_none(), \"chunk 3: pooled\");\n...\n 1905|        // batches, memory stays bounded.\n*1906|        let mut acc = FeedAccumulator::new(3);\n 1907|        assert!(acc.push(vec![inst(\"a\"), inst(\"b\")]).is_none());\n 1908|        let full = acc.push(vec![inst(\"c\"), inst(\"d\")]).expect(\"bound tripped\");\n 1909|        assert_eq!(full.len(), 4, \"the tripped batch carries what pooled\");\n...\n 1913|        // An EMPTY feed commits nothing at all (zero snapshot writes ride on\n*1914|        // this: apply_feed_batch is never called with an empty remainder).\n*1915|        let mut acc = FeedAccumulator::new(10);\n 1916|        assert!(acc.push(vec![]).is_none());\n 1917|        assert!(acc.finish().is_none(), \"an empty feed commits nothing\");\n 1918|    }"}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":14,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":14}],"truncated":false,"displayContent":" 1117│// [impl->REQ-INST-7]\n*1118│fn serve_registry_feed(\n 1119│    brain: &mut Brain,\n 1120│    stream_id: u64,\n 1121│    origin: &str,\n     │...\n 1128│    let mut decoder = RegistryDecoder::new();\n*1129│    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130│    let mut merged = 0usize;\n 1131│    let mut shifted: Vec<String> = Vec::new();\n 1132│    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n     │...\n 1147│                if let Some(batch) = acc.push(decoder.push(&bytes)) {\n*1148│                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n 1149│                }\n 1150│            }\n 1151│            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n 1152│                if let Some(batch) = acc.finish() {\n*1153│                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n 1154│                }\n 1155│                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n 1156│            }\n     │...\n 1167│// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*1168│fn commit_feed_batch(\n 1169│    registry: &RegistryHost,\n 1170│    origin: &str,\n 1171│    policy: &RegistryGatePolicy,\n     │...\n 1174│) -> usize {\n*1175│    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\n 1176│    // Attention shift (D9-2): only ids this node actually hosts (a perch\n 1177│    // with a record); everything else is a no-op here.\n 1178│    // [impl->REQ-INST-3]\n     │...\n 1228│// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*1229│struct FeedAccumulator {\n 1230│    bound: usize,\n 1231│    batch: FeedBatch,\n 1232│}\n 1233│\n*1234│impl FeedAccumulator {\n*1235│    fn new(bound: usize) -> FeedAccumulator {\n*1236│        FeedAccumulator {\n 1237│            bound: bound.max(1),\n 1238│            batch: FeedBatch::default(),\n 1239│        }\n     │...\n 1895│        // finish batch carries every record, kind-split.\n*1896│        let mut acc = FeedAccumulator::new(10);\n 1897│        assert!(acc.push(vec![inst(\"a\"), lbl()]).is_none(), \"chunk 1: pooled\");\n 1898│        assert!(acc.push(vec![]).is_none(), \"an empty chunk commits nothing\");\n 1899│        assert!(acc.push(vec![inst(\"b\")]).is_none(), \"chunk 3: pooled\");\n     │...\n 1905│        // batches, memory stays bounded.\n*1906│        let mut acc = FeedAccumulator::new(3);\n 1907│        assert!(acc.push(vec![inst(\"a\"), inst(\"b\")]).is_none());\n 1908│        let full = acc.push(vec![inst(\"c\"), inst(\"d\")]).expect(\"bound tripped\");\n 1909│        assert_eq!(full.len(), 4, \"the tripped batch carries what pooled\");\n     │...\n 1913│        // An EMPTY feed commits nothing at all (zero snapshot writes ride on\n*1914│        // this: apply_feed_batch is never called with an empty remainder).\n*1915│        let mut acc = FeedAccumulator::new(10);\n 1916│        assert!(acc.push(vec![]).is_none());\n 1917│        assert!(acc.finish().is_none(), \"an empty feed commits nothing\");\n 1918│    }"},"isError":false,"timestamp":1784293338516}}
{"type":"message","id":"349a35ba","parentId":"3755dcf1","timestamp":"2026-07-17T13:02:25.614Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":""},{"type":"toolCall","id":"call_hwphogL0BPExJPfBz35v2ZbU|fc_034a6be5a6696b6c016a5a27e11190819190f1c91994f0484d","name":"read","arguments":{"i":"Reading registry feed transaction","path":"crates/spt-daemon/src/dispatch.rs","selector":"1100-1280"}},{"type":"toolCall","id":"call_4ORBZZtM3DvsBXKt1dxdqKDL|fc_034a6be5a6696b6c016a5a27e111a481919402552e41f7f5b9","name":"grep","arguments":{"i":"Locating registry batch size","pattern":"REGISTRY_APPLY_BATCH_RECORDS","path":"crates/spt-daemon/src/dispatch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_Ka4j8vEMhTxZNbCtEuMU8hoo|fc_034a6be5a6696b6c016a5a27e111ac81918ef1a1cda6e07857","name":"grep","arguments":{"i":"Locating batch snapshot writer","pattern":"pub fn apply_feed_batch|fn apply_feed_batch|write_snapshots","path":"crates/spt-daemon/src/registryhost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_94FBb3JJOWHDvMl8OBqtPOqb|fc_034a6be5a6696b6c016a5a27e111b88191b535e522d3539383","name":"read","arguments":{"i":"Reading registry snapshot writes","path":"crates/spt-daemon/src/registryhost.rs","selector":"200-360,720-780"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":3425,"output":235,"cacheRead":164352,"cacheWrite":0,"totalTokens":168012,"reasoningTokens":12,"cost":{"input":0.017125,"output":0.00705,"cacheRead":0.082176,"cacheWrite":0,"total":0.106351}},"stopReason":"toolUse","timestamp":1784293338561,"responseId":"resp_034a6be5a6696b6c016a5a27dafe3c8191bb96e45864dcec6f","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27dcd65c8191a7b95b8687d1eab9","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWifhb7i4mo96zKQHQoLaUtpMNoCy0ooB3WHlG8bLTiyuF2FkzEdFPfSI48bWIcnGY3y8aX5HrSWamr-4li4oktEBRfAB3IV6Ig_NzBbxSkdGWf3hrcqefzmo_9TvWwYo8KNUPzuu0LlfNi0d8bYXG2JwrimcCgoeRx2ZA6Jmvwjqkj4KJApKRVdK_E6Tqkd_0XnPmHphb0eztMJHraSR_rzTgaPkLMl8vxCAefQuLbQkVw-hMi-yhKQQhTGOfnLE9defZNAOt2otKVQkmEIUVtIWhtVylS1Err3HvdKbX9evCNtPv86RHLwebIJtSqzLt7vS7np_KDj68MvfVWGqvRVqTPQUV7OJrquePChh-rvZHTqHLBNFStHdJ5mGyMLATzoaLl28uQDPEi-nYZAQBGUDgzEXYVDZJ2I9-KF7l3O35TCTrJ3bN6LXNy9n0akSRufaRBQg5x1lve5dmhtOSRAIEpBsd69RWU8wPuBlxk07GQcwuIEn1N_po8rM-Pf_cEK5gXlazKvia81QrJwRX-W7fIQrTAaRO9Kp_PAArizfM8PvRG8cezebj93mQuJ6WG8CnXJQeKoXERiuSYBpgCNxU6E619WIXr9GF_KPGeIuka5Cnow7s1XfgJuhfEEWTnfH1MDuP-uTacZPOop7Z75XCeVhi9NrXrJvjSIO0804ecoQ5HbFo0y9O-hcMbpInix1jq5zt9gxAKMujtDGTq5FW1ClIakiM5ytjF2XFNrKvB5tlTdCccmvOCTB34KOnpL37H9HltMKnUQWur7oFfMxKvzaJDp_oEm7lCZL3sUPFNQGeoQPv7fRSB0UPQhH3inhfj6EgurwgWRmptjN7Q1nhOODdD_t6LE4kd7cyJBOUiD9JBCrlqsT3ue1tcgUwG7ZEO1FmEHUP4l3mKvytIEE9pVH8eEDUifboNR6GoL609m8hcOwKdlHdcsbB6xrS2nj","summary":[]},{"id":"fc_034a6be5a6696b6c016a5a27e11190819190f1c91994f0484d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry feed transaction\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"1100-1280\"}","call_id":"call_hwphogL0BPExJPfBz35v2ZbU","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27e111a481919402552e41f7f5b9","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating registry batch size\",\"pattern\":\"REGISTRY_APPLY_BATCH_RECORDS\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_4ORBZZtM3DvsBXKt1dxdqKDL","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27e111ac81918ef1a1cda6e07857","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating batch snapshot writer\",\"pattern\":\"pub fn apply_feed_batch|fn apply_feed_batch|write_snapshots\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_Ka4j8vEMhTxZNbCtEuMU8hoo","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27e111b88191b535e522d3539383","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry snapshot writes\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"200-360,720-780\"}","call_id":"call_94FBb3JJOWHDvMl8OBqtPOqb","name":"read"}]},"duration":7052.434599995613,"ttft":2391.8032999932766,"contextSnapshot":{"promptTokens":167777,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hwphogL0BPExJPfBz35v2ZbU|fc_034a6be5a6696b6c016a5a27e11190819190f1c91994f0484d","toolName":"read","startedAt":"2026-07-17T13:02:25.614Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading registry feed transaction"},"id":"ac659938","parentId":"349a35ba","timestamp":"2026-07-17T13:02:25.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_4ORBZZtM3DvsBXKt1dxdqKDL|fc_034a6be5a6696b6c016a5a27e111a481919402552e41f7f5b9","toolName":"grep","startedAt":"2026-07-17T13:02:25.614Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Locating registry batch size"},"id":"a726787e","parentId":"ac659938","timestamp":"2026-07-17T13:02:25.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_Ka4j8vEMhTxZNbCtEuMU8hoo|fc_034a6be5a6696b6c016a5a27e111ac81918ef1a1cda6e07857","toolName":"grep","startedAt":"2026-07-17T13:02:25.614Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Locating batch snapshot writer"},"id":"5855766f","parentId":"a726787e","timestamp":"2026-07-17T13:02:25.614Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_94FBb3JJOWHDvMl8OBqtPOqb|fc_034a6be5a6696b6c016a5a27e111b88191b535e522d3539383","toolName":"read","startedAt":"2026-07-17T13:02:25.614Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry snapshot writes"},"id":"53b8e185","parentId":"5855766f","timestamp":"2026-07-17T13:02:25.614Z"}
{"type":"message","id":"fb943c5a","parentId":"53b8e185","timestamp":"2026-07-17T13:02:25.616Z","message":{"role":"toolResult","toolCallId":"call_4ORBZZtM3DvsBXKt1dxdqKDL|fc_034a6be5a6696b6c016a5a27e111a481919402552e41f7f5b9","toolName":"grep","content":[{"type":"text","text":" 1128|    let mut decoder = RegistryDecoder::new();\n*1129|    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130|    let mut merged = 0usize;\n 1131|    let mut shifted: Vec<String> = Vec::new();\n 1132|    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n...\n 1202|/// per-chunk. Generous: a real advertisement round is a few records per peer.\n*1203|const REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;\n 1204|\n 1205|/// One accumulated (pre-commit) slice of a registry feed, split by record\n 1206|/// kind for the two gated merge paths (REQ-SUBNET-3)."}],"details":{"scopePath":"crates/spt-daemon/src/dispatch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":1,"files":["crates/spt-daemon/src/dispatch.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/dispatch.rs","count":2}],"truncated":false,"displayContent":" 1128│    let mut decoder = RegistryDecoder::new();\n*1129│    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n 1130│    let mut merged = 0usize;\n 1131│    let mut shifted: Vec<String> = Vec::new();\n 1132│    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n     │...\n 1202│/// per-chunk. Generous: a real advertisement round is a few records per peer.\n*1203│const REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;\n 1204│\n 1205│/// One accumulated (pre-commit) slice of a registry feed, split by record\n 1206│/// kind for the two gated merge paths (REQ-SUBNET-3)."},"isError":false,"timestamp":1784293345615}}
{"type":"message","id":"fca76fd0","parentId":"fb943c5a","timestamp":"2026-07-17T13:02:25.616Z","message":{"role":"toolResult","toolCallId":"call_Ka4j8vEMhTxZNbCtEuMU8hoo|fc_034a6be5a6696b6c016a5a27e111ac81918ef1a1cda6e07857","toolName":"grep","content":[{"type":"text","text":" 124|    snapshot_dir: PathBuf,\n*125|    /// How many times [`write_snapshots`](Self::write_snapshots) ran this\n 126|    /// process — the REQ-REGISTRY-APPLY-TRANSACTIONAL observable: a feed\n 127|    /// applied transactionally writes ONCE per feed (bounded batches: once\n 128|    /// per batch), never once per chunk × record-kind (the KH 7.44 write\n...\n 275|        }\n*276|        self.write_snapshots();\n 277|        (verdicts, flips)\n 278|    }\n 279|\n...\n 346|    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n*347|    pub fn apply_feed_batch(\n 348|        &self,\n 349|        origin_node: &str,\n 350|        labels: &[NodeLabelUpdate],\n...\n 375|        }\n*376|        self.write_snapshots();\n 377|        (merged, flips)\n 378|    }\n 379|\n...\n 401|        }\n*402|        self.write_snapshots();\n 403|        verdicts\n 404|    }\n 405|\n...\n 724|        drop(regs);\n*725|        self.write_snapshots();\n 726|        out\n 727|    }\n 728|\n...\n 769|        if evicted > 0 {\n*770|            self.write_snapshots();\n 771|        }\n 772|        evicted\n 773|    }\n...\n 805|        if evicted > 0 {\n*806|            self.write_snapshots();\n 807|        }\n 808|        evicted\n 809|    }\n...\n 830|    /// that triggered it (readers tolerate staleness by contract).\n*831|    fn write_snapshots(&self) {\n 832|        self.snapshot_writes\n 833|            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n 834|        let regs = self.regs.lock().unwrap();\n...\n 913|        if evicted > 0 {\n*914|            self.write_snapshots();\n 915|        }\n 916|        evicted\n 917|    }\n...\n 1803|    #[test]\n*1804|    fn apply_feed_batch_writes_snapshots_once_with_per_kind_semantics_parity() {\n 1805|        let dir = tempfile::tempdir().unwrap();\n 1806|        let h = host(&dir.path().join(\"batch\"));\n 1807|        let twin_dir = tempfile::tempdir().unwrap();"}],"details":{"scopePath":"crates/spt-daemon/src/registryhost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":11,"fileCount":1,"files":["crates/spt-daemon/src/registryhost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/registryhost.rs","count":11}],"truncated":false,"displayContent":"  124│    snapshot_dir: PathBuf,\n *125│    /// How many times [`write_snapshots`](Self::write_snapshots) ran this\n  126│    /// process — the REQ-REGISTRY-APPLY-TRANSACTIONAL observable: a feed\n  127│    /// applied transactionally writes ONCE per feed (bounded batches: once\n  128│    /// per batch), never once per chunk × record-kind (the KH 7.44 write\n     │...\n  275│        }\n *276│        self.write_snapshots();\n  277│        (verdicts, flips)\n  278│    }\n  279│\n     │...\n  346│    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n *347│    pub fn apply_feed_batch(\n  348│        &self,\n  349│        origin_node: &str,\n  350│        labels: &[NodeLabelUpdate],\n     │...\n  375│        }\n *376│        self.write_snapshots();\n  377│        (merged, flips)\n  378│    }\n  379│\n     │...\n  401│        }\n *402│        self.write_snapshots();\n  403│        verdicts\n  404│    }\n  405│\n     │...\n  724│        drop(regs);\n *725│        self.write_snapshots();\n  726│        out\n  727│    }\n  728│\n     │...\n  769│        if evicted > 0 {\n *770│            self.write_snapshots();\n  771│        }\n  772│        evicted\n  773│    }\n     │...\n  805│        if evicted > 0 {\n *806│            self.write_snapshots();\n  807│        }\n  808│        evicted\n  809│    }\n     │...\n  830│    /// that triggered it (readers tolerate staleness by contract).\n *831│    fn write_snapshots(&self) {\n  832│        self.snapshot_writes\n  833│            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n  834│        let regs = self.regs.lock().unwrap();\n     │...\n  913│        if evicted > 0 {\n *914│            self.write_snapshots();\n  915│        }\n  916│        evicted\n  917│    }\n     │...\n 1803│    #[test]\n*1804│    fn apply_feed_batch_writes_snapshots_once_with_per_kind_semantics_parity() {\n 1805│        let dir = tempfile::tempdir().unwrap();\n 1806│        let h = host(&dir.path().join(\"batch\"));\n 1807│        let twin_dir = tempfile::tempdir().unwrap();"},"isError":false,"timestamp":1784293345616}}
{"type":"message","id":"d43f5913","parentId":"fca76fd0","timestamp":"2026-07-17T13:02:25.633Z","message":{"role":"toolResult","toolCallId":"call_94FBb3JJOWHDvMl8OBqtPOqb|fc_034a6be5a6696b6c016a5a27e111b88191b535e522d3539383","toolName":"read","content":[{"type":"text","text":"    pub fn instances_of(&self, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n            .lock()\n            .unwrap()\n            .values()\n            .flat_map(|reg| reg.instances(endpoint_id).iter().cloned())\n            .collect()\n    }\n\n    /// Run `f` with this host's **canonical per-node epoch** — the ONE\n    /// monotonic counter (identity/epoch.json) behind every locally-authored\n    /// registry row. Every other per-node-id producer on this node MUST mint\n    /// from the same source, or `node:epoch`-shaped ids collide: a notif_id is\n    /// `node_hex:epoch`, so the pump's consent-notif producer and the CLI\n    /// notify front door (which loads this same canonical source) would\n    /// otherwise issue the same id from independent counters. (Field bug: the\n    /// pump minted consent notif_ids from the stream-open op counter\n    /// `pump-ops.json` — a different file — so on a node whose two counters\n    /// were both low the consent notif and a presence/notify notif collided on\n    /// `node:1`. The rig's presence-redirect rung caught it: `UNIQUE\n    /// constraint failed: notifs.notif_id`.) Locks the shared cursor so the\n    /// dispatcher's registry arm and the pump never double-mint.\n    // [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\n    pub fn with_epoch<R>(&self, f: impl FnOnce(&mut EpochSource) -> R) -> R {\n        f(&mut self.epoch.lock().unwrap())\n    }\n\n    /// Apply one inbound feed under the gate. `origin_node` MUST be the\n    /// handshake-proven stream-table origin, never payload bytes.\n    // [impl->REQ-INST-7]\n    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n    pub fn apply_feed(\n        &self,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> Vec<RegistryApplyVerdict> {\n        self.apply_feed_flips(origin_node, updates, policy).0\n    }\n\n    /// [`apply_feed`](Self::apply_feed) that ALSO reports **attention\n    /// flips** (D9-2, REQ-INST-3): the endpoint ids whose admitted update was\n    /// an observed *transition to `Active` on a peer node* — the wire signal\n    /// that another instance of the id just became the driven one (its\n    /// daemon advertises transitions epoch-bumped), which rests a local\n    /// instance of the same id warm (CONTEXT: driving `ling@laptop` makes\n    /// `ling@desktop` dormant).\n    ///\n    /// Flip = `Updated` merge where the stored row's status was NOT `Active`\n    /// and the incoming one is. Deliberately **never `Inserted`**: this\n    /// registry is in-memory, so a daemon restart re-inserts every peer row\n    /// at its *current* status — counting inserts would knock local\n    /// instances dormant on every restart; and never the periodic\n    /// re-advertisement (`Updated` with prev already `Active` is not a\n    /// flip). The lease has already dropped stale/equal epochs before any\n    /// of this runs.\n    // [impl->REQ-INST-3]\n    pub fn apply_feed_flips(\n        &self,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n        let mut admitted_any = false;\n        let mut flips: Vec<String> = Vec::new();\n        let verdicts = {\n            let mut regs = self.regs.lock().unwrap();\n            self.merge_instances_locked(&mut regs, origin_node, updates, policy, &mut admitted_any, &mut flips)\n        };\n        // Gossip-recency stamp (M7 D2): an ADMITTED feed proves the origin\n        // node is up right now — even a Stale merge verdict is a liveness\n        // signal (the lease judged the row, not the sender). Refused feeds\n        // stamp nothing (an untrusted sender earns no liveness credit).\n        // [impl->REQ-SUBNET-1]\n        if admitted_any {\n            self.stamp_heard(origin_node);\n        }\n        self.write_snapshots();\n        (verdicts, flips)\n    }\n\n    /// Per-record instance merge under an ALREADY-HELD regs lock — the shared\n    /// core of [`apply_feed_flips`] and the transactional\n    /// [`apply_feed_batch`] (ADR-0040 decision 3): the fail-closed gate runs\n    /// PER RECORD in both shapes; only the snapshot-write cadence differs.\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    #[allow(clippy::too_many_arguments)]\n    fn merge_instances_locked(\n        &self,\n        regs: &mut BTreeMap<String, SubnetRegistry>,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n        admitted_any: &mut bool,\n        flips: &mut Vec<String>,\n    ) -> Vec<RegistryApplyVerdict> {\n        updates\n            .iter()\n            .map(|u| {\n                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n                    return RegistryApplyVerdict::NotMember;\n                }\n                // [impl->REQ-MESH-5]\n                if !policy.roster.is_member(&u.subnet, origin_node) {\n                    return RegistryApplyVerdict::UntrustedOrigin;\n                }\n                *admitted_any = true;\n                let reg = regs.entry(u.subnet.clone()).or_default();\n                let prev = reg\n                    .instances(&u.endpoint_id)\n                    .iter()\n                    .find(|i| i.node == u.instance.node)\n                    .map(|i| i.status);\n                // The epoch lease (4.8) decides; an own-row echo from a peer\n                // is dropped Stale by construction (our epoch is newer or\n                // equal — never authored elsewhere).\n                let outcome = reg.merge_instance(&u.endpoint_id, u.instance.clone());\n                if outcome == MergeOutcome::Updated\n                    && u.instance.status == Status::Active\n                    && prev != Some(Status::Active)\n                    && u.instance.node != self.node_hex\n                    && !flips.contains(&u.endpoint_id)\n                {\n                    flips.push(u.endpoint_id.clone());\n                }\n                RegistryApplyVerdict::Merged(outcome)\n            })\n            .collect()\n    }\n\n    /// Stamp `origin_node`'s gossip recency + the global admit health field.\n    fn stamp_heard(&self, origin_node: &str) {\n        self.heard\n            .lock()\n            .unwrap()\n            .insert(origin_node.to_string(), wall_ms());\n        self.stamp_admit();\n    }\n\n    /// TRANSACTIONAL feed apply (ADR-0040 decision 3,\n    /// REQ-REGISTRY-APPLY-TRANSACTIONAL): merge one accumulated batch —\n    /// node labels AND instance updates together — under ONE lock acquisition\n    /// and write snapshots ONCE at the end. Per-record semantics (gate,\n    /// epoch lease, flip detection, heard stamping) are byte-identical to the\n    /// per-kind applies: this only changes the snapshot-write cadence from\n    /// O(chunks × record-kinds) to O(batches). Returns (merged verdict count,\n    /// attention flips).\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    pub fn apply_feed_batch(\n        &self,\n        origin_node: &str,\n        labels: &[NodeLabelUpdate],\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> (usize, Vec<String>) {\n        if labels.is_empty() && updates.is_empty() {\n            return (0, Vec::new());\n        }\n        let mut admitted_any = false;\n        let mut flips: Vec<String> = Vec::new();\n        let merged = {\n            let mut regs = self.regs.lock().unwrap();\n…\n        };\n…\n    }\n…\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n…\n        if let Some(label) = self.node_label.clone() {\n            for sub in &subnets.subnets {\n…\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n…\n                }));\n            }\n        }\n        drop(epoch);\n        drop(regs);\n        self.write_snapshots();\n        out\n    }\n\n    /// Evict every registry row authored by a **silent** peer node\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n    /// within `ttl` has its rows removed from every subnet registry and the\n    /// snapshots rewritten, so a dead node identity can no longer poison\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n    /// node authors them fresh each pump tick and is never in its own heard\n    /// map). A row whose author has NO heard stamp is treated as silent —\n    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n    /// (own rows, excluded), so an unstamped foreign row is already an\n    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n    /// within one pump cadence of its return (re-advertisement from its\n    /// durable epoch). Returns the number of rows evicted.\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n        self.evict_silent_peers_at(ttl, wall_ms())\n    }\n\n    /// [`evict_silent_peers`](Self::evict_silent_peers) with an explicit\n    /// clock (the testable seam).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let ttl_ms = ttl.as_millis() as u64;\n        let heard = self.heard.lock().unwrap();\n        let silent = |node: &str| {\n            node != self.node_hex\n                && heard\n                    .get(node)\n                    .is_none_or(|&t| now_ms.saturating_sub(t) > ttl_ms)\n        };\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_nodes(silent);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        drop(heard);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n    /// re-advertises Offline once, whole-node eviction never fires) stops"}],"details":{"displayContent":{"text":"    pub fn instances_of(&self, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n            .lock()\n            .unwrap()\n            .values()\n            .flat_map(|reg| reg.instances(endpoint_id).iter().cloned())\n            .collect()\n    }\n\n    /// Run `f` with this host's **canonical per-node epoch** — the ONE\n    /// monotonic counter (identity/epoch.json) behind every locally-authored\n    /// registry row. Every other per-node-id producer on this node MUST mint\n    /// from the same source, or `node:epoch`-shaped ids collide: a notif_id is\n    /// `node_hex:epoch`, so the pump's consent-notif producer and the CLI\n    /// notify front door (which loads this same canonical source) would\n    /// otherwise issue the same id from independent counters. (Field bug: the\n    /// pump minted consent notif_ids from the stream-open op counter\n    /// `pump-ops.json` — a different file — so on a node whose two counters\n    /// were both low the consent notif and a presence/notify notif collided on\n    /// `node:1`. The rig's presence-redirect rung caught it: `UNIQUE\n    /// constraint failed: notifs.notif_id`.) Locks the shared cursor so the\n    /// dispatcher's registry arm and the pump never double-mint.\n    // [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\n    pub fn with_epoch<R>(&self, f: impl FnOnce(&mut EpochSource) -> R) -> R {\n        f(&mut self.epoch.lock().unwrap())\n    }\n\n    /// Apply one inbound feed under the gate. `origin_node` MUST be the\n    /// handshake-proven stream-table origin, never payload bytes.\n    // [impl->REQ-INST-7]\n    // [impl->REQ-HAZARD-WAN-ORIGIN-AUTH]\n    pub fn apply_feed(\n        &self,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> Vec<RegistryApplyVerdict> {\n        self.apply_feed_flips(origin_node, updates, policy).0\n    }\n\n    /// [`apply_feed`](Self::apply_feed) that ALSO reports **attention\n    /// flips** (D9-2, REQ-INST-3): the endpoint ids whose admitted update was\n    /// an observed *transition to `Active` on a peer node* — the wire signal\n    /// that another instance of the id just became the driven one (its\n    /// daemon advertises transitions epoch-bumped), which rests a local\n    /// instance of the same id warm (CONTEXT: driving `ling@laptop` makes\n    /// `ling@desktop` dormant).\n    ///\n    /// Flip = `Updated` merge where the stored row's status was NOT `Active`\n    /// and the incoming one is. Deliberately **never `Inserted`**: this\n    /// registry is in-memory, so a daemon restart re-inserts every peer row\n    /// at its *current* status — counting inserts would knock local\n    /// instances dormant on every restart; and never the periodic\n    /// re-advertisement (`Updated` with prev already `Active` is not a\n    /// flip). The lease has already dropped stale/equal epochs before any\n    /// of this runs.\n    // [impl->REQ-INST-3]\n    pub fn apply_feed_flips(\n        &self,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> (Vec<RegistryApplyVerdict>, Vec<String>) {\n        let mut admitted_any = false;\n        let mut flips: Vec<String> = Vec::new();\n        let verdicts = {\n            let mut regs = self.regs.lock().unwrap();\n            self.merge_instances_locked(&mut regs, origin_node, updates, policy, &mut admitted_any, &mut flips)\n        };\n        // Gossip-recency stamp (M7 D2): an ADMITTED feed proves the origin\n        // node is up right now — even a Stale merge verdict is a liveness\n        // signal (the lease judged the row, not the sender). Refused feeds\n        // stamp nothing (an untrusted sender earns no liveness credit).\n        // [impl->REQ-SUBNET-1]\n        if admitted_any {\n            self.stamp_heard(origin_node);\n        }\n        self.write_snapshots();\n        (verdicts, flips)\n    }\n\n    /// Per-record instance merge under an ALREADY-HELD regs lock — the shared\n    /// core of [`apply_feed_flips`] and the transactional\n    /// [`apply_feed_batch`] (ADR-0040 decision 3): the fail-closed gate runs\n    /// PER RECORD in both shapes; only the snapshot-write cadence differs.\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    #[allow(clippy::too_many_arguments)]\n    fn merge_instances_locked(\n        &self,\n        regs: &mut BTreeMap<String, SubnetRegistry>,\n        origin_node: &str,\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n        admitted_any: &mut bool,\n        flips: &mut Vec<String>,\n    ) -> Vec<RegistryApplyVerdict> {\n        updates\n            .iter()\n            .map(|u| {\n                if !policy.subnets.iter().any(|s| s == &u.subnet) {\n                    return RegistryApplyVerdict::NotMember;\n                }\n                // [impl->REQ-MESH-5]\n                if !policy.roster.is_member(&u.subnet, origin_node) {\n                    return RegistryApplyVerdict::UntrustedOrigin;\n                }\n                *admitted_any = true;\n                let reg = regs.entry(u.subnet.clone()).or_default();\n                let prev = reg\n                    .instances(&u.endpoint_id)\n                    .iter()\n                    .find(|i| i.node == u.instance.node)\n                    .map(|i| i.status);\n                // The epoch lease (4.8) decides; an own-row echo from a peer\n                // is dropped Stale by construction (our epoch is newer or\n                // equal — never authored elsewhere).\n                let outcome = reg.merge_instance(&u.endpoint_id, u.instance.clone());\n                if outcome == MergeOutcome::Updated\n                    && u.instance.status == Status::Active\n                    && prev != Some(Status::Active)\n                    && u.instance.node != self.node_hex\n                    && !flips.contains(&u.endpoint_id)\n                {\n                    flips.push(u.endpoint_id.clone());\n                }\n                RegistryApplyVerdict::Merged(outcome)\n            })\n            .collect()\n    }\n\n    /// Stamp `origin_node`'s gossip recency + the global admit health field.\n    fn stamp_heard(&self, origin_node: &str) {\n        self.heard\n            .lock()\n            .unwrap()\n            .insert(origin_node.to_string(), wall_ms());\n        self.stamp_admit();\n    }\n\n    /// TRANSACTIONAL feed apply (ADR-0040 decision 3,\n    /// REQ-REGISTRY-APPLY-TRANSACTIONAL): merge one accumulated batch —\n    /// node labels AND instance updates together — under ONE lock acquisition\n    /// and write snapshots ONCE at the end. Per-record semantics (gate,\n    /// epoch lease, flip detection, heard stamping) are byte-identical to the\n    /// per-kind applies: this only changes the snapshot-write cadence from\n    /// O(chunks × record-kinds) to O(batches). Returns (merged verdict count,\n    /// attention flips).\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    pub fn apply_feed_batch(\n        &self,\n        origin_node: &str,\n        labels: &[NodeLabelUpdate],\n        updates: &[RegistryUpdate],\n        policy: &RegistryGatePolicy,\n    ) -> (usize, Vec<String>) {\n        if labels.is_empty() && updates.is_empty() {\n            return (0, Vec::new());\n        }\n        let mut admitted_any = false;\n        let mut flips: Vec<String> = Vec::new();\n        let merged = {\n            let mut regs = self.regs.lock().unwrap();\n…\n        };\n…\n    }\n…\n    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n…\n        if let Some(label) = self.node_label.clone() {\n            for sub in &subnets.subnets {\n…\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n…\n                }));\n            }\n        }\n        drop(epoch);\n        drop(regs);\n        self.write_snapshots();\n        out\n    }\n\n    /// Evict every registry row authored by a **silent** peer node\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n    /// within `ttl` has its rows removed from every subnet registry and the\n    /// snapshots rewritten, so a dead node identity can no longer poison\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n    /// node authors them fresh each pump tick and is never in its own heard\n    /// map). A row whose author has NO heard stamp is treated as silent —\n    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n    /// (own rows, excluded), so an unstamped foreign row is already an\n    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n    /// within one pump cadence of its return (re-advertisement from its\n    /// durable epoch). Returns the number of rows evicted.\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers(&self, ttl: std::time::Duration) -> usize {\n        self.evict_silent_peers_at(ttl, wall_ms())\n    }\n\n    /// [`evict_silent_peers`](Self::evict_silent_peers) with an explicit\n    /// clock (the testable seam).\n    // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n    pub fn evict_silent_peers_at(&self, ttl: std::time::Duration, now_ms: u64) -> usize {\n        let ttl_ms = ttl.as_millis() as u64;\n        let heard = self.heard.lock().unwrap();\n        let silent = |node: &str| {\n            node != self.node_hex\n                && heard\n                    .get(node)\n                    .is_none_or(|&t| now_ms.saturating_sub(t) > ttl_ms)\n        };\n        let mut regs = self.regs.lock().unwrap();\n        let mut evicted = 0usize;\n        for (subnet, reg) in regs.iter_mut() {\n            let n = reg.evict_nodes(silent);\n            if n > 0 {\n                eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");\n            }\n            evicted += n;\n        }\n        drop(regs);\n        drop(heard);\n        if evicted > 0 {\n            self.write_snapshots();\n        }\n        evicted\n    }\n\n    /// Evict per-row **aged-Offline ghosts** across every subnet registry\n    /// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has\n    /// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even\n    /// while its author node is alive — the decay [`evict_silent_peers`] (node\n    /// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal\n    /// re-advertises Offline once, whole-node eviction never fires) stops","startLine":199,"lineNumbers":[199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,null,372,null,378,null,466,null,710,711,null,715,null,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"}}},"isError":false,"timestamp":1784293345633}}
{"type":"message","id":"1e3ed964","parentId":"d43f5913","timestamp":"2026-07-17T13:02:25.655Z","message":{"role":"toolResult","toolCallId":"call_hwphogL0BPExJPfBz35v2ZbU|fc_034a6be5a6696b6c016a5a27e11190819190f1c91994f0484d","toolName":"read","content":[{"type":"text","text":"fn worker(\n…\n) -> WorkerReport {\n…\n    WorkerReport {\n…\n        family: Some(family),\n        endpoint,\n    }\n}\n\n/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\n/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\n/// origin trusted in that subnet), until the peer finishes.\n///\n/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer\n/// instance of an id observed transitioning to `Active` — its node's daemon\n/// just gave it a driver, so a *locally hosted* instance of the same id\n/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`\n/// dormant). The rest edge's transition echo is gate-armed\n/// ([`crate::resting::arm_transition_echo`]) — the endpoint's own pulse\n/// loop runs the bounded summarizer call, never this worker (the KH 7.4\n/// non-blocking posture: N flips in one feed are N gate files, not N LLM\n/// calls serialized here).\n// [impl->REQ-INST-7]\nfn serve_registry_feed(\n    brain: &mut Brain,\n    stream_id: u64,\n    origin: &str,\n    registry: &RegistryHost,\n) -> DispatchOutcome {\n    let policy = RegistryGatePolicy::load();\n    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\n        return DispatchOutcome::Failed(e.to_string());\n    }\n    let mut decoder = RegistryDecoder::new();\n    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\n    let mut merged = 0usize;\n    let mut shifted: Vec<String> = Vec::new();\n    // One commit per BATCH, never per chunk × record-kind (ADR-0040\n    // decision 3): records accumulate in memory across transport chunks and\n    // apply transactionally at EOF (or at the bounded batch size for an\n    // oversized feed). The pre-fix shape ran up to TWO full-registry\n    // snapshot rewrites per 64KiB chunk, synchronously in the brain's event\n    // loop — the drain stall that manufactured the 15s seat-writer poisons\n    // (KH 7.44). Attention shifts fire once per id, post-merge.\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\n    loop {\n        match brain.read_event() {\n            Ok(BrokerEvent::NetStreamData {\n                stream_id: sid,\n                bytes,\n                ..\n            }) if sid == stream_id => {\n                if let Some(batch) = acc.push(decoder.push(&bytes)) {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n            }\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\n                if let Some(batch) = acc.finish() {\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\n                }\n                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\n            }\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\n            Ok(_) => {}\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\n        }\n    }\n}\n\n/// Commit one accumulated batch transactionally and fire the attention\n/// shifts its admitted flips warrant — once per id per feed (`shifted` is the\n/// per-feed dedup), post-merge (ADR-0040 decision 3).\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\nfn commit_feed_batch(\n    registry: &RegistryHost,\n    origin: &str,\n    policy: &RegistryGatePolicy,\n    batch: FeedBatch,\n    shifted: &mut Vec<String>,\n) -> usize {\n    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\n    // Attention shift (D9-2): only ids this node actually hosts (a perch\n    // with a record); everything else is a no-op here.\n    // [impl->REQ-INST-3]\n    for id in flips {\n        if shifted.contains(&id) {\n            continue;\n        }\n        let local = perch::resolve_perch_path(&id, spt_store::perch::ParentHint::Infer);\n        if local.join(\"info.json\").exists() {\n            if let Err(e) = crate::resting::daemon_rest_event(\n                &id,\n                crate::resting::RestEvent::AttentionShift,\n                None,\n            ) {\n                eprintln!(\"REST_SHIFT_FAIL:{id}:{e}\");\n            }\n        }\n        shifted.push(id);\n    }\n    count\n}\n\n/// Bounded batch size for the transactional feed apply (ADR-0040 decision 3):\n/// a feed at or under this many records commits ONCE at EOF; an oversized\n/// feed commits every `bound` records — snapshot writes are\n/// `ceil(records / bound)`, memory stays bounded, and no commit ever runs\n/// per-chunk. Generous: a real advertisement round is a few records per peer.\nconst REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;\n\n/// One accumulated (pre-commit) slice of a registry feed, split by record\n/// kind for the two gated merge paths (REQ-SUBNET-3).\n#[derive(Debug, Default)]\nstruct FeedBatch {\n    labels: Vec<NodeLabelUpdate>,\n    updates: Vec<RegistryUpdate>,\n}\n\nimpl FeedBatch {\n    fn len(&self) -> usize {\n        self.labels.len() + self.updates.len()\n    }\n\n    fn is_empty(&self) -> bool {\n        self.labels.is_empty() && self.updates.is_empty()\n    }\n}\n\n/// PURE accumulator for the transactional feed apply (ADR-0040 decision 3):\n/// collects decoded records across transport chunks; [`push`](Self::push)\n/// hands back a full batch exactly when the bound is reached,\n/// [`finish`](Self::finish) hands back the (partial) remainder at EOF.\n/// Chunk boundaries are transport artifacts — they never decide a commit.\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\nstruct FeedAccumulator {\n    bound: usize,\n    batch: FeedBatch,\n}\n\nimpl FeedAccumulator {\n    fn new(bound: usize) -> FeedAccumulator {\n        FeedAccumulator {\n            bound: bound.max(1),\n            batch: FeedBatch::default(),\n        }\n    }\n\n    /// Accumulate one chunk's decoded records; `Some(batch)` when the bound\n    /// tripped (the caller commits it).\n    fn push(&mut self, records: Vec<RegistryFeedRecord>) -> Option<FeedBatch> {\n        for rec in records {\n            match rec {\n                RegistryFeedRecord::Instance(u) => self.batch.updates.push(u),\n                RegistryFeedRecord::NodeLabel(n) => self.batch.labels.push(n),\n            }\n        }\n        if self.batch.len() >= self.bound {\n            Some(std::mem::take(&mut self.batch))\n        } else {\n            None\n        }\n    }\n\n    /// The remainder at EOF; `None` when nothing is pending (an empty feed\n    /// commits nothing — zero snapshot writes).\n    fn finish(&mut self) -> Option<FeedBatch> {\n        if self.batch.is_empty() {\n            None\n        } else {\n            Some(std::mem::take(&mut self.batch))\n        }\n    }\n}\n\n/// Notif feed arm: decode rows as they arrive, apply each batch under the\n/// fail-closed gate, until the peer finishes. The policy re-loads per feed\n/// (not per record) — the same freshness the other arms get per request.\n///\n/// A **freshly inserted** undismissed row additionally gets a first-fire here\n/// (REQ-PRES-1, the convergent cross-node redirect's receiving half): the\n/// producing node skipped its local surface because the MRA winner lives\n/// here — this node's own presence resolution surfaces it. A row this node's\n/// MRA also calls remote stays unmarked and rides on (someone else's\n/// feed-apply surfaces it); replays merge `Unchanged` and never re-fire.\n// [impl->REQ-NOTIF-1]\n// [impl->REQ-PRES-1]\nfn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {\n    let store = match NotifStore::open() {\n        Ok(s) => s,\n…\n    };\n…\n}\n\n[Showing lines 1099-1283 of 1920. Use :1284 to continue]"}],"details":{"truncation":{"content":"        family: Some(family),\r\n        endpoint,\r\n    }\r\n}\r\n\r\n/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\r\n/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\r\n/// origin trusted in that subnet), until the peer finishes.\r\n///\r\n/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer\r\n/// instance of an id observed transitioning to `Active` — its node's daemon\r\n/// just gave it a driver, so a *locally hosted* instance of the same id\r\n/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`\r\n/// dormant). The rest edge's transition echo is gate-armed\r\n/// ([`crate::resting::arm_transition_echo`]) — the endpoint's own pulse\r\n/// loop runs the bounded summarizer call, never this worker (the KH 7.4\r\n/// non-blocking posture: N flips in one feed are N gate files, not N LLM\r\n/// calls serialized here).\r\n// [impl->REQ-INST-7]\r\nfn serve_registry_feed(\r\n    brain: &mut Brain,\r\n    stream_id: u64,\r\n    origin: &str,\r\n    registry: &RegistryHost,\r\n) -> DispatchOutcome {\r\n    let policy = RegistryGatePolicy::load();\r\n    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\r\n        return DispatchOutcome::Failed(e.to_string());\r\n    }\r\n    let mut decoder = RegistryDecoder::new();\r\n    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\r\n    let mut merged = 0usize;\r\n    let mut shifted: Vec<String> = Vec::new();\r\n    // One commit per BATCH, never per chunk × record-kind (ADR-0040\r\n    // decision 3): records accumulate in memory across transport chunks and\r\n    // apply transactionally at EOF (or at the bounded batch size for an\r\n    // oversized feed). The pre-fix shape ran up to TWO full-registry\r\n    // snapshot rewrites per 64KiB chunk, synchronously in the brain's event\r\n    // loop — the drain stall that manufactured the 15s seat-writer poisons\r\n    // (KH 7.44). Attention shifts fire once per id, post-merge.\r\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\n    loop {\r\n        match brain.read_event() {\r\n            Ok(BrokerEvent::NetStreamData {\r\n                stream_id: sid,\r\n                bytes,\r\n                ..\r\n            }) if sid == stream_id => {\r\n                if let Some(batch) = acc.push(decoder.push(&bytes)) {\r\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\r\n                }\r\n            }\r\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\r\n                if let Some(batch) = acc.finish() {\r\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\r\n                }\r\n                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\r\n            }\r\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\r\n            Ok(_) => {}\r\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\r\n        }\r\n    }\r\n}\r\n\r\n/// Commit one accumulated batch transactionally and fire the attention\r\n/// shifts its admitted flips warrant — once per id per feed (`shifted` is the\r\n/// per-feed dedup), post-merge (ADR-0040 decision 3).\r\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\nfn commit_feed_batch(\r\n    registry: &RegistryHost,\r\n    origin: &str,\r\n    policy: &RegistryGatePolicy,\r\n    batch: FeedBatch,\r\n    shifted: &mut Vec<String>,\r\n) -> usize {\r\n    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\r\n    // Attention shift (D9-2): only ids this node actually hosts (a perch\r\n    // with a record); everything else is a no-op here.\r\n    // [impl->REQ-INST-3]\r\n    for id in flips {\r\n        if shifted.contains(&id) {\r\n            continue;\r\n        }\r\n        let local = perch::resolve_perch_path(&id, spt_store::perch::ParentHint::Infer);\r\n        if local.join(\"info.json\").exists() {\r\n            if let Err(e) = crate::resting::daemon_rest_event(\r\n                &id,\r\n                crate::resting::RestEvent::AttentionShift,\r\n                None,\r\n            ) {\r\n                eprintln!(\"REST_SHIFT_FAIL:{id}:{e}\");\r\n            }\r\n        }\r\n        shifted.push(id);\r\n    }\r\n    count\r\n}\r\n\r\n/// Bounded batch size for the transactional feed apply (ADR-0040 decision 3):\r\n/// a feed at or under this many records commits ONCE at EOF; an oversized\r\n/// feed commits every `bound` records — snapshot writes are\r\n/// `ceil(records / bound)`, memory stays bounded, and no commit ever runs\r\n/// per-chunk. Generous: a real advertisement round is a few records per peer.\r\nconst REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;\r\n\r\n/// One accumulated (pre-commit) slice of a registry feed, split by record\r\n/// kind for the two gated merge paths (REQ-SUBNET-3).\r\n#[derive(Debug, Default)]\r\nstruct FeedBatch {\r\n    labels: Vec<NodeLabelUpdate>,\r\n    updates: Vec<RegistryUpdate>,\r\n}\r\n\r\nimpl FeedBatch {\r\n    fn len(&self) -> usize {\r\n        self.labels.len() + self.updates.len()\r\n    }\r\n\r\n    fn is_empty(&self) -> bool {\r\n        self.labels.is_empty() && self.updates.is_empty()\r\n    }\r\n}\r\n\r\n/// PURE accumulator for the transactional feed apply (ADR-0040 decision 3):\r\n/// collects decoded records across transport chunks; [`push`](Self::push)\r\n/// hands back a full batch exactly when the bound is reached,\r\n/// [`finish`](Self::finish) hands back the (partial) remainder at EOF.\r\n/// Chunk boundaries are transport artifacts — they never decide a commit.\r\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\nstruct FeedAccumulator {\r\n    bound: usize,\r\n    batch: FeedBatch,\r\n}\r\n\r\nimpl FeedAccumulator {\r\n    fn new(bound: usize) -> FeedAccumulator {\r\n        FeedAccumulator {\r\n            bound: bound.max(1),\r\n            batch: FeedBatch::default(),\r\n        }\r\n    }\r\n\r\n    /// Accumulate one chunk's decoded records; `Some(batch)` when the bound\r\n    /// tripped (the caller commits it).\r\n    fn push(&mut self, records: Vec<RegistryFeedRecord>) -> Option<FeedBatch> {\r\n        for rec in records {\r\n            match rec {\r\n                RegistryFeedRecord::Instance(u) => self.batch.updates.push(u),\r\n                RegistryFeedRecord::NodeLabel(n) => self.batch.labels.push(n),\r\n            }\r\n        }\r\n        if self.batch.len() >= self.bound {\r\n            Some(std::mem::take(&mut self.batch))\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n\r\n    /// The remainder at EOF; `None` when nothing is pending (an empty feed\r\n    /// commits nothing — zero snapshot writes).\r\n    fn finish(&mut self) -> Option<FeedBatch> {\r\n        if self.batch.is_empty() {\r\n            None\r\n        } else {\r\n            Some(std::mem::take(&mut self.batch))\r\n        }\r\n    }\r\n}\r\n\r\n/// Notif feed arm: decode rows as they arrive, apply each batch under the\r\n/// fail-closed gate, until the peer finishes. The policy re-loads per feed\r\n/// (not per record) — the same freshness the other arms get per request.\r\n///\r\n/// A **freshly inserted** undismissed row additionally gets a first-fire here\r\n/// (REQ-PRES-1, the convergent cross-node redirect's receiving half): the\r\n/// producing node skipped its local surface because the MRA winner lives\r\n/// here — this node's own presence resolution surfaces it. A row this node's\r\n/// MRA also calls remote stays unmarked and rides on (someone else's\r\n/// feed-apply surfaces it); replays merge `Unchanged` and never re-fire.\r\n// [impl->REQ-NOTIF-1]\r\n// [impl->REQ-PRES-1]\r\nfn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {\r\n    let store = match NotifStore::open() {\r\n        Ok(s) => s,\r","truncated":true,"truncatedBy":"lines","totalLines":822,"totalBytes":7620,"outputLines":185,"outputBytes":7620,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn worker(\n…\n) -> WorkerReport {\n…\n    WorkerReport {\n…\n        family: Some(family),\r\n        endpoint,\r\n    }\r\n}\r\n\r\n/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into\r\n/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧\r\n/// origin trusted in that subnet), until the peer finishes.\r\n///\r\n/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer\r\n/// instance of an id observed transitioning to `Active` — its node's daemon\r\n/// just gave it a driver, so a *locally hosted* instance of the same id\r\n/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`\r\n/// dormant). The rest edge's transition echo is gate-armed\r\n/// ([`crate::resting::arm_transition_echo`]) — the endpoint's own pulse\r\n/// loop runs the bounded summarizer call, never this worker (the KH 7.4\r\n/// non-blocking posture: N flips in one feed are N gate files, not N LLM\r\n/// calls serialized here).\r\n// [impl->REQ-INST-7]\r\nfn serve_registry_feed(\r\n    brain: &mut Brain,\r\n    stream_id: u64,\r\n    origin: &str,\r\n    registry: &RegistryHost,\r\n) -> DispatchOutcome {\r\n    let policy = RegistryGatePolicy::load();\r\n    if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {\r\n        return DispatchOutcome::Failed(e.to_string());\r\n    }\r\n    let mut decoder = RegistryDecoder::new();\r\n    let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);\r\n    let mut merged = 0usize;\r\n    let mut shifted: Vec<String> = Vec::new();\r\n    // One commit per BATCH, never per chunk × record-kind (ADR-0040\r\n    // decision 3): records accumulate in memory across transport chunks and\r\n    // apply transactionally at EOF (or at the bounded batch size for an\r\n    // oversized feed). The pre-fix shape ran up to TWO full-registry\r\n    // snapshot rewrites per 64KiB chunk, synchronously in the brain's event\r\n    // loop — the drain stall that manufactured the 15s seat-writer poisons\r\n    // (KH 7.44). Attention shifts fire once per id, post-merge.\r\n    // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\n    loop {\r\n        match brain.read_event() {\r\n            Ok(BrokerEvent::NetStreamData {\r\n                stream_id: sid,\r\n                bytes,\r\n                ..\r\n            }) if sid == stream_id => {\r\n                if let Some(batch) = acc.push(decoder.push(&bytes)) {\r\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\r\n                }\r\n            }\r\n            Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {\r\n                if let Some(batch) = acc.finish() {\r\n                    merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);\r\n                }\r\n                return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));\r\n            }\r\n            Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),\r\n            Ok(_) => {}\r\n            Err(e) => return DispatchOutcome::Failed(e.to_string()),\r\n        }\r\n    }\r\n}\r\n\r\n/// Commit one accumulated batch transactionally and fire the attention\r\n/// shifts its admitted flips warrant — once per id per feed (`shifted` is the\r\n/// per-feed dedup), post-merge (ADR-0040 decision 3).\r\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\nfn commit_feed_batch(\r\n    registry: &RegistryHost,\r\n    origin: &str,\r\n    policy: &RegistryGatePolicy,\r\n    batch: FeedBatch,\r\n    shifted: &mut Vec<String>,\r\n) -> usize {\r\n    let (count, flips) = registry.apply_feed_batch(origin, &batch.labels, &batch.updates, policy);\r\n    // Attention shift (D9-2): only ids this node actually hosts (a perch\r\n    // with a record); everything else is a no-op here.\r\n    // [impl->REQ-INST-3]\r\n    for id in flips {\r\n        if shifted.contains(&id) {\r\n            continue;\r\n        }\r\n        let local = perch::resolve_perch_path(&id, spt_store::perch::ParentHint::Infer);\r\n        if local.join(\"info.json\").exists() {\r\n            if let Err(e) = crate::resting::daemon_rest_event(\r\n                &id,\r\n                crate::resting::RestEvent::AttentionShift,\r\n                None,\r\n            ) {\r\n                eprintln!(\"REST_SHIFT_FAIL:{id}:{e}\");\r\n            }\r\n        }\r\n        shifted.push(id);\r\n    }\r\n    count\r\n}\r\n\r\n/// Bounded batch size for the transactional feed apply (ADR-0040 decision 3):\r\n/// a feed at or under this many records commits ONCE at EOF; an oversized\r\n/// feed commits every `bound` records — snapshot writes are\r\n/// `ceil(records / bound)`, memory stays bounded, and no commit ever runs\r\n/// per-chunk. Generous: a real advertisement round is a few records per peer.\r\nconst REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;\r\n\r\n/// One accumulated (pre-commit) slice of a registry feed, split by record\r\n/// kind for the two gated merge paths (REQ-SUBNET-3).\r\n#[derive(Debug, Default)]\r\nstruct FeedBatch {\r\n    labels: Vec<NodeLabelUpdate>,\r\n    updates: Vec<RegistryUpdate>,\r\n}\r\n\r\nimpl FeedBatch {\r\n    fn len(&self) -> usize {\r\n        self.labels.len() + self.updates.len()\r\n    }\r\n\r\n    fn is_empty(&self) -> bool {\r\n        self.labels.is_empty() && self.updates.is_empty()\r\n    }\r\n}\r\n\r\n/// PURE accumulator for the transactional feed apply (ADR-0040 decision 3):\r\n/// collects decoded records across transport chunks; [`push`](Self::push)\r\n/// hands back a full batch exactly when the bound is reached,\r\n/// [`finish`](Self::finish) hands back the (partial) remainder at EOF.\r\n/// Chunk boundaries are transport artifacts — they never decide a commit.\r\n// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]\r\nstruct FeedAccumulator {\r\n    bound: usize,\r\n    batch: FeedBatch,\r\n}\r\n\r\nimpl FeedAccumulator {\r\n    fn new(bound: usize) -> FeedAccumulator {\r\n        FeedAccumulator {\r\n            bound: bound.max(1),\r\n            batch: FeedBatch::default(),\r\n        }\r\n    }\r\n\r\n    /// Accumulate one chunk's decoded records; `Some(batch)` when the bound\r\n    /// tripped (the caller commits it).\r\n    fn push(&mut self, records: Vec<RegistryFeedRecord>) -> Option<FeedBatch> {\r\n        for rec in records {\r\n            match rec {\r\n                RegistryFeedRecord::Instance(u) => self.batch.updates.push(u),\r\n                RegistryFeedRecord::NodeLabel(n) => self.batch.labels.push(n),\r\n            }\r\n        }\r\n        if self.batch.len() >= self.bound {\r\n            Some(std::mem::take(&mut self.batch))\r\n        } else {\r\n            None\r\n        }\r\n    }\r\n\r\n    /// The remainder at EOF; `None` when nothing is pending (an empty feed\r\n    /// commits nothing — zero snapshot writes).\r\n    fn finish(&mut self) -> Option<FeedBatch> {\r\n        if self.batch.is_empty() {\r\n            None\r\n        } else {\r\n            Some(std::mem::take(&mut self.batch))\r\n        }\r\n    }\r\n}\r\n\r\n/// Notif feed arm: decode rows as they arrive, apply each batch under the\r\n/// fail-closed gate, until the peer finishes. The policy re-loads per feed\r\n/// (not per record) — the same freshness the other arms get per request.\r\n///\r\n/// A **freshly inserted** undismissed row additionally gets a first-fire here\r\n/// (REQ-PRES-1, the convergent cross-node redirect's receiving half): the\r\n/// producing node skipped its local surface because the MRA winner lives\r\n/// here — this node's own presence resolution surfaces it. A row this node's\r\n/// MRA also calls remote stays unmarked and rides on (someone else's\r\n/// feed-apply surfaces it); replays merge `Unchanged` and never re-fire.\r\n// [impl->REQ-NOTIF-1]\r\n// [impl->REQ-PRES-1]\r\nfn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {\r\n    let store = match NotifStore::open() {\r\n        Ok(s) => s,\r\n…\n    };\n…\n}","startLine":832,"lineNumbers":[832,null,840,null,1097,null,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,null,1285,null,1326]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1920,"totalBytes":7620,"outputLines":185,"outputBytes":7620,"shownRange":{"start":1099,"end":1283},"nextOffset":1284}}},"isError":false,"timestamp":1784293345655}}
{"type":"message","id":"3e0d5ee9","parentId":"1e3ed964","timestamp":"2026-07-17T13:02:31.364Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Planning batch calls for snapshots**"},{"type":"toolCall","id":"call_MOjdTS68gsfBW84Abpw7dy5C|fc_034a6be5a6696b6c016a5a27e6867481918a8f9dcb5dd734d4","name":"read","arguments":{"i":"Reading snapshot write complexity","path":"crates/spt-daemon/src/registryhost.rs","selector":"820-870"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":7732,"output":68,"cacheRead":165376,"cacheWrite":0,"totalTokens":173176,"reasoningTokens":26,"cost":{"input":0.03866,"output":0.00204,"cacheRead":0.082688,"cacheWrite":0,"total":0.123388}},"stopReason":"toolUse","timestamp":1784293345699,"responseId":"resp_034a6be5a6696b6c016a5a27e23c5881918c1c4501f12effd2","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27e56ccc8191a22a3e292a3c0200","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWifmiUZ832U5BmqUerPxq69U_ZYwkysKKWfyghXQzf2wMpwc1Bv9b59lW3XBbKNcuHILgzgicWA_ey8belMVSAVykhz8PQLSaEs9E2_WLy1ABglABAaNFOfL0ASynw9SYDtbjOiWZdCF4O6aiF52x_RvUZdFRX-eQnT_ObLEgpLKlMPsjaQQyO8UXt0WN0j_KK-3x-mTQ4gVpxQQVikDQEvmkh9-1R-mDuulV4dGcgPD0C4EmneIJ9w3eyu0Ilnm3cRVxf-GIIWednGiPGkBluQURjqXh0g5tMQ63d_pbeye4BFDW8b2E25vpBAPH0gJyKDaXwx9xNRPjoFR4MlNHLNGDvVf1YmILKIibYnePffQTBK6XKEJt9WyzY8N6Uv6YViVkuJD5lPRXU1dzhgV-ctirLUFxtsCNMDGo0TeQe6gMDGd7tczMs-bRmWNx9TmeerclMtHf-y-uBkzSA9oOgZRopKmbfk0D5mRNPgiK4oSsALHzgRx3fOWtPNy8SivSiVIQU9sWegbha8LF555XCtBOwIOAr7BG0K1L8jxjuEOHxGECLKP89Ifc3yy9k4vLC1Bc3ph1cUyYFTcb0e-ZfkuI7NaoK2ZhmK1MH7LD8wBrN3xZZ6gliMXHEsl9GcGNcBfRiNHamKoDTbEgWl0Gg_9LRkhakWdz05orPKahoSMNY7pWiUl8OJLk1ASnDyW__SgaUaCmArRH-ubArwiCufSIv9Z2zxrNzREqHzn8tTRljTouwW8Xtj56nwtGyJbMF9CuXvm0jHpKS9WT0KTtjeBMTqiG4b394Dxd-uZnf5znrd_DfYXGqYr3bVjvApfbOqfVJjT6Rx_n8QMih6mU-lR49kT-5ZyVAxkCVpRBlYBe9zzasNhnbfIbDQ6eXfxalNv5xS1zdMxNZygfS-rgP8bOtyOe1Azl2YZFYgoferGsKnpUtynf5XOEip3A9DakUSk0lzgLbUD-t0a0s6KSEFoFnJi0G9JmakDXFk2yPj4lnqDTL39439tAAMzfa-cVr98STe9s_0ugG9tHpHwGu9_xb-RYTCbDjSidm6E1tjVHiPS4POi1JzoJ5uEUFvqLU0f","summary":[{"type":"summary_text","text":"**Planning batch calls for snapshots**"}]},{"id":"fc_034a6be5a6696b6c016a5a27e6867481918a8f9dcb5dd734d4","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading snapshot write complexity\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"820-870\"}","call_id":"call_MOjdTS68gsfBW84Abpw7dy5C","name":"read"}]},"duration":5664.220599994063,"ttft":3801.5869999974966,"contextSnapshot":{"promptTokens":173108,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MOjdTS68gsfBW84Abpw7dy5C|fc_034a6be5a6696b6c016a5a27e6867481918a8f9dcb5dd734d4","toolName":"read","startedAt":"2026-07-17T13:02:31.364Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading snapshot write complexity"},"id":"b826b9c4","parentId":"3e0d5ee9","timestamp":"2026-07-17T13:02:31.364Z"}
{"type":"message","id":"0ae30275","parentId":"b826b9c4","timestamp":"2026-07-17T13:02:31.381Z","message":{"role":"toolResult","toolCallId":"call_MOjdTS68gsfBW84Abpw7dy5C|fc_034a6be5a6696b6c016a5a27e6867481918a8f9dcb5dd734d4","toolName":"read","content":[{"type":"text","text":"    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n…\n            .unwrap_or_default()\n    }\n\n    /// A point-in-time clone of one subnet's registry (resolution input).\n    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\n        self.regs.lock().unwrap().get(subnet).cloned()\n    }\n\n    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\n    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\n    /// readers. Best-effort: a failed snapshot write must not fail the merge\n    /// that triggered it (readers tolerate staleness by contract).\n    fn write_snapshots(&self) {\n        self.snapshot_writes\n            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n        let regs = self.regs.lock().unwrap();\n        if regs.is_empty() {\n            return;\n        }\n        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\n            return;\n        }\n        for (subnet, reg) in regs.iter() {\n            let Ok(json) = serde_json::to_vec_pretty(reg) else {\n                continue;\n            };\n            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\n        }\n        drop(regs);\n        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\n        // the snapshot reader globs `<subnet>.json`, so this can never shadow\n        // a subnet (even one literally named \"heard\").\n        let heard = self.heard.lock().unwrap();\n        if !heard.is_empty() {\n            if let Ok(json) = serde_json::to_vec_pretty(&*heard) {\n                let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);\n            }\n        }\n    }\n\n    /// The snapshot path for one subnet (the CLI reader's contract).\n    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\n        dir.join(format!(\"{subnet}.json\"))\n    }\n\n    /// The heard-map mirror's path (the CLI reader's contract): `node hex →\n    /// last admitted-feed wall ms`.\n    // [impl->REQ-SUBNET-1]\n    pub fn heard_path(dir: &Path) -> PathBuf {\n        dir.join(\"heard.meta\")\n    }\n\n    /// The re-pair eviction marker's path (M8 decision 13, REQ-SUBNET-7):\n    /// a JSON array of superseded node hexes the pairing host noted —\n    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\n\n[Showing lines 819-873 of 2429. Use :874 to continue]"}],"details":{"truncation":{"content":"            .unwrap_or_default()\r\n    }\r\n\r\n    /// A point-in-time clone of one subnet's registry (resolution input).\r\n    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\r\n        self.regs.lock().unwrap().get(subnet).cloned()\r\n    }\r\n\r\n    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\r\n    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\r\n    /// readers. Best-effort: a failed snapshot write must not fail the merge\r\n    /// that triggered it (readers tolerate staleness by contract).\r\n    fn write_snapshots(&self) {\r\n        self.snapshot_writes\r\n            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\r\n        let regs = self.regs.lock().unwrap();\r\n        if regs.is_empty() {\r\n            return;\r\n        }\r\n        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\r\n            return;\r\n        }\r\n        for (subnet, reg) in regs.iter() {\r\n            let Ok(json) = serde_json::to_vec_pretty(reg) else {\r\n                continue;\r\n            };\r\n            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\r\n        }\r\n        drop(regs);\r\n        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\r\n        // the snapshot reader globs `<subnet>.json`, so this can never shadow\r\n        // a subnet (even one literally named \"heard\").\r\n        let heard = self.heard.lock().unwrap();\r\n        if !heard.is_empty() {\r\n            if let Ok(json) = serde_json::to_vec_pretty(&*heard) {\r\n                let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// The snapshot path for one subnet (the CLI reader's contract).\r\n    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\r\n        dir.join(format!(\"{subnet}.json\"))\r\n    }\r\n\r\n    /// The heard-map mirror's path (the CLI reader's contract): `node hex →\r\n    /// last admitted-feed wall ms`.\r\n    // [impl->REQ-SUBNET-1]\r\n    pub fn heard_path(dir: &Path) -> PathBuf {\r\n        dir.join(\"heard.meta\")\r\n    }\r\n\r\n    /// The re-pair eviction marker's path (M8 decision 13, REQ-SUBNET-7):\r\n    /// a JSON array of superseded node hexes the pairing host noted —\r\n    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\r","truncated":true,"truncatedBy":"lines","totalLines":1611,"totalBytes":2307,"outputLines":55,"outputBytes":2307,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {\n        self.regs\n…\n            .unwrap_or_default()\r\n    }\r\n\r\n    /// A point-in-time clone of one subnet's registry (resolution input).\r\n    pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {\r\n        self.regs.lock().unwrap().get(subnet).cloned()\r\n    }\r\n\r\n    /// Mirror every subnet's registry to `identity/registry/<subnet>.json`\r\n    /// (tmp-write + atomic rename — KNOWN-HAZARDS 5.2) for out-of-process\r\n    /// readers. Best-effort: a failed snapshot write must not fail the merge\r\n    /// that triggered it (readers tolerate staleness by contract).\r\n    fn write_snapshots(&self) {\r\n        self.snapshot_writes\r\n            .fetch_add(1, std::sync::atomic::Ordering::Relaxed);\r\n        let regs = self.regs.lock().unwrap();\r\n        if regs.is_empty() {\r\n            return;\r\n        }\r\n        if std::fs::create_dir_all(&self.snapshot_dir).is_err() {\r\n            return;\r\n        }\r\n        for (subnet, reg) in regs.iter() {\r\n            let Ok(json) = serde_json::to_vec_pretty(reg) else {\r\n                continue;\r\n            };\r\n            let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);\r\n        }\r\n        drop(regs);\r\n        // The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:\r\n        // the snapshot reader globs `<subnet>.json`, so this can never shadow\r\n        // a subnet (even one literally named \"heard\").\r\n        let heard = self.heard.lock().unwrap();\r\n        if !heard.is_empty() {\r\n            if let Ok(json) = serde_json::to_vec_pretty(&*heard) {\r\n                let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);\r\n            }\r\n        }\r\n    }\r\n\r\n    /// The snapshot path for one subnet (the CLI reader's contract).\r\n    pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {\r\n        dir.join(format!(\"{subnet}.json\"))\r\n    }\r\n\r\n    /// The heard-map mirror's path (the CLI reader's contract): `node hex →\r\n    /// last admitted-feed wall ms`.\r\n    // [impl->REQ-SUBNET-1]\r\n    pub fn heard_path(dir: &Path) -> PathBuf {\r\n        dir.join(\"heard.meta\")\r\n    }\r\n\r\n    /// The re-pair eviction marker's path (M8 decision 13, REQ-SUBNET-7):\r\n    /// a JSON array of superseded node hexes the pairing host noted —\r\n    /// consumed by the pump's registry tick so the IN-MEMORY rows go too\r","startLine":813,"lineNumbers":[813,814,null,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":2307,"outputLines":55,"outputBytes":2307,"shownRange":{"start":819,"end":873},"nextOffset":874}}},"isError":false,"timestamp":1784293351381}}
{"type":"message","id":"7ea6ddb6","parentId":"0ae30275","timestamp":"2026-07-17T13:02:42.583Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing recent_projects_for performance impact**"},{"type":"toolCall","id":"call_PM4I1Ilo0zFinLyBtWCW2JhO|fc_034a6be5a6696b6c016a5a27f2239481918875ad719aeff289","name":"grep","arguments":{"i":"Locating recent project scan","pattern":"fn recent_projects_for|recent_projects_for","path":"crates/spt-daemon/src/registryhost.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_KZeiELB5ThNy2VIDAqUo98wu|fc_034a6be5a6696b6c016a5a27f223b081919bc1744f75f6d7ed","name":"read","arguments":{"i":"Reading registry project scan","path":"crates/spt-daemon/src/registryhost.rs","selector":"960-1050"}},{"type":"toolCall","id":"call_MOP2mdtlQvRvFThQD27QN7GS|fc_034a6be5a6696b6c016a5a27f223b88191aa625de88ffe3951","name":"grep","arguments":{"i":"Locating session log reads","pattern":"fn read_all|sessions.log|read_sessions|session.*entries|SessionEntry","path":"crates/spt-store/src/sessions.rs","selector":null,"case":false,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_UtdMER559qtUC3vrHI1mCgrB|fc_034a6be5a6696b6c016a5a27f223bc8191bcccea2f33112e7f","name":"read","arguments":{"i":"Reading session store scan","path":"crates/spt-store/src/sessions.rs","selector":"1-180"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":3301,"output":381,"cacheRead":170496,"cacheWrite":0,"totalTokens":174178,"reasoningTokens":162,"cost":{"input":0.016505000000000002,"output":0.011430000000000001,"cacheRead":0.08524799999999999,"cacheWrite":0,"total":0.11318299999999999}},"stopReason":"toolUse","timestamp":1784293351434,"responseId":"resp_034a6be5a6696b6c016a5a27e7f77881918c96fc9513929f13","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27e9c7748191938d42d18542df66","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWify3FKLMwSqMqo1585IZ3_IhveAC8ctSwes-FTBQlPueGeHa8NG4cOiZ9j_fSr1RVcfJayP3ZkWRapmnPuRdD5AgOqRx0DbUw3VidPfwOkhGG23qncPUp3YZijm-tesAYz9PvqrRZPRtg_1f28kT1xC4ZSV5fFjk1K7iI5ETeh52kRlHSuloItiNaS0rzc62ukjKgCBZzzGhZ2UF8J-284OGGHz1Ct2W0i3n27lsn5ks7lkdnNiPTjQpuKdan5SPrEZ5w9RC3wFFhAqxvg96YGYm-ydkmEyuSWNERWEXtWMy-wQxZr-9HG-ZL_7dryx-LbcZ-48ZZsihPKxSzgIWnUnVt-XyGvaYOUvQEeBXjudGZUo821c0JTiKjOe8BKJigebXI3hOMWDbs3eJ42bplnI2mAvBKyFhfOORUDkjcOK_t_alkE1hPFlI7rzRp8gQg6J4EQ0YKoL812ydIwKBb0aI4svZsNGg4z5kk2hN9mAIIStSPoYTfkaS7ZZjX_SK8cpMlSy-GMOhkJQjNDMMEW8i0V5muksvTR9HnCYUuUPx5QPYzkYbLMYuudzgGxTtm1hhPrVIDVndHCGgetbZlvqiGxdovLkdD1GNVQmxOfMX82Rt-6wQw9r9CH83O2lHVUJR09OtlIzssI5SVxzBTQucFv2J45CUDG5537ps6NIsHtUHwU_ycUbCIlKrpAGbGwOedVGVn4HOAUcybZxmHmCBD6mcCwQnc6weiLPP_Ar-Ca2X5kEzRhqnaPxeoZY34LTNK6YmQbkgo81mNWb-z1_QdMFK_4__msd0z7HsG3EtefX5-muohP-Ahjt8oijVUHYzeuExEyzD4SY6t7FDQx5yqnxZTL--iQOwkY8-Qi-qfpDHk4N_1gwy6UEdUcPrHo48QhrqWHnUgMtA5u0x6Kcpe1g9oZaEuzUeqn_q8z7VAIxhpe9Z58tE_0UEe3BicnuWvP4RBH7H-2720hkOINwdZZQiDRUr0_C3sHSSbtVyr1ei5484KzgMwe8GOpQpJGO8Y3HhLjOOaESCBDPFVOOVpWhxg-wf359wMT-L4BqVRK5VV9MjHiatCtaIxnZyJefoovbclBwJ5i7PhHfKqs1pOUnjL-6g5S1nxnzPQkoYV3obf72emDkA80lfPPUnjUTDOqvIvG1f4fuacs6kpvX_b8eg12s-FGAHur5hw7bZm-ONa8UDK5TLSuzN8DEI9zJEVB7PEDxD2tQo_4WFqAqLyb0iE6b4-wa82tCbWL4EK7CNZppbyCqZ1wruDzf_Sz-ukKJsK4ovPB0EojEv2JIpgaaNlAwGwZRl5Sqj1siLwU9yfhRvPJfWyLa4MjKpwkObBHB1hqWAd7rF0zoiMfTPwOL8t1_BU0j0gG6IDON96KD3GziVdp3HMS6kdVDLBdtPyhdo-PXGqt6vD2xbnt5lWrgYh4DkKtAXZbhnssAJRngSga1Rg_nbxb_vdx0TZUuu-zve8sVp_p-JchmxmgDWJ9Fpid-xY7HFji2xuiOf5TwoWd6j7xlbrrRFPVedeTKOl4einY1bmMikXTJUVxGS4b3z1WP7JL4cCBWT4M95GqD9MAhi24qsHPcVDuU1YXGzcTpJgQ5GrDPjhVgUuTZDfroJggrwJIIa2G4HssirijiNZxQAFABVJeEpHeYOCKBZYXMu24I9DkuTQ3nAWE0fudnhZday52B69aHDpD4ue8jdRB0itGLInt3Yh0BNZB0hlqGVxeHPzbw7ydnZLBsRwmDEUee-pWbaVMCKmyyAbJte6UPj5ZrOr26fHyWgIuh2ysesN5OpBeuVM0OF0XKyXyjY-u_ZXokjvseZdrDx_nA7pIlV09gFL19oXKaMnp9_z5y3WcURgKOHlsCFFpxcg==","summary":[{"type":"summary_text","text":"**Analyzing recent_projects_for performance impact**"}]},{"id":"fc_034a6be5a6696b6c016a5a27f2239481918875ad719aeff289","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating recent project scan\",\"pattern\":\"fn recent_projects_for|recent_projects_for\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_PM4I1Ilo0zFinLyBtWCW2JhO","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27f223b081919bc1744f75f6d7ed","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry project scan\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"960-1050\"}","call_id":"call_KZeiELB5ThNy2VIDAqUo98wu","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a27f223b88191aa625de88ffe3951","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating session log reads\",\"pattern\":\"fn read_all|sessions.log|read_sessions|session.*entries|SessionEntry\",\"path\":\"crates/spt-store/src/sessions.rs\",\"selector\":null,\"case\":false,\"gitignore\":true,\"skip\":null}","call_id":"call_MOP2mdtlQvRvFThQD27QN7GS","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a27f223bc8191bcccea2f33112e7f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading session store scan\",\"path\":\"crates/spt-store/src/sessions.rs\",\"selector\":\"1-180\"}","call_id":"call_UtdMER559qtUC3vrHI1mCgrB","name":"read"}]},"duration":11139.62389999628,"ttft":2420.486599996686,"contextSnapshot":{"promptTokens":173797,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_PM4I1Ilo0zFinLyBtWCW2JhO|fc_034a6be5a6696b6c016a5a27f2239481918875ad719aeff289","toolName":"grep","startedAt":"2026-07-17T13:02:42.584Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Locating recent project scan"},"id":"a102b261","parentId":"7ea6ddb6","timestamp":"2026-07-17T13:02:42.584Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KZeiELB5ThNy2VIDAqUo98wu|fc_034a6be5a6696b6c016a5a27f223b081919bc1744f75f6d7ed","toolName":"read","startedAt":"2026-07-17T13:02:42.584Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry project scan"},"id":"3c942f86","parentId":"a102b261","timestamp":"2026-07-17T13:02:42.584Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_MOP2mdtlQvRvFThQD27QN7GS|fc_034a6be5a6696b6c016a5a27f223b88191aa625de88ffe3951","toolName":"grep","startedAt":"2026-07-17T13:02:42.584Z","args":{"path":"crates/spt-store/src/sessions.rs"},"intent":"Locating session log reads"},"id":"9b222daa","parentId":"3c942f86","timestamp":"2026-07-17T13:02:42.584Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_UtdMER559qtUC3vrHI1mCgrB|fc_034a6be5a6696b6c016a5a27f223bc8191bcccea2f33112e7f","toolName":"read","startedAt":"2026-07-17T13:02:42.584Z","args":{"path":"crates/spt-store/src/sessions.rs"},"intent":"Reading session store scan"},"id":"70cfe094","parentId":"9b222daa","timestamp":"2026-07-17T13:02:42.584Z"}
{"type":"message","id":"43d6aa1c","parentId":"70cfe094","timestamp":"2026-07-17T13:02:42.588Z","message":{"role":"toolResult","toolCallId":"call_PM4I1Ilo0zFinLyBtWCW2JhO|fc_034a6be5a6696b6c016a5a27f2239481918875ad719aeff289","toolName":"grep","content":[{"type":"text","text":" 583|            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n*584|            let recent_projects = recent_projects_for(&perch_path, owlery);\n 585|            let last_active_ms = info.and_then(|i| i.last_active_ms);\n 586|            for sub in &subnets.subnets {\n 587|                let Ok(ep) = epoch.next_epoch() else { continue };\n...\n 987|// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n*988|fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n 989|    let entries = spt_store::sessions::read_all(perch_path);\n 990|    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n 991|    let mut out: Vec<String> = Vec::new();\n...\n 1193|\n*1194|    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n 1195|    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196|    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197|    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198|    #[test]\n*1199|    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200|        let tmp = tempfile::tempdir().unwrap();\n 1201|        let root = tmp.path();\n 1202|        let owlery = root.join(\"owlery\");\n...\n 1229|\n*1230|        let got = recent_projects_for(&perch, &owlery);\n 1231|        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232|        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233|    }"}],"details":{"scopePath":"crates/spt-daemon/src/registryhost.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":5,"fileCount":1,"files":["crates/spt-daemon/src/registryhost.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/registryhost.rs","count":5}],"truncated":false,"displayContent":"  583│            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n *584│            let recent_projects = recent_projects_for(&perch_path, owlery);\n  585│            let last_active_ms = info.and_then(|i| i.last_active_ms);\n  586│            for sub in &subnets.subnets {\n  587│                let Ok(ep) = epoch.next_epoch() else { continue };\n     │...\n  987│// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n *988│fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n  989│    let entries = spt_store::sessions::read_all(perch_path);\n  990│    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n  991│    let mut out: Vec<String> = Vec::new();\n     │...\n 1193│\n*1194│    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n 1195│    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196│    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197│    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198│    #[test]\n*1199│    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200│        let tmp = tempfile::tempdir().unwrap();\n 1201│        let root = tmp.path();\n 1202│        let owlery = root.join(\"owlery\");\n     │...\n 1229│\n*1230│        let got = recent_projects_for(&perch, &owlery);\n 1231│        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232│        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233│    }"},"isError":false,"timestamp":1784293362588}}
{"type":"message","id":"0c339099","parentId":"43d6aa1c","timestamp":"2026-07-17T13:02:42.591Z","message":{"role":"toolResult","toolCallId":"call_MOP2mdtlQvRvFThQD27QN7GS|fc_034a6be5a6696b6c016a5a27f223b88191aa625de88ffe3951","toolName":"grep","content":[{"type":"text","text":"*1|//! Per-endpoint **session ledger** — `<perch>/sessions.log` (ADR-0019 /\n 2|//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/\n*3|//! sessions.log`.\n 4|//!\n 5|//! A live agent that `/clear`s or `/compact`s keeps its perch identity but\n 6|//! rotates its harness `session_id` (a new transcript file). The single\n...\n 26|/// The ledger filename under a perch.\n*27|pub const LEDGER_FILE: &str = \"sessions.log\";\n 28|\n 29|/// On-disk row cap. The ledger is a rolling tail — older rows rotate out on\n 30|/// append so the file can never grow without bound (risk #2).\n...\n 58|#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\n*59|pub struct SessionEntry {\n 60|    /// RFC3339-UTC instant (see [`crate::timefmt`]).\n 61|    pub ts: String,\n 62|    /// The harness session id that became active.\n...\n 98|/// line is skipped, the rest still load (the degrade-don't-crash store stance).\n*99|pub fn read_all(perch: &Path) -> Vec<SessionEntry> {\n 100|    let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {\n 101|        return Vec::new();\n 102|    };\n...\n 109|/// The last `k` rows (oldest→newest within the tail). `k == 0` ⇒ empty.\n*110|pub fn last_k(perch: &Path, k: usize) -> Vec<SessionEntry> {\n 111|    if k == 0 {\n 112|        return Vec::new();\n 113|    }\n...\n 118|\n*119|/// The last `k` rows with every returned entry carrying a usable [`SessionEntry::ordinal`]\n 120|/// for digest-cursor seq encoding (REQ-DIGEST-CURSOR). A row stamped on disk keeps\n 121|/// its persisted ordinal; a pre-migration `None` row falls back to its **absolute**\n 122|/// `read_all` index (not the slice index) so it stays comparable across sessions.\n...\n 124|// [impl->REQ-DIGEST-CURSOR]\n*125|pub fn last_k_with_ordinals(perch: &Path, k: usize) -> Vec<SessionEntry> {\n 126|    if k == 0 {\n 127|        return Vec::new();\n 128|    }\n...\n 149|// [impl->REQ-TERM-6]\n*150|pub fn append(perch: &Path, entry: &SessionEntry) -> io::Result<bool> {\n 151|    let mut entries = read_all(perch);\n 152|    if entries.last().map(|e| e.session_id.as_str()) == Some(entry.session_id.as_str()) {\n 153|        return Ok(false); // same session re-bound — not a new boundary\n...\n 188|\n*189|    fn entry(sid: &str, trigger: SessionTrigger) -> SessionEntry {\n*190|        SessionEntry {\n 191|            ts: crate::timefmt::rfc3339_utc(1_700_000_000),\n 192|            session_id: sid.to_string(),\n 193|            trigger,\n...\n 255|        let perch = dir.path().join(\"perch\");\n*256|        let with_cwd = SessionEntry {\n 257|            ts: crate::timefmt::rfc3339_utc(1_700_000_000),\n 258|            session_id: \"s-cwd\".to_string(),\n 259|            trigger: SessionTrigger::Boot,\n...\n 308|    fn none_cwd_emits_no_field_and_roundtrips() {\n*309|        let row = SessionEntry {\n 310|            ts: \"t\".to_string(),\n 311|            session_id: \"s\".to_string(),\n 312|            trigger: SessionTrigger::Boot,\n...\n 321|        );\n*322|        let back: SessionEntry = serde_json::from_str(&json).unwrap();\n 323|        assert_eq!(row, back, \"a no-cwd row round-trips identically\");\n 324|    }\n 325|\n...\n 354|    fn adapter_field_roundtrips_and_survives_append() {\n*355|        let none_row = SessionEntry {\n 356|            ts: \"t\".to_string(),\n 357|            session_id: \"s\".to_string(),\n 358|            trigger: SessionTrigger::Boot,\n...\n 374|            &perch,\n*375|            &SessionEntry {\n 376|                ts: \"t2\".to_string(),\n 377|                session_id: \"s2\".to_string(),\n 378|                trigger: SessionTrigger::Clear,"}],"details":{"scopePath":"crates/spt-store/src/sessions.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\sessions.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":16,"fileCount":1,"files":["crates/spt-store/src/sessions.rs"],"fileMatches":[{"path":"crates/spt-store/src/sessions.rs","count":16}],"truncated":false,"displayContent":"  *1│//! Per-endpoint **session ledger** — `<perch>/sessions.log` (ADR-0019 /\n   2│//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/\n  *3│//! sessions.log`.\n   4│//!\n   5│//! A live agent that `/clear`s or `/compact`s keeps its perch identity but\n   6│//! rotates its harness `session_id` (a new transcript file). The single\n    │...\n  26│/// The ledger filename under a perch.\n *27│pub const LEDGER_FILE: &str = \"sessions.log\";\n  28│\n  29│/// On-disk row cap. The ledger is a rolling tail — older rows rotate out on\n  30│/// append so the file can never grow without bound (risk #2).\n    │...\n  58│#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\n *59│pub struct SessionEntry {\n  60│    /// RFC3339-UTC instant (see [`crate::timefmt`]).\n  61│    pub ts: String,\n  62│    /// The harness session id that became active.\n    │...\n  98│/// line is skipped, the rest still load (the degrade-don't-crash store stance).\n *99│pub fn read_all(perch: &Path) -> Vec<SessionEntry> {\n 100│    let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {\n 101│        return Vec::new();\n 102│    };\n    │...\n 109│/// The last `k` rows (oldest→newest within the tail). `k == 0` ⇒ empty.\n*110│pub fn last_k(perch: &Path, k: usize) -> Vec<SessionEntry> {\n 111│    if k == 0 {\n 112│        return Vec::new();\n 113│    }\n    │...\n 118│\n*119│/// The last `k` rows with every returned entry carrying a usable [`SessionEntry::ordinal`]\n 120│/// for digest-cursor seq encoding (REQ-DIGEST-CURSOR). A row stamped on disk keeps\n 121│/// its persisted ordinal; a pre-migration `None` row falls back to its **absolute**\n 122│/// `read_all` index (not the slice index) so it stays comparable across sessions.\n    │...\n 124│// [impl->REQ-DIGEST-CURSOR]\n*125│pub fn last_k_with_ordinals(perch: &Path, k: usize) -> Vec<SessionEntry> {\n 126│    if k == 0 {\n 127│        return Vec::new();\n 128│    }\n    │...\n 149│// [impl->REQ-TERM-6]\n*150│pub fn append(perch: &Path, entry: &SessionEntry) -> io::Result<bool> {\n 151│    let mut entries = read_all(perch);\n 152│    if entries.last().map(|e| e.session_id.as_str()) == Some(entry.session_id.as_str()) {\n 153│        return Ok(false); // same session re-bound — not a new boundary\n    │...\n 188│\n*189│    fn entry(sid: &str, trigger: SessionTrigger) -> SessionEntry {\n*190│        SessionEntry {\n 191│            ts: crate::timefmt::rfc3339_utc(1_700_000_000),\n 192│            session_id: sid.to_string(),\n 193│            trigger,\n    │...\n 255│        let perch = dir.path().join(\"perch\");\n*256│        let with_cwd = SessionEntry {\n 257│            ts: crate::timefmt::rfc3339_utc(1_700_000_000),\n 258│            session_id: \"s-cwd\".to_string(),\n 259│            trigger: SessionTrigger::Boot,\n    │...\n 308│    fn none_cwd_emits_no_field_and_roundtrips() {\n*309│        let row = SessionEntry {\n 310│            ts: \"t\".to_string(),\n 311│            session_id: \"s\".to_string(),\n 312│            trigger: SessionTrigger::Boot,\n    │...\n 321│        );\n*322│        let back: SessionEntry = serde_json::from_str(&json).unwrap();\n 323│        assert_eq!(row, back, \"a no-cwd row round-trips identically\");\n 324│    }\n 325│\n    │...\n 354│    fn adapter_field_roundtrips_and_survives_append() {\n*355│        let none_row = SessionEntry {\n 356│            ts: \"t\".to_string(),\n 357│            session_id: \"s\".to_string(),\n 358│            trigger: SessionTrigger::Boot,\n    │...\n 374│            &perch,\n*375│            &SessionEntry {\n 376│                ts: \"t2\".to_string(),\n 377│                session_id: \"s2\".to_string(),\n 378│                trigger: SessionTrigger::Clear,"},"isError":false,"timestamp":1784293362590}}
{"type":"message","id":"89b23822","parentId":"0c339099","timestamp":"2026-07-17T13:02:42.595Z","message":{"role":"toolResult","toolCallId":"call_UtdMER559qtUC3vrHI1mCgrB|fc_034a6be5a6696b6c016a5a27f223bc8191bcccea2f33112e7f","toolName":"read","content":[{"type":"text","text":"//! Per-endpoint **session ledger** — `<perch>/sessions.log` (ADR-0019 /\n//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/\n//! sessions.log`.\n//!\n//! A live agent that `/clear`s or `/compact`s keeps its perch identity but\n//! rotates its harness `session_id` (a new transcript file). The single\n//! `{session_id}` a `[history]`/`[digest]` source resolves therefore *follows*\n//! the thread but cannot *span* it. This ledger records each rotation so the\n//! digest can enumerate the **last K sessions** and bridge a boundary\n//! (ADR-0019 §thread-spanning).\n//!\n//! One JSONL row per rotation: `{ts, session_id, trigger}`. The ledger is\n//! **bounded** ([`MAX_LEDGER`]) — the sister project's seal-on-boot failure grew\n//! its equivalent unboundedly (DIGEST-MILESTONE-PLAN risk #2); appending rotates\n//! the oldest rows out. A re-bind of the *same* session is not a new boundary and\n//! is deduped.\n// [impl->REQ-TERM-6]\n\nuse std::io;\nuse std::path::Path;\n\nuse serde::{Deserialize, Serialize};\n\nuse crate::atomic::atomic_write_string;\n\n/// The ledger filename under a perch.\npub const LEDGER_FILE: &str = \"sessions.log\";\n\n/// On-disk row cap. The ledger is a rolling tail — older rows rotate out on\n/// append so the file can never grow without bound (risk #2).\npub const MAX_LEDGER: usize = 64;\n\n/// Why a session became active.\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]\n#[serde(rename_all = \"lowercase\")]\npub enum SessionTrigger {\n    /// First bind of the perch (`api listen` / revive).\n    Boot,\n    /// A `/clear` boundary (`api boundary clear`).\n    Clear,\n    /// A `/compact` boundary (`api boundary compact`).\n    Compact,\n}\n\nimpl SessionTrigger {\n    /// The lowercase token (matches the serde wire form) — used as the boundary\n    /// marker `kind` in the spanned digest.\n    pub fn token(self) -> &'static str {\n        match self {\n            SessionTrigger::Boot => \"boot\",\n            SessionTrigger::Clear => \"clear\",\n            SessionTrigger::Compact => \"compact\",\n        }\n    }\n}\n\n/// One ledger row: a `session_id` became active at `ts` via `trigger`.\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct SessionEntry {\n    /// RFC3339-UTC instant (see [`crate::timefmt`]).\n    pub ts: String,\n    /// The harness session id that became active.\n    pub session_id: String,\n    /// What caused the rotation.\n    pub trigger: SessionTrigger,\n    /// The project working directory the session was active in (the W3\n    /// `info.cwd` set at bind, or the spawn cwd). **Additive serde-default**: a\n    /// pre-migration row missing `cwd` deserializes as `None`. A harness resolves\n    /// a transcript by `session_id` + `cwd`, so picker Resume-from-history\n    /// (cross-project rows) restores the right dir from here.\n    // [impl->REQ-SESSION-RESUME-TEMPLATE]\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pub cwd: Option<String>,\n    /// A **persisted, monotonic** ledger ordinal — the stable per-row sequence the\n    /// digest cursor anchors to (REQ-DIGEST-CURSOR). The ledger is bounded\n    /// ([`MAX_LEDGER`]): a `read_all` index renumbers survivors when the oldest row\n    /// prunes, which would re-number a consumer's cursor under it. A persisted\n    /// ordinal is stamped once at [`append`] and never moves, so a pruned survivor\n    /// keeps its number. **Additive serde-default**: a pre-migration row missing\n    /// `ordinal` deserializes as `None` and is backfilled to its concrete index on\n    /// the next append (so a migrated ledger is fully ordinal-stamped).\n    // [impl->REQ-DIGEST-CURSOR]\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pub ordinal: Option<u64>,\n    /// The adapter[:profile] the session ran under (D-2, REQ-SESSION-ADAPTER-RECORDED).\n    /// A resume-from-history restores THIS harness — the one that authored the\n    /// transcript — not merely the endpoint's *current* stamp (which a B-2\n    /// ChangeAdapter or a fork may have moved since). **Additive serde-default**: a\n    /// pre-migration row missing `adapter` deserializes as `None`; `None` omits the\n    /// key on serialize (byte-identical to old rows). `None` is a benign degrade —\n    /// resume falls back to the endpoint's current adapter.\n    // [impl->REQ-SESSION-ADAPTER-RECORDED]\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pub adapter: Option<String>,\n}\n\n/// Every ledger row in order (oldest→newest). Tolerant: a blank or unparseable\n/// line is skipped, the rest still load (the degrade-don't-crash store stance).\npub fn read_all(perch: &Path) -> Vec<SessionEntry> {\n    let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {\n        return Vec::new();\n    };\n    s.lines()\n        .filter(|l| !l.trim().is_empty())\n        .filter_map(|l| serde_json::from_str(l).ok())\n        .collect()\n}\n\n/// The last `k` rows (oldest→newest within the tail). `k == 0` ⇒ empty.\npub fn last_k(perch: &Path, k: usize) -> Vec<SessionEntry> {\n    if k == 0 {\n        return Vec::new();\n    }\n    let all = read_all(perch);\n    let start = all.len().saturating_sub(k);\n    all[start..].to_vec()\n}\n\n/// The last `k` rows with every returned entry carrying a usable [`SessionEntry::ordinal`]\n/// for digest-cursor seq encoding (REQ-DIGEST-CURSOR). A row stamped on disk keeps\n/// its persisted ordinal; a pre-migration `None` row falls back to its **absolute**\n/// `read_all` index (not the slice index) so it stays comparable across sessions.\n/// The absolute index of returned entry `i` is `(all.len() - returned.len()) + i`.\n// [impl->REQ-DIGEST-CURSOR]\npub fn last_k_with_ordinals(perch: &Path, k: usize) -> Vec<SessionEntry> {\n    if k == 0 {\n        return Vec::new();\n    }\n    let all = read_all(perch);\n    let start = all.len().saturating_sub(k);\n    all[start..]\n        .iter()\n        .enumerate()\n        .map(|(i, e)| {\n            let mut e = e.clone();\n            // Some from disk; else the absolute read_all index as the fallback.\n            e.ordinal = Some(e.ordinal.unwrap_or((start + i) as u64));\n            e\n        })\n        .collect()\n}\n\n/// Append `entry`, deduping an immediate repeat of the same `session_id` (a\n/// re-bind of the live session is not a new boundary) and bounding the ledger to\n/// [`MAX_LEDGER`] (oldest rows rotate out). The whole bounded ledger is rewritten\n/// atomically (it is tiny — ≤ `MAX_LEDGER` short rows — so a full rewrite avoids\n/// partial-line corruption). Returns `true` if a row was written, `false` on a\n/// same-session dedup.\n// [impl->REQ-TERM-6]\npub fn append(perch: &Path, entry: &SessionEntry) -> io::Result<bool> {\n    let mut entries = read_all(perch);\n    if entries.last().map(|e| e.session_id.as_str()) == Some(entry.session_id.as_str()) {\n        return Ok(false); // same session re-bound — not a new boundary\n    }\n    // BACKFILL: stamp any pre-migration (`ordinal == None`) row with its concrete\n    // read_all index, so post-migration the ledger is fully ordinal-stamped and no\n    // survivor renumbers on a later prune (REQ-DIGEST-CURSOR).\n    for (i, e) in entries.iter_mut().enumerate() {\n        if e.ordinal.is_none() {\n            e.ordinal = Some(i as u64);\n        }\n    }\n    // The new row's ordinal is one past the highest existing (monotonic, persisted).\n    // With the backfill above every existing row is now Some, so `last()` carries\n    // the max; an empty ledger starts at 0.\n    let next = entries\n        .last()\n        .and_then(|e| e.ordinal)\n        .map(|o| o + 1)\n        .unwrap_or(0);\n    let mut entry = entry.clone();\n    entry.ordinal = Some(next);\n    entries.push(entry);\n    let start = entries.len().saturating_sub(MAX_LEDGER);\n    let body: String = entries[start..]\n        .iter()\n        .map(|e| serde_json::to_string(e).unwrap_or_default())\n        .map(|l| l + \"\\n\")\n        .collect();\n    std::fs::create_dir_all(perch)?;\n    atomic_write_string(&perch.join(LEDGER_FILE), &body)?;\n    Ok(true)\n}\n\n[Showing lines 1-183 of 478. Use :184 to continue]"}],"details":{"truncation":{"content":"//! Per-endpoint **session ledger** — `<perch>/sessions.log` (ADR-0019 /\r\n//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/\r\n//! sessions.log`.\r\n//!\r\n//! A live agent that `/clear`s or `/compact`s keeps its perch identity but\r\n//! rotates its harness `session_id` (a new transcript file). The single\r\n//! `{session_id}` a `[history]`/`[digest]` source resolves therefore *follows*\r\n//! the thread but cannot *span* it. This ledger records each rotation so the\r\n//! digest can enumerate the **last K sessions** and bridge a boundary\r\n//! (ADR-0019 §thread-spanning).\r\n//!\r\n//! One JSONL row per rotation: `{ts, session_id, trigger}`. The ledger is\r\n//! **bounded** ([`MAX_LEDGER`]) — the sister project's seal-on-boot failure grew\r\n//! its equivalent unboundedly (DIGEST-MILESTONE-PLAN risk #2); appending rotates\r\n//! the oldest rows out. A re-bind of the *same* session is not a new boundary and\r\n//! is deduped.\r\n// [impl->REQ-TERM-6]\r\n\r\nuse std::io;\r\nuse std::path::Path;\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\nuse crate::atomic::atomic_write_string;\r\n\r\n/// The ledger filename under a perch.\r\npub const LEDGER_FILE: &str = \"sessions.log\";\r\n\r\n/// On-disk row cap. The ledger is a rolling tail — older rows rotate out on\r\n/// append so the file can never grow without bound (risk #2).\r\npub const MAX_LEDGER: usize = 64;\r\n\r\n/// Why a session became active.\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]\r\n#[serde(rename_all = \"lowercase\")]\r\npub enum SessionTrigger {\r\n    /// First bind of the perch (`api listen` / revive).\r\n    Boot,\r\n    /// A `/clear` boundary (`api boundary clear`).\r\n    Clear,\r\n    /// A `/compact` boundary (`api boundary compact`).\r\n    Compact,\r\n}\r\n\r\nimpl SessionTrigger {\r\n    /// The lowercase token (matches the serde wire form) — used as the boundary\r\n    /// marker `kind` in the spanned digest.\r\n    pub fn token(self) -> &'static str {\r\n        match self {\r\n            SessionTrigger::Boot => \"boot\",\r\n            SessionTrigger::Clear => \"clear\",\r\n            SessionTrigger::Compact => \"compact\",\r\n        }\r\n    }\r\n}\r\n\r\n/// One ledger row: a `session_id` became active at `ts` via `trigger`.\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\r\npub struct SessionEntry {\r\n    /// RFC3339-UTC instant (see [`crate::timefmt`]).\r\n    pub ts: String,\r\n    /// The harness session id that became active.\r\n    pub session_id: String,\r\n    /// What caused the rotation.\r\n    pub trigger: SessionTrigger,\r\n    /// The project working directory the session was active in (the W3\r\n    /// `info.cwd` set at bind, or the spawn cwd). **Additive serde-default**: a\r\n    /// pre-migration row missing `cwd` deserializes as `None`. A harness resolves\r\n    /// a transcript by `session_id` + `cwd`, so picker Resume-from-history\r\n    /// (cross-project rows) restores the right dir from here.\r\n    // [impl->REQ-SESSION-RESUME-TEMPLATE]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub cwd: Option<String>,\r\n    /// A **persisted, monotonic** ledger ordinal — the stable per-row sequence the\r\n    /// digest cursor anchors to (REQ-DIGEST-CURSOR). The ledger is bounded\r\n    /// ([`MAX_LEDGER`]): a `read_all` index renumbers survivors when the oldest row\r\n    /// prunes, which would re-number a consumer's cursor under it. A persisted\r\n    /// ordinal is stamped once at [`append`] and never moves, so a pruned survivor\r\n    /// keeps its number. **Additive serde-default**: a pre-migration row missing\r\n    /// `ordinal` deserializes as `None` and is backfilled to its concrete index on\r\n    /// the next append (so a migrated ledger is fully ordinal-stamped).\r\n    // [impl->REQ-DIGEST-CURSOR]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub ordinal: Option<u64>,\r\n    /// The adapter[:profile] the session ran under (D-2, REQ-SESSION-ADAPTER-RECORDED).\r\n    /// A resume-from-history restores THIS harness — the one that authored the\r\n    /// transcript — not merely the endpoint's *current* stamp (which a B-2\r\n    /// ChangeAdapter or a fork may have moved since). **Additive serde-default**: a\r\n    /// pre-migration row missing `adapter` deserializes as `None`; `None` omits the\r\n    /// key on serialize (byte-identical to old rows). `None` is a benign degrade —\r\n    /// resume falls back to the endpoint's current adapter.\r\n    // [impl->REQ-SESSION-ADAPTER-RECORDED]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub adapter: Option<String>,\r\n}\r\n\r\n/// Every ledger row in order (oldest→newest). Tolerant: a blank or unparseable\r\n/// line is skipped, the rest still load (the degrade-don't-crash store stance).\r\npub fn read_all(perch: &Path) -> Vec<SessionEntry> {\r\n    let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {\r\n        return Vec::new();\r\n    };\r\n    s.lines()\r\n        .filter(|l| !l.trim().is_empty())\r\n        .filter_map(|l| serde_json::from_str(l).ok())\r\n        .collect()\r\n}\r\n\r\n/// The last `k` rows (oldest→newest within the tail). `k == 0` ⇒ empty.\r\npub fn last_k(perch: &Path, k: usize) -> Vec<SessionEntry> {\r\n    if k == 0 {\r\n        return Vec::new();\r\n    }\r\n    let all = read_all(perch);\r\n    let start = all.len().saturating_sub(k);\r\n    all[start..].to_vec()\r\n}\r\n\r\n/// The last `k` rows with every returned entry carrying a usable [`SessionEntry::ordinal`]\r\n/// for digest-cursor seq encoding (REQ-DIGEST-CURSOR). A row stamped on disk keeps\r\n/// its persisted ordinal; a pre-migration `None` row falls back to its **absolute**\r\n/// `read_all` index (not the slice index) so it stays comparable across sessions.\r\n/// The absolute index of returned entry `i` is `(all.len() - returned.len()) + i`.\r\n// [impl->REQ-DIGEST-CURSOR]\r\npub fn last_k_with_ordinals(perch: &Path, k: usize) -> Vec<SessionEntry> {\r\n    if k == 0 {\r\n        return Vec::new();\r\n    }\r\n    let all = read_all(perch);\r\n    let start = all.len().saturating_sub(k);\r\n    all[start..]\r\n        .iter()\r\n        .enumerate()\r\n        .map(|(i, e)| {\r\n            let mut e = e.clone();\r\n            // Some from disk; else the absolute read_all index as the fallback.\r\n            e.ordinal = Some(e.ordinal.unwrap_or((start + i) as u64));\r\n            e\r\n        })\r\n        .collect()\r\n}\r\n\r\n/// Append `entry`, deduping an immediate repeat of the same `session_id` (a\r\n/// re-bind of the live session is not a new boundary) and bounding the ledger to\r\n/// [`MAX_LEDGER`] (oldest rows rotate out). The whole bounded ledger is rewritten\r\n/// atomically (it is tiny — ≤ `MAX_LEDGER` short rows — so a full rewrite avoids\r\n/// partial-line corruption). Returns `true` if a row was written, `false` on a\r\n/// same-session dedup.\r\n// [impl->REQ-TERM-6]\r\npub fn append(perch: &Path, entry: &SessionEntry) -> io::Result<bool> {\r\n    let mut entries = read_all(perch);\r\n    if entries.last().map(|e| e.session_id.as_str()) == Some(entry.session_id.as_str()) {\r\n        return Ok(false); // same session re-bound — not a new boundary\r\n    }\r\n    // BACKFILL: stamp any pre-migration (`ordinal == None`) row with its concrete\r\n    // read_all index, so post-migration the ledger is fully ordinal-stamped and no\r\n    // survivor renumbers on a later prune (REQ-DIGEST-CURSOR).\r\n    for (i, e) in entries.iter_mut().enumerate() {\r\n        if e.ordinal.is_none() {\r\n            e.ordinal = Some(i as u64);\r\n        }\r\n    }\r\n    // The new row's ordinal is one past the highest existing (monotonic, persisted).\r\n    // With the backfill above every existing row is now Some, so `last()` carries\r\n    // the max; an empty ledger starts at 0.\r\n    let next = entries\r\n        .last()\r\n        .and_then(|e| e.ordinal)\r\n        .map(|o| o + 1)\r\n        .unwrap_or(0);\r\n    let mut entry = entry.clone();\r\n    entry.ordinal = Some(next);\r\n    entries.push(entry);\r\n    let start = entries.len().saturating_sub(MAX_LEDGER);\r\n    let body: String = entries[start..]\r\n        .iter()\r\n        .map(|e| serde_json::to_string(e).unwrap_or_default())\r\n        .map(|l| l + \"\\n\")\r\n        .collect();\r\n    std::fs::create_dir_all(perch)?;\r\n    atomic_write_string(&perch.join(LEDGER_FILE), &body)?;\r\n    Ok(true)\r\n}\r","truncated":true,"truncatedBy":"lines","totalLines":478,"totalBytes":8207,"outputLines":183,"outputBytes":8207,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"//! Per-endpoint **session ledger** — `<perch>/sessions.log` (ADR-0019 /\r\n//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/\r\n//! sessions.log`.\r\n//!\r\n//! A live agent that `/clear`s or `/compact`s keeps its perch identity but\r\n//! rotates its harness `session_id` (a new transcript file). The single\r\n//! `{session_id}` a `[history]`/`[digest]` source resolves therefore *follows*\r\n//! the thread but cannot *span* it. This ledger records each rotation so the\r\n//! digest can enumerate the **last K sessions** and bridge a boundary\r\n//! (ADR-0019 §thread-spanning).\r\n//!\r\n//! One JSONL row per rotation: `{ts, session_id, trigger}`. The ledger is\r\n//! **bounded** ([`MAX_LEDGER`]) — the sister project's seal-on-boot failure grew\r\n//! its equivalent unboundedly (DIGEST-MILESTONE-PLAN risk #2); appending rotates\r\n//! the oldest rows out. A re-bind of the *same* session is not a new boundary and\r\n//! is deduped.\r\n// [impl->REQ-TERM-6]\r\n\r\nuse std::io;\r\nuse std::path::Path;\r\n\r\nuse serde::{Deserialize, Serialize};\r\n\r\nuse crate::atomic::atomic_write_string;\r\n\r\n/// The ledger filename under a perch.\r\npub const LEDGER_FILE: &str = \"sessions.log\";\r\n\r\n/// On-disk row cap. The ledger is a rolling tail — older rows rotate out on\r\n/// append so the file can never grow without bound (risk #2).\r\npub const MAX_LEDGER: usize = 64;\r\n\r\n/// Why a session became active.\r\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]\r\n#[serde(rename_all = \"lowercase\")]\r\npub enum SessionTrigger {\r\n    /// First bind of the perch (`api listen` / revive).\r\n    Boot,\r\n    /// A `/clear` boundary (`api boundary clear`).\r\n    Clear,\r\n    /// A `/compact` boundary (`api boundary compact`).\r\n    Compact,\r\n}\r\n\r\nimpl SessionTrigger {\r\n    /// The lowercase token (matches the serde wire form) — used as the boundary\r\n    /// marker `kind` in the spanned digest.\r\n    pub fn token(self) -> &'static str {\r\n        match self {\r\n            SessionTrigger::Boot => \"boot\",\r\n            SessionTrigger::Clear => \"clear\",\r\n            SessionTrigger::Compact => \"compact\",\r\n        }\r\n    }\r\n}\r\n\r\n/// One ledger row: a `session_id` became active at `ts` via `trigger`.\r\n#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\r\npub struct SessionEntry {\r\n    /// RFC3339-UTC instant (see [`crate::timefmt`]).\r\n    pub ts: String,\r\n    /// The harness session id that became active.\r\n    pub session_id: String,\r\n    /// What caused the rotation.\r\n    pub trigger: SessionTrigger,\r\n    /// The project working directory the session was active in (the W3\r\n    /// `info.cwd` set at bind, or the spawn cwd). **Additive serde-default**: a\r\n    /// pre-migration row missing `cwd` deserializes as `None`. A harness resolves\r\n    /// a transcript by `session_id` + `cwd`, so picker Resume-from-history\r\n    /// (cross-project rows) restores the right dir from here.\r\n    // [impl->REQ-SESSION-RESUME-TEMPLATE]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub cwd: Option<String>,\r\n    /// A **persisted, monotonic** ledger ordinal — the stable per-row sequence the\r\n    /// digest cursor anchors to (REQ-DIGEST-CURSOR). The ledger is bounded\r\n    /// ([`MAX_LEDGER`]): a `read_all` index renumbers survivors when the oldest row\r\n    /// prunes, which would re-number a consumer's cursor under it. A persisted\r\n    /// ordinal is stamped once at [`append`] and never moves, so a pruned survivor\r\n    /// keeps its number. **Additive serde-default**: a pre-migration row missing\r\n    /// `ordinal` deserializes as `None` and is backfilled to its concrete index on\r\n    /// the next append (so a migrated ledger is fully ordinal-stamped).\r\n    // [impl->REQ-DIGEST-CURSOR]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub ordinal: Option<u64>,\r\n    /// The adapter[:profile] the session ran under (D-2, REQ-SESSION-ADAPTER-RECORDED).\r\n    /// A resume-from-history restores THIS harness — the one that authored the\r\n    /// transcript — not merely the endpoint's *current* stamp (which a B-2\r\n    /// ChangeAdapter or a fork may have moved since). **Additive serde-default**: a\r\n    /// pre-migration row missing `adapter` deserializes as `None`; `None` omits the\r\n    /// key on serialize (byte-identical to old rows). `None` is a benign degrade —\r\n    /// resume falls back to the endpoint's current adapter.\r\n    // [impl->REQ-SESSION-ADAPTER-RECORDED]\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub adapter: Option<String>,\r\n}\r\n\r\n/// Every ledger row in order (oldest→newest). Tolerant: a blank or unparseable\r\n/// line is skipped, the rest still load (the degrade-don't-crash store stance).\r\npub fn read_all(perch: &Path) -> Vec<SessionEntry> {\r\n    let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {\r\n        return Vec::new();\r\n    };\r\n    s.lines()\r\n        .filter(|l| !l.trim().is_empty())\r\n        .filter_map(|l| serde_json::from_str(l).ok())\r\n        .collect()\r\n}\r\n\r\n/// The last `k` rows (oldest→newest within the tail). `k == 0` ⇒ empty.\r\npub fn last_k(perch: &Path, k: usize) -> Vec<SessionEntry> {\r\n    if k == 0 {\r\n        return Vec::new();\r\n    }\r\n    let all = read_all(perch);\r\n    let start = all.len().saturating_sub(k);\r\n    all[start..].to_vec()\r\n}\r\n\r\n/// The last `k` rows with every returned entry carrying a usable [`SessionEntry::ordinal`]\r\n/// for digest-cursor seq encoding (REQ-DIGEST-CURSOR). A row stamped on disk keeps\r\n/// its persisted ordinal; a pre-migration `None` row falls back to its **absolute**\r\n/// `read_all` index (not the slice index) so it stays comparable across sessions.\r\n/// The absolute index of returned entry `i` is `(all.len() - returned.len()) + i`.\r\n// [impl->REQ-DIGEST-CURSOR]\r\npub fn last_k_with_ordinals(perch: &Path, k: usize) -> Vec<SessionEntry> {\r\n    if k == 0 {\r\n        return Vec::new();\r\n    }\r\n    let all = read_all(perch);\r\n    let start = all.len().saturating_sub(k);\r\n    all[start..]\r\n        .iter()\r\n        .enumerate()\r\n        .map(|(i, e)| {\r\n            let mut e = e.clone();\r\n            // Some from disk; else the absolute read_all index as the fallback.\r\n            e.ordinal = Some(e.ordinal.unwrap_or((start + i) as u64));\r\n            e\r\n        })\r\n        .collect()\r\n}\r\n\r\n/// Append `entry`, deduping an immediate repeat of the same `session_id` (a\r\n/// re-bind of the live session is not a new boundary) and bounding the ledger to\r\n/// [`MAX_LEDGER`] (oldest rows rotate out). The whole bounded ledger is rewritten\r\n/// atomically (it is tiny — ≤ `MAX_LEDGER` short rows — so a full rewrite avoids\r\n/// partial-line corruption). Returns `true` if a row was written, `false` on a\r\n/// same-session dedup.\r\n// [impl->REQ-TERM-6]\r\npub fn append(perch: &Path, entry: &SessionEntry) -> io::Result<bool> {\r\n    let mut entries = read_all(perch);\r\n    if entries.last().map(|e| e.session_id.as_str()) == Some(entry.session_id.as_str()) {\r\n        return Ok(false); // same session re-bound — not a new boundary\r\n    }\r\n    // BACKFILL: stamp any pre-migration (`ordinal == None`) row with its concrete\r\n    // read_all index, so post-migration the ledger is fully ordinal-stamped and no\r\n    // survivor renumbers on a later prune (REQ-DIGEST-CURSOR).\r\n    for (i, e) in entries.iter_mut().enumerate() {\r\n        if e.ordinal.is_none() {\r\n            e.ordinal = Some(i as u64);\r\n        }\r\n    }\r\n    // The new row's ordinal is one past the highest existing (monotonic, persisted).\r\n    // With the backfill above every existing row is now Some, so `last()` carries\r\n    // the max; an empty ledger starts at 0.\r\n    let next = entries\r\n        .last()\r\n        .and_then(|e| e.ordinal)\r\n        .map(|o| o + 1)\r\n        .unwrap_or(0);\r\n    let mut entry = entry.clone();\r\n    entry.ordinal = Some(next);\r\n    entries.push(entry);\r\n    let start = entries.len().saturating_sub(MAX_LEDGER);\r\n    let body: String = entries[start..]\r\n        .iter()\r\n        .map(|e| serde_json::to_string(e).unwrap_or_default())\r\n        .map(|l| l + \"\\n\")\r\n        .collect();\r\n    std::fs::create_dir_all(perch)?;\r\n    atomic_write_string(&perch.join(LEDGER_FILE), &body)?;\r\n    Ok(true)\r\n}\r","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\sessions.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":478,"totalBytes":8207,"outputLines":183,"outputBytes":8207,"shownRange":{"start":1,"end":183},"nextOffset":184}}},"isError":false,"timestamp":1784293362595}}
{"type":"message","id":"43458afc","parentId":"89b23822","timestamp":"2026-07-17T13:02:42.611Z","message":{"role":"toolResult","toolCallId":"call_KZeiELB5ThNy2VIDAqUo98wu|fc_034a6be5a6696b6c016a5a27f223b081919bc1744f75f6d7ed","toolName":"read","content":[{"type":"text","text":"/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the\n/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from\n/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure\n/// over its inputs so the any-controller mapping is unit-tested.\n// [impl->REQ-GOSSIP-CONTROLLED-ANY]\nfn gossip_controller_node(\n    driven_by: Option<&str>,\n    controlled: bool,\n    self_node: &str,\n) -> Option<String> {\n    match driven_by {\n        Some(remote) => Some(remote.to_string()),\n        None if controlled => Some(self_node.to_string()),\n        None => None,\n    }\n}\n\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\n/// accumulate many cwds); the picker's project pane never needs more.\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\n\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n    let entries = spt_store::sessions::read_all(perch_path);\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n    let mut out: Vec<String> = Vec::new();\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\n        let dir = Path::new(cwd);\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\n            continue;\n        }\n        let pid = spt_store::project::project_id_for_dir(dir);\n        if pid.is_empty() {\n            continue;\n        }\n        if seen.insert(pid.clone()) {\n            out.push(pid);\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\n                break;\n            }\n        }\n    }\n    out\n}\n\n/// The superseded identities a completed ceremony's intro reveals (pure,\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\n/// label AND machine id under a DIFFERENT node key than the re-paired\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\n/// collide), a machine id alone is never gossiped without its label.\n// [impl->REQ-SUBNET-7]\npub fn superseded_identities(\n    reg: &SubnetRegistry,\n    intro: &spt_net::net::pairing::wire::NodeIntro,\n    joiner_hex: &str,\n) -> Vec<String> {\n    let mut out = Vec::new();\n    for id in reg.endpoint_ids() {\n        for inst in reg.instances(id) {\n            if inst.node != joiner_hex\n                && inst.node_label.as_deref() == Some(intro.label.as_str())\n                && inst.machine_id.as_deref() == Some(intro.machine_id.as_str())\n                && !out.contains(&inst.node)\n            {\n                out.push(inst.node.clone());\n            }\n        }\n    }\n    out\n}\n\n/// One re-pair rekey awareness notice (Mesh-D6, REQ-MESH-5): the machine that\n/// previously presented `old_hex` has re-paired under `new_hex`. The DEMOTED\n/// form of the former label-anchored warn-on-change — anchored on the hashed\n/// `machine_id` (not the spoofable label), surfaced as a non-blocking notice at\n/// the same event as the REQ-SUBNET-7 eviction, **never a gate**. Absent a\n/// machine id the superseded match never fires, so no false notice is raised.\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct RekeyNotice {\n    /// The machine's advertised node label (display only).\n    pub label: String,\n    /// The hashed machine id the match anchored on.\n    pub machine_id: String,\n    /// The superseded key (the one last seen for this machine).\n    pub old_hex: String,\n    /// The fresh key the machine now presents (the joiner).\n    pub new_hex: String,\n}\n\n[Showing lines 959-1053 of 2429. Use :1054 to continue]"}],"details":{"truncation":{"content":"/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the\r\n/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from\r\n/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure\r\n/// over its inputs so the any-controller mapping is unit-tested.\r\n// [impl->REQ-GOSSIP-CONTROLLED-ANY]\r\nfn gossip_controller_node(\r\n    driven_by: Option<&str>,\r\n    controlled: bool,\r\n    self_node: &str,\r\n) -> Option<String> {\r\n    match driven_by {\r\n        Some(remote) => Some(remote.to_string()),\r\n        None if controlled => Some(self_node.to_string()),\r\n        None => None,\r\n    }\r\n}\r\n\r\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\r\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\r\n/// accumulate many cwds); the picker's project pane never needs more.\r\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\r\n\r\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\r\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\r\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\r\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\r\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\r\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\r\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\r\n    let entries = spt_store::sessions::read_all(perch_path);\r\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\r\n    let mut out: Vec<String> = Vec::new();\r\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\r\n        let dir = Path::new(cwd);\r\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\r\n            continue;\r\n        }\r\n        let pid = spt_store::project::project_id_for_dir(dir);\r\n        if pid.is_empty() {\r\n            continue;\r\n        }\r\n        if seen.insert(pid.clone()) {\r\n            out.push(pid);\r\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// The superseded identities a completed ceremony's intro reveals (pure,\r\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\r\n/// label AND machine id under a DIFFERENT node key than the re-paired\r\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\r\n/// collide), a machine id alone is never gossiped without its label.\r\n// [impl->REQ-SUBNET-7]\r\npub fn superseded_identities(\r\n    reg: &SubnetRegistry,\r\n    intro: &spt_net::net::pairing::wire::NodeIntro,\r\n    joiner_hex: &str,\r\n) -> Vec<String> {\r\n    let mut out = Vec::new();\r\n    for id in reg.endpoint_ids() {\r\n        for inst in reg.instances(id) {\r\n            if inst.node != joiner_hex\r\n                && inst.node_label.as_deref() == Some(intro.label.as_str())\r\n                && inst.machine_id.as_deref() == Some(intro.machine_id.as_str())\r\n                && !out.contains(&inst.node)\r\n            {\r\n                out.push(inst.node.clone());\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// One re-pair rekey awareness notice (Mesh-D6, REQ-MESH-5): the machine that\r\n/// previously presented `old_hex` has re-paired under `new_hex`. The DEMOTED\r\n/// form of the former label-anchored warn-on-change — anchored on the hashed\r\n/// `machine_id` (not the spoofable label), surfaced as a non-blocking notice at\r\n/// the same event as the REQ-SUBNET-7 eviction, **never a gate**. Absent a\r\n/// machine id the superseded match never fires, so no false notice is raised.\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct RekeyNotice {\r\n    /// The machine's advertised node label (display only).\r\n    pub label: String,\r\n    /// The hashed machine id the match anchored on.\r\n    pub machine_id: String,\r\n    /// The superseded key (the one last seen for this machine).\r\n    pub old_hex: String,\r\n    /// The fresh key the machine now presents (the joiner).\r\n    pub new_hex: String,\r\n}\r","truncated":true,"truncatedBy":"lines","totalLines":1471,"totalBytes":4181,"outputLines":95,"outputBytes":4181,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the\r\n/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from\r\n/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure\r\n/// over its inputs so the any-controller mapping is unit-tested.\r\n// [impl->REQ-GOSSIP-CONTROLLED-ANY]\r\nfn gossip_controller_node(\r\n    driven_by: Option<&str>,\r\n    controlled: bool,\r\n    self_node: &str,\r\n) -> Option<String> {\r\n    match driven_by {\r\n        Some(remote) => Some(remote.to_string()),\r\n        None if controlled => Some(self_node.to_string()),\r\n        None => None,\r\n    }\r\n}\r\n\r\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\r\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\r\n/// accumulate many cwds); the picker's project pane never needs more.\r\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\r\n\r\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\r\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\r\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\r\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\r\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\r\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\r\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\r\n    let entries = spt_store::sessions::read_all(perch_path);\r\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\r\n    let mut out: Vec<String> = Vec::new();\r\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\r\n        let dir = Path::new(cwd);\r\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\r\n            continue;\r\n        }\r\n        let pid = spt_store::project::project_id_for_dir(dir);\r\n        if pid.is_empty() {\r\n            continue;\r\n        }\r\n        if seen.insert(pid.clone()) {\r\n            out.push(pid);\r\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// The superseded identities a completed ceremony's intro reveals (pure,\r\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\r\n/// label AND machine id under a DIFFERENT node key than the re-paired\r\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\r\n/// collide), a machine id alone is never gossiped without its label.\r\n// [impl->REQ-SUBNET-7]\r\npub fn superseded_identities(\r\n    reg: &SubnetRegistry,\r\n    intro: &spt_net::net::pairing::wire::NodeIntro,\r\n    joiner_hex: &str,\r\n) -> Vec<String> {\r\n    let mut out = Vec::new();\r\n    for id in reg.endpoint_ids() {\r\n        for inst in reg.instances(id) {\r\n            if inst.node != joiner_hex\r\n                && inst.node_label.as_deref() == Some(intro.label.as_str())\r\n                && inst.machine_id.as_deref() == Some(intro.machine_id.as_str())\r\n                && !out.contains(&inst.node)\r\n            {\r\n                out.push(inst.node.clone());\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// One re-pair rekey awareness notice (Mesh-D6, REQ-MESH-5): the machine that\r\n/// previously presented `old_hex` has re-paired under `new_hex`. The DEMOTED\r\n/// form of the former label-anchored warn-on-change — anchored on the hashed\r\n/// `machine_id` (not the spoofable label), surfaced as a non-blocking notice at\r\n/// the same event as the REQ-SUBNET-7 eviction, **never a gate**. Absent a\r\n/// machine id the superseded match never fires, so no false notice is raised.\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct RekeyNotice {\r\n    /// The machine's advertised node label (display only).\r\n    pub label: String,\r\n    /// The hashed machine id the match anchored on.\r\n    pub machine_id: String,\r\n    /// The superseded key (the one last seen for this machine).\r\n    pub old_hex: String,\r\n    /// The fresh key the machine now presents (the joiner).\r\n    pub new_hex: String,\r\n}\r","startLine":959,"lineNumbers":[959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":4181,"outputLines":95,"outputBytes":4181,"shownRange":{"start":959,"end":1053},"nextOffset":1054}}},"isError":false,"timestamp":1784293362611}}
{"type":"message","id":"ff2ad2dd","parentId":"43458afc","timestamp":"2026-07-17T13:02:48.489Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Investigating git command usage in project_id_for_dir**"},{"type":"toolCall","id":"call_hllJTvUWVyIGeojAlXq59JuI|fc_034a6be5a6696b6c016a5a27f707d0819199d4543d0ab7cbb8","name":"grep","arguments":{"i":"Locating project id resolution","pattern":"pub fn project_id_for_dir|fn project_id_for_dir|git","path":"crates/spt-store/src/project.rs","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8399,"output":89,"cacheRead":170496,"cacheWrite":0,"totalTokens":178984,"reasoningTokens":20,"cost":{"input":0.041995000000000005,"output":0.00267,"cacheRead":0.08524799999999999,"cacheWrite":0,"total":0.129913}},"stopReason":"toolUse","timestamp":1784293362619,"responseId":"resp_034a6be5a6696b6c016a5a27f31d288191a35ab4af73ee4663","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27f607108191ace7ebf24efa6ca8","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWif3b92fB2Tp-RPC_Gcv8nha-Kv1O-HvyPg3XUMSKxVnOzHfDsbe5PHSqnCBcSFpv7b5GBreUY8bjJqdHWgGvjlUrcr6MamvS5GrqA4AfWQHC6xPL_YqG9amP-6N-jenee20lJKUzXBPP5YNMoo4o_BTxTpAt5ES7-UPk83PJzrVOK156hHjnaa94iRZn82tp_CNJ3nOhVC5NH3RTPR82xSOnkSYMr26w1NByaslw16jWi5UfMZgk_rr-IFibPZ8e5wnhs-wwV9AnMPpzX_rNv-qOkfQq0CBwYJy4cWb6Pn_JcDL3n5Dylllg3W-ClMtFCEWnf-4UT-aEt3VrxAW4auer1vlNO-1gdzRHqMULolMG7nx1Z7eyXFglemibSfzAbHfFkVeXPkH5-YmYX1H5ZK0oLiERYH7JFiGlW9QiIOOyXv_WNV4bYlOp9YBt_Sa0xSiFjznj9EA-hfvVwPx_FX8_4goDt-RENroFbLDY35-a72Rx1vS0JFynhk7ZHoW9_3mhItSkQN3vM9s1nzRz1gvP1G2nPY-D_qh4HZawjwkyliP5kEvvtrJbmlA2NV9tgBQIyAPauGi10QsOJ25_R5Klz-SkPU4qHbBPlwop47PrOtDxeImS5xdUOscwtSArJU_WMaR3WDmR2Tg2B9BCbwlM77PvNOOE2ePiHSwUgD6EMiJyBngpASM5fMJe51XrvF9v1fSDuMhWVgv7VcZ6qjU3gMyaijSl9WYUz9filB5P6XGe9m5j2zBBO3deB3OkJu74lx5rXmVhjoXRJicRCszdf8TfDBX8z5GIBsXYBCB42ihg4F7bU_qIMboBIhzZGXzXzZ3dCN_QGGYXUgp4v-UGL7UShftUdJ2fU1-o8MFRACBUzI0KuNUag2f1qoEuyyF9_3BvVQtP0sbH3s_kSd7VxcChQ__Ma0oPffFbN0tblgKOSdCJGSbuQuNCTHgWuLWJCqZGnkEojQD-r2MhJSj33YVWiD40HceCPuenWbfO1LNixPSRgHbe2YZ70ypivYP","summary":[{"type":"summary_text","text":"**Investigating git command usage in project_id_for_dir**"}]},{"id":"fc_034a6be5a6696b6c016a5a27f707d0819199d4543d0ab7cbb8","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating project id resolution\",\"pattern\":\"pub fn project_id_for_dir|fn project_id_for_dir|git\",\"path\":\"crates/spt-store/src/project.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_hllJTvUWVyIGeojAlXq59JuI","name":"grep"}]},"duration":5869.1287999898195,"ttft":3487.3487999886274,"contextSnapshot":{"promptTokens":178895,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_hllJTvUWVyIGeojAlXq59JuI|fc_034a6be5a6696b6c016a5a27f707d0819199d4543d0ab7cbb8","toolName":"grep","startedAt":"2026-07-17T13:02:48.489Z","args":{"path":"crates/spt-store/src/project.rs"},"intent":"Locating project id resolution"},"id":"97869f0c","parentId":"ff2ad2dd","timestamp":"2026-07-17T13:02:48.489Z"}
{"type":"message","id":"125cf716","parentId":"97869f0c","timestamp":"2026-07-17T13:02:48.491Z","message":{"role":"toolResult","toolCallId":"call_hllJTvUWVyIGeojAlXq59JuI|fc_034a6be5a6696b6c016a5a27f707d0819199d4543d0ab7cbb8","toolName":"grep","content":[{"type":"text","text":" 3|//!\n*4|//! Derived **from the project's git remote URL** when it has one: stable and\n 5|//! path-independent, so the same project at `/home/x/proj` and\n 6|//! `C:\\Users\\x\\proj` resolves to the same id (which is what lets D6's\n*7|//! `p-<project_id>` branches line up across nodes). A git repo without a\n*8|//! remote falls back to its toplevel **folder name**; a non-git dir falls back\n 9|//! to its own folder name (documented limitation: folder names are not\n 10|//! guaranteed path-independent across machines).\n 11|//!\n...\n 14|//! name everywhere, and two URL spellings of one remote (SSH vs HTTPS,\n*15|//! trailing `.git`, case) normalize to one id.\n 16|// [impl->REQ-STORE-1]\n 17|\n 18|use std::path::Path;\n...\n 20|\n*21|use crate::gitrun::run_git;\n 22|\n*23|/// Budget for the (local, fast) `git remote get-url` / `rev-parse` reads.\n 24|const PROJECT_GIT_TIMEOUT: Duration = Duration::from_secs(10);\n 25|\n 26|/// Slug a remote URL (or any name) into the project-id charset: lowercase,\n*27|/// scheme/credentials/`.git` stripped, every non-`[a-z0-9]` run collapsed to\n 28|/// one `-`, trimmed of leading/trailing `-`.\n 29|fn slug(raw: &str) -> String {\n 30|    let mut s = raw.trim().to_ascii_lowercase();\n 31|    // Strip URL scheme and credentials: `https://user@host/p` → `host/p`,\n*32|    // `git@host:p` → `host:p` (the `:` collapses to `-` below).\n 33|    if let Some(idx) = s.find(\"://\") {\n 34|        s = s[idx + 3..].to_string();\n 35|    }\n...\n 38|    }\n*39|    if let Some(stripped) = s.strip_suffix(\".git\") {\n 40|        s = stripped.to_string();\n 41|    }\n 42|    let mut out = String::with_capacity(s.len());\n...\n 59|/// Derive the `project_id` for a directory inside (or being) a project.\n*60|/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\n 61|/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\n 62|/// a broken repo must not stall context routing.\n 63|// [impl->REQ-STORE-1]\n*64|pub fn project_id_for_dir(dir: &Path) -> String {\n 65|    project_id_and_display_for_dir(dir).0\n 66|}\n 67|\n 68|/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\n*69|/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\n*70|/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\n 71|/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\n 72|/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\n 73|fn display_from_url(url: &str) -> String {\n 74|    let s = url.trim().trim_end_matches('/');\n*75|    let s = s.strip_suffix(\".git\").unwrap_or(s);\n 76|    // Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).\n 77|    let tail = s.rsplit(['/', ':']).next().unwrap_or(s);\n 78|    if tail.is_empty() {\n...\n 85|/// Derive BOTH the `project_id` (the cross-machine KEY, slugged) and a friendly\n*86|/// DISPLAY name for a directory, in ONE git-invocation pass (same ladder as the\n 87|/// id). The display is human-recognizable — the remote URL's last path segment,\n*88|/// else the git-toplevel folder, else the dir's own folder name — so a picker /\n*89|/// list surface can render `spt-core` while keying on the `github-com-…` slug\n 90|/// (REQ-PICKER-PROJECT-DISPLAY-NAME). A store-only caller with no dir renders the\n 91|/// id verbatim (this fn is only reached with a real dir).\n 92|// [impl->REQ-STORE-1] [impl->REQ-PICKER-PROJECT-DISPLAY-NAME]\n...\n 96|    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\n*97|    if let Ok(out) = run_git(\n 98|        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\n 99|        None,\n 100|        None,\n...\n 112|    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\n*113|    if let Ok(out) = run_git(\n 114|        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\n 115|        None,\n 116|        None,\n...\n 147|    use super::*;\n*148|    use crate::gitrun::run_git_ok;\n 149|    use tempfile::tempdir;\n 150|\n 151|    #[test] // [unit->REQ-STORE-1] SSH and HTTPS spellings of one remote slug to ONE id.\n 152|    fn url_spellings_normalize_to_one_id() {\n*153|        let a = slug(\"git@github.com:SaberMage/spt-core.git\");\n*154|        let b = slug(\"https://github.com/sabermage/spt-core\");\n*155|        assert_eq!(a, \"github-com-sabermage-spt-core\");\n 156|        assert_eq!(a, b);\n 157|    }\n 158|\n*159|    #[test] // [unit->REQ-STORE-1] remote beats folder name; no remote falls to toplevel folder; no git falls to dir name.\n 160|    fn derivation_ladder() {\n*161|        // Non-git dir → its own folder name.\n 162|        let plain = tempdir().unwrap();\n 163|        let sub = plain.path().join(\"My Project\");\n 164|        std::fs::create_dir_all(&sub).unwrap();\n...\n 170|        std::fs::create_dir_all(root.join(\"nested\")).unwrap();\n*171|        run_git_ok(&[\"init\", &root.to_string_lossy()], None, None).unwrap();\n 172|        assert_eq!(project_id_for_dir(&root.join(\"nested\")), \"proj-x\");\n 173|\n 174|        // With a remote → the normalized URL wins.\n*175|        run_git_ok(\n 176|            &[\n 177|                \"-C\",\n 178|                &root.to_string_lossy(),\n...\n 181|                \"origin\",\n*182|                \"git@example.com:Team/Repo.git\",\n 183|            ],\n 184|            None,\n 185|            None,\n...\n 195|    fn display_derivation() {\n*196|        // display_from_url: last path segment, `.git` + trailing slash stripped.\n*197|        assert_eq!(display_from_url(\"https://github.com/SaberMage/spt-core.git\"), \"spt-core\");\n*198|        assert_eq!(display_from_url(\"git@github.com:SaberMage/spt-core.git\"), \"spt-core\");\n 199|        assert_eq!(display_from_url(\"https://example.com/Team/Repo/\"), \"Repo\");\n 200|\n 201|        // One-pass derivation: id keys on the slug, display stays recognizable.\n...\n 204|        std::fs::create_dir_all(root.join(\"nested\")).unwrap();\n*205|        run_git_ok(&[\"init\", &root.to_string_lossy()], None, None).unwrap();\n 206|        // No remote → display = toplevel folder.\n 207|        let (id, disp) = project_id_and_display_for_dir(&root.join(\"nested\"));\n 208|        assert_eq!((id.as_str(), disp.as_str()), (\"proj-x\", \"proj-x\"));\n 209|        // With a remote → id slugged, display = URL tail (case preserved).\n*210|        run_git_ok(\n*211|            &[\"-C\", &root.to_string_lossy(), \"remote\", \"add\", \"origin\", \"git@example.com:Team/CoolRepo.git\"],\n 212|            None,\n 213|            None,\n 214|        )"}],"details":{"scopePath":"crates/spt-store/src/project.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\project.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":34,"fileCount":1,"files":["crates/spt-store/src/project.rs"],"fileMatches":[{"path":"crates/spt-store/src/project.rs","count":34}],"truncated":false,"displayContent":"   3│//!\n  *4│//! Derived **from the project's git remote URL** when it has one: stable and\n   5│//! path-independent, so the same project at `/home/x/proj` and\n   6│//! `C:\\Users\\x\\proj` resolves to the same id (which is what lets D6's\n  *7│//! `p-<project_id>` branches line up across nodes). A git repo without a\n  *8│//! remote falls back to its toplevel **folder name**; a non-git dir falls back\n   9│//! to its own folder name (documented limitation: folder names are not\n  10│//! guaranteed path-independent across machines).\n  11│//!\n    │...\n  14│//! name everywhere, and two URL spellings of one remote (SSH vs HTTPS,\n *15│//! trailing `.git`, case) normalize to one id.\n  16│// [impl->REQ-STORE-1]\n  17│\n  18│use std::path::Path;\n    │...\n  20│\n *21│use crate::gitrun::run_git;\n  22│\n *23│/// Budget for the (local, fast) `git remote get-url` / `rev-parse` reads.\n  24│const PROJECT_GIT_TIMEOUT: Duration = Duration::from_secs(10);\n  25│\n  26│/// Slug a remote URL (or any name) into the project-id charset: lowercase,\n *27│/// scheme/credentials/`.git` stripped, every non-`[a-z0-9]` run collapsed to\n  28│/// one `-`, trimmed of leading/trailing `-`.\n  29│fn slug(raw: &str) -> String {\n  30│    let mut s = raw.trim().to_ascii_lowercase();\n  31│    // Strip URL scheme and credentials: `https://user@host/p` → `host/p`,\n *32│    // `git@host:p` → `host:p` (the `:` collapses to `-` below).\n  33│    if let Some(idx) = s.find(\"://\") {\n  34│        s = s[idx + 3..].to_string();\n  35│    }\n    │...\n  38│    }\n *39│    if let Some(stripped) = s.strip_suffix(\".git\") {\n  40│        s = stripped.to_string();\n  41│    }\n  42│    let mut out = String::with_capacity(s.len());\n    │...\n  59│/// Derive the `project_id` for a directory inside (or being) a project.\n *60│/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\n  61│/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\n  62│/// a broken repo must not stall context routing.\n  63│// [impl->REQ-STORE-1]\n *64│pub fn project_id_for_dir(dir: &Path) -> String {\n  65│    project_id_and_display_for_dir(dir).0\n  66│}\n  67│\n  68│/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\n *69│/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\n *70│/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\n  71│/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\n  72│/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\n  73│fn display_from_url(url: &str) -> String {\n  74│    let s = url.trim().trim_end_matches('/');\n *75│    let s = s.strip_suffix(\".git\").unwrap_or(s);\n  76│    // Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).\n  77│    let tail = s.rsplit(['/', ':']).next().unwrap_or(s);\n  78│    if tail.is_empty() {\n    │...\n  85│/// Derive BOTH the `project_id` (the cross-machine KEY, slugged) and a friendly\n *86│/// DISPLAY name for a directory, in ONE git-invocation pass (same ladder as the\n  87│/// id). The display is human-recognizable — the remote URL's last path segment,\n *88│/// else the git-toplevel folder, else the dir's own folder name — so a picker /\n *89│/// list surface can render `spt-core` while keying on the `github-com-…` slug\n  90│/// (REQ-PICKER-PROJECT-DISPLAY-NAME). A store-only caller with no dir renders the\n  91│/// id verbatim (this fn is only reached with a real dir).\n  92│// [impl->REQ-STORE-1] [impl->REQ-PICKER-PROJECT-DISPLAY-NAME]\n    │...\n  96│    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\n *97│    if let Ok(out) = run_git(\n  98│        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\n  99│        None,\n 100│        None,\n    │...\n 112│    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\n*113│    if let Ok(out) = run_git(\n 114│        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\n 115│        None,\n 116│        None,\n    │...\n 147│    use super::*;\n*148│    use crate::gitrun::run_git_ok;\n 149│    use tempfile::tempdir;\n 150│\n 151│    #[test] // [unit->REQ-STORE-1] SSH and HTTPS spellings of one remote slug to ONE id.\n 152│    fn url_spellings_normalize_to_one_id() {\n*153│        let a = slug(\"git@github.com:SaberMage/spt-core.git\");\n*154│        let b = slug(\"https://github.com/sabermage/spt-core\");\n*155│        assert_eq!(a, \"github-com-sabermage-spt-core\");\n 156│        assert_eq!(a, b);\n 157│    }\n 158│\n*159│    #[test] // [unit->REQ-STORE-1] remote beats folder name; no remote falls to toplevel folder; no git falls to dir name.\n 160│    fn derivation_ladder() {\n*161│        // Non-git dir → its own folder name.\n 162│        let plain = tempdir().unwrap();\n 163│        let sub = plain.path().join(\"My Project\");\n 164│        std::fs::create_dir_all(&sub).unwrap();\n    │...\n 170│        std::fs::create_dir_all(root.join(\"nested\")).unwrap();\n*171│        run_git_ok(&[\"init\", &root.to_string_lossy()], None, None).unwrap();\n 172│        assert_eq!(project_id_for_dir(&root.join(\"nested\")), \"proj-x\");\n 173│\n 174│        // With a remote → the normalized URL wins.\n*175│        run_git_ok(\n 176│            &[\n 177│                \"-C\",\n 178│                &root.to_string_lossy(),\n    │...\n 181│                \"origin\",\n*182│                \"git@example.com:Team/Repo.git\",\n 183│            ],\n 184│            None,\n 185│            None,\n    │...\n 195│    fn display_derivation() {\n*196│        // display_from_url: last path segment, `.git` + trailing slash stripped.\n*197│        assert_eq!(display_from_url(\"https://github.com/SaberMage/spt-core.git\"), \"spt-core\");\n*198│        assert_eq!(display_from_url(\"git@github.com:SaberMage/spt-core.git\"), \"spt-core\");\n 199│        assert_eq!(display_from_url(\"https://example.com/Team/Repo/\"), \"Repo\");\n 200│\n 201│        // One-pass derivation: id keys on the slug, display stays recognizable.\n    │...\n 204│        std::fs::create_dir_all(root.join(\"nested\")).unwrap();\n*205│        run_git_ok(&[\"init\", &root.to_string_lossy()], None, None).unwrap();\n 206│        // No remote → display = toplevel folder.\n 207│        let (id, disp) = project_id_and_display_for_dir(&root.join(\"nested\"));\n 208│        assert_eq!((id.as_str(), disp.as_str()), (\"proj-x\", \"proj-x\"));\n 209│        // With a remote → id slugged, display = URL tail (case preserved).\n*210│        run_git_ok(\n*211│            &[\"-C\", &root.to_string_lossy(), \"remote\", \"add\", \"origin\", \"git@example.com:Team/CoolRepo.git\"],\n 212│            None,\n 213│            None,\n 214│        )"},"isError":false,"timestamp":1784293368491}}
{"type":"message","id":"fdaf2ed5","parentId":"125cf716","timestamp":"2026-07-17T13:03:06.768Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Identifying excessive git process spawning**\n\n**Quantifying session log sizes and process overhead**"},{"type":"toolCall","id":"call_CZV3jxLvYHTc8TKHDsrJ8zrs|fc_034a6be5a6696b6c016a5a280a23148191a7015b1f57b7cf26","name":"glob","arguments":{"i":"Sizing endpoint ledgers","path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log","hidden":true,"gitignore":false,"limit":100}},{"type":"toolCall","id":"call_ZBKlG1SGQFkkJNCsgbLwbZk7|fc_034a6be5a6696b6c016a5a280a232481919bbdd975a9a6899a","name":"grep","arguments":{"i":"Counting ledger rows","pattern":"^\\{","path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_6upMIJqIQFQpiHKPmEn0CcFG|fc_034a6be5a6696b6c016a5a280a23288191bd1ceac23f6089d5","name":"read","arguments":{"i":"Reading project id subprocess path","path":"crates/spt-store/src/project.rs","selector":"55-135"}},{"type":"toolCall","id":"call_B2olHbGqxGGNx1UFAhvZyhLs|fc_034a6be5a6696b6c016a5a280a23308191a958f8dde6051624","name":"grep","arguments":{"i":"Finding git invocation telemetry","pattern":"git\\.exe|project_id|fatal: not a git|cannot change|spawn","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-4898","case":false,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":5351,"output":540,"cacheRead":175616,"cacheWrite":0,"totalTokens":181507,"reasoningTokens":292,"cost":{"input":0.026755,"output":0.0162,"cacheRead":0.087808,"cacheWrite":0,"total":0.130763}},"stopReason":"toolUse","timestamp":1784293368519,"responseId":"resp_034a6be5a6696b6c016a5a27f9062c81918536ba1ac72fb20b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a27fcf4c88191abecd7a621538d4b","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWigK24Hj639b9QZpGzihwExBAZkYQAWgr5KZ4dQapZb9QC11aElq1zDyAGH7URAB7uVy9cKIDGsB67IWYzLaM-BYTeJIQXKz3xCf0qM0WXzo5qNJZlU8cTRF4kUnWzNnJvrZnF0Q1xJz-uB0Nvpztq-7XXjHuAupvRDL3arvfH9A6rGoxfSQeomKROPbnrHE_V1WD1a49Knb28U25VdUxuRE6pc8ITzYdjq3QNpsTPHK-ggOz7sH411ROyN6W_BqPN6uzthBo3ziaqQMohVKr99in_Diefta_jm5nfXemgqR8VSxlOJvMj5wARs0Bt2knLVz1ipr63TqxGucNvNVKncAKbN7lfF-CyM1eVM8XPAAZ06QYPELcmvIO6ZtPTeXk3UAh2mgusjRfV2Jse3E2l8-PHytIsuVna-qWLxtFvW94QrvedR6yqGJJQyeClKEqkwzT0ed2_ALFuRaiWkwAAGEY5Jz8po3FGPy0V14yJkI-Pyc146SaWLv-rCmDONt8hSLa1zMzFC1ygPmDkH-kV91vKVWEF3WPsvtJaumA562Es_qEsD1zfFut362ijd_Wofu76h4v4O9_yNkCrQucqzNSii8JQQJjAqpauptCmyET5k_K1hToldMpvm5rljOsLDG1nC53OAI6XPs74UYCBOaG1Bw42kSa3vo658apg5prCXKJoG7Behcq3JZetop9wGaAiOImXMRt4zD3vm-Gh3iQlJheVtuGDPCPU0v7SH1-PJMWJ1QkVmUYM6dcG8Ai-Xkpo2qGUPg20SjBFWmKtJ1_s3tHKQHtnObkLllT6-ozTnGuEug5oop3QPyiUVee2ehFI50dovpKPp9TBgCh2x3dOnQfkOX8cAVj8vlR38ukq-RogJFFaXEy8eZGZhr1lGB4G2_BWaO2kX0TM9qGHzMByqzjPcsulF6eFF-vSES1LwxlyPMKEYDy-p6CDBGQX6uQiOO5TnsjoyH043IkyGSvc8kAG_4sAAl5eWMT1C-8rcRRywAhlNj2-Ox62-vTD1vv83wX8p94bypi_4s_CsCTg1svy_6IToNE9rSoFO3HHOgplhDXIL3r_87qStOGEajQzHm8lAIm-c9gcbBDm-ii23a8aCeaq-fJ8dAsJ2bEmLCUC6VMnvG0aglRuSP6s8NbAmMcinWpAhEg5082unwijvbJwaVlYCyWIUO5ksOhD9-ADVZTXjfSc3dFyagqQveXC_bAes2p-f04pJZnGZjDeKOMnDF7hAaXGYvyI5sCrDdpInaGui7jd9p6np__lSjpoNw6lu9o6A9D3qk80xbzDcYHFEVCExawAqVgx5-mnQpguJW6TTwxyno_hIP2ix5iji57RUIKnSdUSICTzLd3ZvEDI6nzeDwpufL9rNTqZmqJGInpURbOMF7_X7sSN8gsq9ui15Ck9wEeouwJlZjXVspKTBPrtHqBePOyVRFsK-4tHPJF8uRbsSthuxRpBCxVpm1JbPS21ZWjTvVMESgt-88ZFs4XeZJXZsA0LjUkLjrWAMLyNo03z6LRqxE0G_u0m2KCYnEfNVMWpsV6FZkr2LI27FfReBsdVFgnOUVGR4HA7mrhQrNgPPSaUi9m5LB4kxWgUUfuCSJOxnwQDJLuxJOaRh-oCyLsEuLZE_PMv0MlTkH2_kdU2t1TJwQzMDaW9vZg0FEWllHqk0J80WBmtRR_EAR4aj7kq_xuHXwFUjY6G0FqKcTfXDr6b_S2auB1uSyrh-JzUUnPF0ohJ5y9wsiQZ9Ie1l_TamZQmFO1rmOabGa9DUIzS37uw-Oy2NsIRY-SFZZLLIBZl5OvaUGqL0NaoWR7pluDJRQB2qzrco0rrTqoAIFkUxCwgXmFie57NVkGzfvM7SY_r6lSY4LMTHjb3Y2InltWFXNZrtiUb9cxbdZ6TBfys71I5r751MVRlNA66ZdSTnerwa2bKkvjF3saBLoWlBm4c47eymzSpA7Zc2WX5MHoN7rtuQcdfputFL-cCE67gUJAyEgLrIbgtk2P70oCE67JOrnN7uIBzCqoBhMQYSJouM2US3JQrNS75vHjhcdfAqqsqmAfX3awPYBwYTvi0zOf5x7_iYkmP1VIp1g02V6PkFopVrfMmeTUe4zJVBcHNZOxyJZakF4WeH0ZwWgyTlCscgUQTXLfxC94NQleII5iKkgazATl6y_c6v5oUQ60kyX2diG0Jd7ozq-DzMr1MzXEZ2Mj8Ac5_QV7OjBhH8t9enbScfO7uezvXbkADPZ7CdEYaMmOu3F2HJkXRbq_c7fuOmXb80gAwvhKIW0o7A_2aNg0I2Zv0N1BK42WHVwF16nQOXTXcdF6v8bm8pCn9Fm621bglGgNXm_UcWDNvjm7Hk303NxALp8MvS80BW2qJh787OGItC-QR-R3zgyS5WhCZPtBhb2QgjpycDw1T2MAGknczM_zBUhsgYFA1jWwtBTwqipJDf9btWwHXQpqBH1WBkZ2YPntnnLdgV3yJNj609eFD95cNAcrTgdcK1LNtZNr3lZpzbwN5M8Mf3VycFhUw2d_xH1e_6DaXYpT2SzoW8mgJJ86zL2ESkxPHSEmmPE-w7gqOqbGYSkAC15mOcXPfYkzXhCr_AkGSASRhyN_BOCW_plHMLKBkthC3D1whjj_baWQ0gjexIq9g1WSgb6-Y2ZWSFvgtyN_C5KfdZD0nOP-kYr37jkEILputKlDPFhi44HSAt6tD9iWACze3f21NMDaB2Rc3MFTd7eAiVGvj_-n3VrhP5c","summary":[{"type":"summary_text","text":"**Identifying excessive git process spawning**"},{"type":"summary_text","text":"**Quantifying session log sizes and process overhead**"}]},{"id":"fc_034a6be5a6696b6c016a5a280a23148191a7015b1f57b7cf26","type":"function_call","status":"completed","arguments":"{\"i\":\"Sizing endpoint ledgers\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\",\"hidden\":true,\"gitignore\":false,\"limit\":100}","call_id":"call_CZV3jxLvYHTc8TKHDsrJ8zrs","name":"glob"},{"id":"fc_034a6be5a6696b6c016a5a280a232481919bbdd975a9a6899a","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting ledger rows\",\"pattern\":\"^\\\\{\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_ZBKlG1SGQFkkJNCsgbLwbZk7","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a280a23288191bd1ceac23f6089d5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project id subprocess path\",\"path\":\"crates/spt-store/src/project.rs\",\"selector\":\"55-135\"}","call_id":"call_6upMIJqIQFQpiHKPmEn0CcFG","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a280a23308191a958f8dde6051624","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding git invocation telemetry\",\"pattern\":\"git\\\\.exe|project_id|fatal: not a git|cannot change|spawn\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-4898\",\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_B2olHbGqxGGNx1UFAhvZyhLs","name":"grep"}]},"duration":18248.41740000248,"ttft":4514.042099997401,"contextSnapshot":{"promptTokens":180967,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CZV3jxLvYHTc8TKHDsrJ8zrs|fc_034a6be5a6696b6c016a5a280a23148191a7015b1f57b7cf26","toolName":"glob","startedAt":"2026-07-17T13:03:06.769Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log"},"intent":"Sizing endpoint ledgers"},"id":"87c74756","parentId":"fdaf2ed5","timestamp":"2026-07-17T13:03:06.769Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZBKlG1SGQFkkJNCsgbLwbZk7|fc_034a6be5a6696b6c016a5a280a232481919bbdd975a9a6899a","toolName":"grep","startedAt":"2026-07-17T13:03:06.769Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log"},"intent":"Counting ledger rows"},"id":"b2612a5a","parentId":"87c74756","timestamp":"2026-07-17T13:03:06.769Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_6upMIJqIQFQpiHKPmEn0CcFG|fc_034a6be5a6696b6c016a5a280a23288191bd1ceac23f6089d5","toolName":"read","startedAt":"2026-07-17T13:03:06.769Z","args":{"path":"crates/spt-store/src/project.rs"},"intent":"Reading project id subprocess path"},"id":"382f1fef","parentId":"b2612a5a","timestamp":"2026-07-17T13:03:06.769Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_B2olHbGqxGGNx1UFAhvZyhLs|fc_034a6be5a6696b6c016a5a280a23308191a958f8dde6051624","toolName":"grep","startedAt":"2026-07-17T13:03:06.769Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding git invocation telemetry"},"id":"cdd28d11","parentId":"382f1fef","timestamp":"2026-07-17T13:03:06.769Z"}
{"type":"message","id":"0523dc60","parentId":"cdd28d11","timestamp":"2026-07-17T13:03:06.772Z","message":{"role":"toolResult","toolCallId":"call_6upMIJqIQFQpiHKPmEn0CcFG|fc_034a6be5a6696b6c016a5a280a23288191bd1ceac23f6089d5","toolName":"read","content":[{"type":"text","text":"fn slug(raw: &str) -> String {\n…\n    while out.ends_with('-') {\n        out.pop();\n    }\n    out\n}\n\n/// Derive the `project_id` for a directory inside (or being) a project.\n/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\n/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\n/// a broken repo must not stall context routing.\n// [impl->REQ-STORE-1]\npub fn project_id_for_dir(dir: &Path) -> String {\n    project_id_and_display_for_dir(dir).0\n}\n\n/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\n/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\n/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\n/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\n/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\nfn display_from_url(url: &str) -> String {\n    let s = url.trim().trim_end_matches('/');\n    let s = s.strip_suffix(\".git\").unwrap_or(s);\n    // Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).\n    let tail = s.rsplit(['/', ':']).next().unwrap_or(s);\n    if tail.is_empty() {\n        slug(url)\n    } else {\n        tail.to_string()\n    }\n}\n\n/// Derive BOTH the `project_id` (the cross-machine KEY, slugged) and a friendly\n/// DISPLAY name for a directory, in ONE git-invocation pass (same ladder as the\n/// id). The display is human-recognizable — the remote URL's last path segment,\n/// else the git-toplevel folder, else the dir's own folder name — so a picker /\n/// list surface can render `spt-core` while keying on the `github-com-…` slug\n/// (REQ-PICKER-PROJECT-DISPLAY-NAME). A store-only caller with no dir renders the\n/// id verbatim (this fn is only reached with a real dir).\n// [impl->REQ-STORE-1] [impl->REQ-PICKER-PROJECT-DISPLAY-NAME]\npub fn project_id_and_display_for_dir(dir: &Path) -> (String, String) {\n    let dir_arg = dir.to_string_lossy().to_string();\n\n    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            let url = out.stdout_trimmed();\n            let id = slug(&url);\n            if !id.is_empty() {\n                return (id, display_from_url(&url));\n            }\n        }\n    }\n\n    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            if let Some(name) = Path::new(&out.stdout_trimmed())\n                .file_name()\n                .map(|n| n.to_string_lossy().to_string())\n            {\n                let id = slug(&name);\n                if !id.is_empty() {\n                    return (id, name);\n                }\n            }\n        }\n    }\n\n    // 3. The directory's own folder name.\n    let name = dir\n        .file_name()\n        .map(|n| n.to_string_lossy().to_string())\n        .unwrap_or_default();\n    let id = if name.is_empty() { String::new() } else { slug(&name) };\n    if id.is_empty() {\n…\n    } else {\n…\n    }\n}\n\n[Showing lines 54-138 of 220. Use :139 to continue]"}],"details":{"truncation":{"content":"        out.pop();\r\n    }\r\n    out\r\n}\r\n\r\n/// Derive the `project_id` for a directory inside (or being) a project.\r\n/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\r\n/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\r\n/// a broken repo must not stall context routing.\r\n// [impl->REQ-STORE-1]\r\npub fn project_id_for_dir(dir: &Path) -> String {\r\n    project_id_and_display_for_dir(dir).0\r\n}\r\n\r\n/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\r\n/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\r\n/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\r\n/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\r\n/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\r\nfn display_from_url(url: &str) -> String {\r\n    let s = url.trim().trim_end_matches('/');\r\n    let s = s.strip_suffix(\".git\").unwrap_or(s);\r\n    // Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).\r\n    let tail = s.rsplit(['/', ':']).next().unwrap_or(s);\r\n    if tail.is_empty() {\r\n        slug(url)\r\n    } else {\r\n        tail.to_string()\r\n    }\r\n}\r\n\r\n/// Derive BOTH the `project_id` (the cross-machine KEY, slugged) and a friendly\r\n/// DISPLAY name for a directory, in ONE git-invocation pass (same ladder as the\r\n/// id). The display is human-recognizable — the remote URL's last path segment,\r\n/// else the git-toplevel folder, else the dir's own folder name — so a picker /\r\n/// list surface can render `spt-core` while keying on the `github-com-…` slug\r\n/// (REQ-PICKER-PROJECT-DISPLAY-NAME). A store-only caller with no dir renders the\r\n/// id verbatim (this fn is only reached with a real dir).\r\n// [impl->REQ-STORE-1] [impl->REQ-PICKER-PROJECT-DISPLAY-NAME]\r\npub fn project_id_and_display_for_dir(dir: &Path) -> (String, String) {\r\n    let dir_arg = dir.to_string_lossy().to_string();\r\n\r\n    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\r\n    if let Ok(out) = run_git(\r\n        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\r\n        None,\r\n        None,\r\n        PROJECT_GIT_TIMEOUT,\r\n    ) {\r\n        if out.success() {\r\n            let url = out.stdout_trimmed();\r\n            let id = slug(&url);\r\n            if !id.is_empty() {\r\n                return (id, display_from_url(&url));\r\n            }\r\n        }\r\n    }\r\n\r\n    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\r\n    if let Ok(out) = run_git(\r\n        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\r\n        None,\r\n        None,\r\n        PROJECT_GIT_TIMEOUT,\r\n    ) {\r\n        if out.success() {\r\n            if let Some(name) = Path::new(&out.stdout_trimmed())\r\n                .file_name()\r\n                .map(|n| n.to_string_lossy().to_string())\r\n            {\r\n                let id = slug(&name);\r\n                if !id.is_empty() {\r\n                    return (id, name);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // 3. The directory's own folder name.\r\n    let name = dir\r\n        .file_name()\r\n        .map(|n| n.to_string_lossy().to_string())\r\n        .unwrap_or_default();\r\n    let id = if name.is_empty() { String::new() } else { slug(&name) };\r\n    if id.is_empty() {\r","truncated":true,"truncatedBy":"lines","totalLines":167,"totalBytes":3359,"outputLines":85,"outputBytes":3359,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn slug(raw: &str) -> String {\n…\n    while out.ends_with('-') {\n        out.pop();\r\n    }\r\n    out\r\n}\r\n\r\n/// Derive the `project_id` for a directory inside (or being) a project.\r\n/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\r\n/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\r\n/// a broken repo must not stall context routing.\r\n// [impl->REQ-STORE-1]\r\npub fn project_id_for_dir(dir: &Path) -> String {\r\n    project_id_and_display_for_dir(dir).0\r\n}\r\n\r\n/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\r\n/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\r\n/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\r\n/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\r\n/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\r\nfn display_from_url(url: &str) -> String {\r\n    let s = url.trim().trim_end_matches('/');\r\n    let s = s.strip_suffix(\".git\").unwrap_or(s);\r\n    // Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).\r\n    let tail = s.rsplit(['/', ':']).next().unwrap_or(s);\r\n    if tail.is_empty() {\r\n        slug(url)\r\n    } else {\r\n        tail.to_string()\r\n    }\r\n}\r\n\r\n/// Derive BOTH the `project_id` (the cross-machine KEY, slugged) and a friendly\r\n/// DISPLAY name for a directory, in ONE git-invocation pass (same ladder as the\r\n/// id). The display is human-recognizable — the remote URL's last path segment,\r\n/// else the git-toplevel folder, else the dir's own folder name — so a picker /\r\n/// list surface can render `spt-core` while keying on the `github-com-…` slug\r\n/// (REQ-PICKER-PROJECT-DISPLAY-NAME). A store-only caller with no dir renders the\r\n/// id verbatim (this fn is only reached with a real dir).\r\n// [impl->REQ-STORE-1] [impl->REQ-PICKER-PROJECT-DISPLAY-NAME]\r\npub fn project_id_and_display_for_dir(dir: &Path) -> (String, String) {\r\n    let dir_arg = dir.to_string_lossy().to_string();\r\n\r\n    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\r\n    if let Ok(out) = run_git(\r\n        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\r\n        None,\r\n        None,\r\n        PROJECT_GIT_TIMEOUT,\r\n    ) {\r\n        if out.success() {\r\n            let url = out.stdout_trimmed();\r\n            let id = slug(&url);\r\n            if !id.is_empty() {\r\n                return (id, display_from_url(&url));\r\n            }\r\n        }\r\n    }\r\n\r\n    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\r\n    if let Ok(out) = run_git(\r\n        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\r\n        None,\r\n        None,\r\n        PROJECT_GIT_TIMEOUT,\r\n    ) {\r\n        if out.success() {\r\n            if let Some(name) = Path::new(&out.stdout_trimmed())\r\n                .file_name()\r\n                .map(|n| n.to_string_lossy().to_string())\r\n            {\r\n                let id = slug(&name);\r\n                if !id.is_empty() {\r\n                    return (id, name);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // 3. The directory's own folder name.\r\n    let name = dir\r\n        .file_name()\r\n        .map(|n| n.to_string_lossy().to_string())\r\n        .unwrap_or_default();\r\n    let id = if name.is_empty() { String::new() } else { slug(&name) };\r\n    if id.is_empty() {\r\n…\n    } else {\n…\n    }\n}","startLine":29,"lineNumbers":[29,null,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,null,140,null,142,143]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\project.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":220,"totalBytes":3359,"outputLines":85,"outputBytes":3359,"shownRange":{"start":54,"end":138},"nextOffset":139}}},"isError":false,"timestamp":1784293386772}}
{"type":"message","id":"e0994cb2","parentId":"0523dc60","timestamp":"2026-07-17T13:03:06.774Z","message":{"role":"toolResult","toolCallId":"call_CZV3jxLvYHTc8TKHDsrJ8zrs|fc_034a6be5a6696b6c016a5a280a23148191a7015b1f57b7cf26","toolName":"glob","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n## mobile-gw/\nsessions.log\n## todlando/\nsessions.log\n## doyle/\nsessions.log\n## lia/\nsessions.log\n## webbie/\nsessions.log\n## gaki-normal-probe/\nsessions.log\n## perri/\nsessions.log\n## hertz/\nsessions.log\n## emphasys/\nsessions.log\n## deployah/\nsessions.log\n## flynn/\nsessions.log\n## chert/\nsessions.log\n## wakep9/\nsessions.log"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery","fileCount":13,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/lia/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/webbie/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/chert/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/sessions.log"],"truncated":false,"cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core"},"isError":false,"timestamp":1784293386774}}
{"type":"message","id":"4fad898e","parentId":"e0994cb2","timestamp":"2026-07-17T13:03:06.781Z","message":{"role":"toolResult","toolCallId":"call_ZBKlG1SGQFkkJNCsgbLwbZk7|fc_034a6be5a6696b6c016a5a280a232481919bbdd975a9a6899a","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## chert/\n### sessions.log\n*1|{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n*2|{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n\n## deployah/\n### sessions.log\n*1|{\"ts\":\"2026-07-07T05:12:52Z\",\"session_id\":\"8f826b4f-918e-401c-9a34-b55939a457d1\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T05:57:29Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T10:22:44Z\",\"session_id\":\"2592511f-8de4-4da3-bbe8-764cffdff6ec\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T10:22:49Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-07T10:37:24Z\",\"session_id\":\"c153f95c-3776-40c9-8faa-bdc24d5be72f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-08T00:57:42Z\",\"session_id\":\"5b3a2381-5e45-4f9a-8543-4c5f5009c468\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-08T04:36:16Z\",\"session_id\":\"86995925-9f01-4044-9d8f-c1ede418396c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-08T11:09:27Z\",\"session_id\":\"b8785184-d487-4bba-9217-84d045b5c5d5\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-09T04:07:55Z\",\"session_id\":\"b317273f-decf-492f-b6d7-a5558a360cdf\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-09T12:23:33Z\",\"session_id\":\"41b1b5f7-6040-4af3-9d83-9336ab847866\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-09T22:53:02Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T12:16:37Z\",\"session_id\":\"67679d05-54bd-46d2-8d3c-1e7ac2231869\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-10T12:16:38Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-10T13:02:34Z\",\"session_id\":\"a053d1d6-5b05-4f34-a3ff-15b7269b7675\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15|{\"ts\":\"2026-07-15T03:25:15Z\",\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n\n## doyle/\n### sessions.log\n*1|{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n\n## emphasys/\n### sessions.log\n*1|{\"ts\":\"2026-07-15T09:59:11Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":0,\"adapter\":\"omp-spt\"}\n*2|{\"ts\":\"2026-07-15T09:59:12Z\",\"session_id\":\"sess-40004-1784109552609931400\",\"trigger\":\"boot\",\"ordinal\":1,\"adapter\":\"omp-spt\"}\n*3|{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":2,\"adapter\":\"omp-spt\"}\n*4|{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"sess-33500-1784111367400174200\",\"trigger\":\"boot\",\"ordinal\":3,\"adapter\":\"omp-spt\"}\n*5|{\"ts\":\"2026-07-15T11:14:59Z\",\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":4,\"adapter\":\"omp-spt\"}\n\n## flynn/\n### sessions.log\n*1|{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n*3|{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n*4|{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n*5|{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n*6|{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n*7|{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n*8|{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n*9|{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10|{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11|{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## gaki-normal-probe/\n### sessions.log\n*1|{\"ts\":\"2026-07-16T11:15:02Z\",\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n\n## hertz/\n### sessions.log\n*1|{\"ts\":\"2026-07-10T03:09:05Z\",\"session_id\":\"sess-49664-1783652945861946300\",\"trigger\":\"boot\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-10T03:09:14Z\",\"session_id\":\"sess-57128-1783652954227634400\",\"trigger\":\"boot\",\"ordinal\":1}\n*3|{\"ts\":\"2026-07-10T03:09:23Z\",\"session_id\":\"sess-59652-1783652963828614600\",\"trigger\":\"boot\",\"ordinal\":2}\n*4|{\"ts\":\"2026-07-10T03:47:11Z\",\"session_id\":\"sess-64940-1783655231977229600\",\"trigger\":\"boot\",\"ordinal\":3}\n*5|{\"ts\":\"2026-07-10T03:48:30Z\",\"session_id\":\"sess-45624-1783655310056470400\",\"trigger\":\"boot\",\"ordinal\":4}\n*6|{\"ts\":\"2026-07-10T03:55:41Z\",\"session_id\":\"sess-79964-1783655741522321600\",\"trigger\":\"boot\",\"ordinal\":5}\n*7|{\"ts\":\"2026-07-10T03:56:52Z\",\"session_id\":\"sess-67680-1783655812329316200\",\"trigger\":\"boot\",\"ordinal\":6}\n*8|{\"ts\":\"2026-07-10T03:57:21Z\",\"session_id\":\"sess-49640-1783655841133432300\",\"trigger\":\"boot\",\"ordinal\":7}\n*9|{\"ts\":\"2026-07-10T03:57:52Z\",\"session_id\":\"sess-52628-1783655872037490700\",\"trigger\":\"boot\",\"ordinal\":8}\n*10|{\"ts\":\"2026-07-10T03:59:38Z\",\"session_id\":\"sess-57188-1783655978136495600\",\"trigger\":\"boot\",\"ordinal\":9}\n*11|{\"ts\":\"2026-07-10T03:59:55Z\",\"session_id\":\"sess-36976-1783655995507652300\",\"trigger\":\"boot\",\"ordinal\":10}\n*12|{\"ts\":\"2026-07-10T04:00:07Z\",\"session_id\":\"sess-38024-1783656007605696700\",\"trigger\":\"boot\",\"ordinal\":11}\n*13|{\"ts\":\"2026-07-10T04:00:14Z\",\"session_id\":\"sess-46120-1783656014981806400\",\"trigger\":\"boot\",\"ordinal\":12}\n*14|{\"ts\":\"2026-07-10T04:00:26Z\",\"session_id\":\"sess-77220-1783656026228588600\",\"trigger\":\"boot\",\"ordinal\":13}\n*15|{\"ts\":\"2026-07-10T04:00:37Z\",\"session_id\":\"sess-44820-1783656037158237600\",\"trigger\":\"boot\",\"ordinal\":14}\n*16|{\"ts\":\"2026-07-10T04:00:46Z\",\"session_id\":\"sess-47160-1783656046664586700\",\"trigger\":\"boot\",\"ordinal\":15}\n*17|{\"ts\":\"2026-07-10T04:03:48Z\",\"session_id\":\"sess-29624-1783656228813745900\",\"trigger\":\"boot\",\"ordinal\":16}\n*18|{\"ts\":\"2026-07-10T04:05:04Z\",\"session_id\":\"sess-56784-1783656304075360500\",\"trigger\":\"boot\",\"ordinal\":17}\n*19|{\"ts\":\"2026-07-10T04:06:17Z\",\"session_id\":\"sess-75108-1783656377065211600\",\"trigger\":\"boot\",\"ordinal\":18}\n*20|{\"ts\":\"2026-07-10T04:09:14Z\",\"session_id\":\"sess-45376-1783656554208398900\",\"trigger\":\"boot\",\"ordinal\":19}\n\n## lia/\n### sessions.log\n*1|{\"ts\":\"2026-07-08T04:27:46Z\",\"session_id\":\"e6e84eb4-8b78-4a2d-95ff-0cd81e88fd41\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n*2|{\"ts\":\"2026-07-08T05:03:53Z\",\"session_id\":\"12bbfad8-2f30-4983-a3a3-bcb05ad4c577\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n*3|{\"ts\":\"2026-07-08T12:09:46Z\",\"session_id\":\"f4df7cba-aae5-46c6-aa4f-50d2fb874894\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":2,\"adapter\":\"claude-spt\"}\n*4|{\"ts\":\"2026-07-15T10:16:32Z\",\"session_id\":\"3d75265c-0071-44a0-98fa-3d748c66b87f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":3,\"adapter\":\"claude-spt\"}\n*5|{\"ts\":\"2026-07-15T10:22:26Z\",\"session_id\":\"43f1483b-0bfd-4ecb-88de-ad7f27bb52ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":4,\"adapter\":\"claude-spt\"}\n*6|{\"ts\":\"2026-07-16T00:42:33Z\",\"session_id\":\"59cfcf11-f9d7-4967-a9bc-8892efb0f320\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":5,\"adapter\":\"claude-spt\"}\n*7|{\"ts\":\"2026-07-16T00:42:42Z\",\"session_id\":\"ce1773f5-5e4a-41c9-8ee8-86700bc961c0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":6,\"adapter\":\"claude-spt\"}\n*8|{\"ts\":\"2026-07-16T00:43:32Z\",\"session_id\":\"6389a46d-930f-4662-b560-293532307149\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":7,\"adapter\":\"claude-spt\"}\n*9|{\"ts\":\"2026-07-16T14:13:17Z\",\"session_id\":\"7818eabc-d26c-4a0b-965c-b600016f1cea\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":8,\"adapter\":\"claude-spt\"}\n*10|{\"ts\":\"2026-07-16T14:13:52Z\",\"session_id\":\"9e0df17e-f217-4446-97a4-f528a56024ba\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":9,\"adapter\":\"claude-spt\"}\n*11|{\"ts\":\"2026-07-16T21:01:40Z\",\"session_id\":\"bf353802-556c-46ce-9865-e74a3092bbe9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":10,\"adapter\":\"claude-spt\"}\n*12|{\"ts\":\"2026-07-17T01:09:26Z\",\"session_id\":\"fc582bea-2d15-4077-b21a-086cbcbe3cee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13|{\"ts\":\"2026-07-17T01:16:00Z\",\"session_id\":\"5106270b-52d7-4a87-b78c-4edc06911b25\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n\n## mobile-gw/\n### sessions.log\n*1|{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}\n*2|{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}\n*3|{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}\n*4|{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}\n*5|{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}\n*6|{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}\n*7|{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6,\"adapter\":\"mobile\"}\n*8|{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n*9|{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n*10|{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n*11|{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n*12|{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n*13|{\"ts\":\"2026-07-08T03:22:32Z\",\"session_id\":\"spt-mobile-host-182524\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"mobile\"}\n*14|{\"ts\":\"2026-07-08T04:32:56Z\",\"session_id\":\"spt-mobile-host-60956\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"mobile\"}\n*15|{\"ts\":\"2026-07-08T10:59:20Z\",\"session_id\":\"spt-mobile-host-162676\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"mobile\"}\n*16|{\"ts\":\"2026-07-08T11:00:23Z\",\"session_id\":\"spt-mobile-host-103160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"mobile\"}\n*17|{\"ts\":\"2026-07-09T05:25:35Z\",\"session_id\":\"spt-mobile-host-179368\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"mobile\"}\n*18|{\"ts\":\"2026-07-09T07:56:17Z\",\"session_id\":\"spt-mobile-host-79536\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":17,\"adapter\":\"mobile\"}\n*19|{\"ts\":\"2026-07-09T07:59:04Z\",\"session_id\":\"spt-mobile-host-143376\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":18,\"adapter\":\"mobile\"}\n*20|{\"ts\":\"2026-07-09T08:01:16Z\",\"session_id\":\"spt-mobile-host-35852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"mobile\"}\n\n## perri/\n### sessions.log\n*1|{\"ts\":\"2026-07-07T05:13:29Z\",\"session_id\":\"d5b46b36-ff77-4131-a774-17f6caa2ff35\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T06:07:05Z\",\"session_id\":\"6db151cc-515e-4fdf-8fe7-9f98697b588b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T07:42:34Z\",\"session_id\":\"4c5e8257-ef66-4c12-a154-a6f83bdab25a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T10:23:14Z\",\"session_id\":\"13712404-60aa-4dc9-957b-9e854ac0f73d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-08T06:53:12Z\",\"session_id\":\"efdcbb37-8805-4cc2-9d17-ecc2f85984ce\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-08T09:40:38Z\",\"session_id\":\"6ea67f9d-c88a-454a-b88a-a0e4add41ba8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-08T11:14:36Z\",\"session_id\":\"bdc2d185-002c-43fb-9aa7-953755172bb8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-08T17:04:51Z\",\"session_id\":\"0841835d-f331-4ec7-abcd-af2ba0217cd0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-09T02:04:08Z\",\"session_id\":\"9f809150-e92c-474b-8ff6-ee237b441071\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-09T06:43:58Z\",\"session_id\":\"57495b6e-3f65-40bd-b9b7-a7177ccb8a8d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-09T12:42:29Z\",\"session_id\":\"3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T06:08:38Z\",\"session_id\":\"175d35a3-4eca-4ac8-8885-261f29f277ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13|{\"ts\":\"2026-07-10T08:39:26Z\",\"session_id\":\"0fe6cad5-3efb-4ced-8031-d9a41e22ff81\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n*14|{\"ts\":\"2026-07-10T11:22:29Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15|{\"ts\":\"2026-07-10T11:40:23Z\",\"session_id\":\"5c76a64f-45cd-41c9-952e-158341e9ca7d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":14,\"adapter\":\"claude-spt\"}\n*16|{\"ts\":\"2026-07-10T11:44:34Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"claude-spt\"}\n*17|{\"ts\":\"2026-07-10T12:01:52Z\",\"session_id\":\"26c49822-00bc-4abe-8be2-91f44b9e4fea\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"claude-spt\"}\n*18|{\"ts\":\"2026-07-10T13:14:15Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-10T15:33:32Z\",\"session_id\":\"5377b23a-8a93-4a9a-8cd2-73d2c26c87b6\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-10T15:34:35Z\",\"session_id\":\"b8f52b79-a26c-444b-bf0e-f3734d431e69\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## todlando/\n### sessions.log\n*1|{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-07T12:03:43Z\",\"session_id\":\"0ba7dcfd-be8d-4493-bcea-556930f4b70e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-07T12:25:25Z\",\"session_id\":\"3af96f92-b814-4c95-a1c1-33eeee615e34\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-07T15:40:04Z\",\"session_id\":\"a087cf04-b034-4517-bd05-f6649005505a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-07T21:15:22Z\",\"session_id\":\"25677501-2853-4e15-a6bc-dfac88dc673d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-08T01:02:55Z\",\"session_id\":\"de244f53-27c7-4ac7-ab09-d2e7c1cd7326\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-08T17:24:12Z\",\"session_id\":\"d57f9218-f4d0-4670-98d6-3d250517fe8f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-09T04:08:28Z\",\"session_id\":\"6b275a1d-9aa1-44d8-9617-a53a2562baca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-09T07:27:25Z\",\"session_id\":\"b76d3b71-a821-490b-bd8d-9b2cf1bf2717\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-09T10:11:53Z\",\"session_id\":\"49b8a14d-a9f3-4adf-9117-09086762be80\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-09T10:11:55Z\",\"session_id\":\"63fa684a-a93e-4405-a6c5-115f9bccac2a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-09T12:27:04Z\",\"session_id\":\"865cf2a3-f778-49e0-9934-af011cdf38e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-09T13:18:40Z\",\"session_id\":\"1078a652-2825-493a-904e-d11e678e8f0c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-09T14:23:04Z\",\"session_id\":\"c86c5100-c27b-41ff-a2c0-3f42102676ef\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-09T23:23:51Z\",\"session_id\":\"6545f400-48ee-481a-84f6-8b345a202853\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## wakep9/\n### sessions.log\n*1|{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}\n\n## webbie/\n### sessions.log\n*1|{\"ts\":\"2026-07-16T23:51:06Z\",\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":159,"fileCount":13,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/chert/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/deployah/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/lia/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/webbie/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/chert/sessions.log","count":2},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/deployah/sessions.log","count":15},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/emphasys/sessions.log","count":5},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/gaki-normal-probe/sessions.log","count":1},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/lia/sessions.log","count":13},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/sessions.log","count":2},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/sessions.log","count":1}],"truncated":true,"perFileLimitReached":20,"displayContent":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## chert/\n### sessions.log\n*1│{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n*2│{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n\n## deployah/\n### sessions.log\n *1│{\"ts\":\"2026-07-07T05:12:52Z\",\"session_id\":\"8f826b4f-918e-401c-9a34-b55939a457d1\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T05:57:29Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T10:22:44Z\",\"session_id\":\"2592511f-8de4-4da3-bbe8-764cffdff6ec\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T10:22:49Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-07T10:37:24Z\",\"session_id\":\"c153f95c-3776-40c9-8faa-bdc24d5be72f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-08T00:57:42Z\",\"session_id\":\"5b3a2381-5e45-4f9a-8543-4c5f5009c468\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-08T04:36:16Z\",\"session_id\":\"86995925-9f01-4044-9d8f-c1ede418396c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-08T11:09:27Z\",\"session_id\":\"b8785184-d487-4bba-9217-84d045b5c5d5\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-09T04:07:55Z\",\"session_id\":\"b317273f-decf-492f-b6d7-a5558a360cdf\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-09T12:23:33Z\",\"session_id\":\"41b1b5f7-6040-4af3-9d83-9336ab847866\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-09T22:53:02Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T12:16:37Z\",\"session_id\":\"67679d05-54bd-46d2-8d3c-1e7ac2231869\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-10T12:16:38Z\",\"session_id\":\"a54257af-8b81-456c-ba38-85739f7f10e9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-10T13:02:34Z\",\"session_id\":\"a053d1d6-5b05-4f34-a3ff-15b7269b7675\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15│{\"ts\":\"2026-07-15T03:25:15Z\",\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n\n## doyle/\n### sessions.log\n *1│{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n\n## emphasys/\n### sessions.log\n*1│{\"ts\":\"2026-07-15T09:59:11Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":0,\"adapter\":\"omp-spt\"}\n*2│{\"ts\":\"2026-07-15T09:59:12Z\",\"session_id\":\"sess-40004-1784109552609931400\",\"trigger\":\"boot\",\"ordinal\":1,\"adapter\":\"omp-spt\"}\n*3│{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"019f6537-4c71-7000-ab57-ab0d86e9d0a2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":2,\"adapter\":\"omp-spt\"}\n*4│{\"ts\":\"2026-07-15T10:29:27Z\",\"session_id\":\"sess-33500-1784111367400174200\",\"trigger\":\"boot\",\"ordinal\":3,\"adapter\":\"omp-spt\"}\n*5│{\"ts\":\"2026-07-15T11:14:59Z\",\"session_id\":\"019f657c-b509-7000-86f2-0cc67e63a2b7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":4,\"adapter\":\"omp-spt\"}\n\n## flynn/\n### sessions.log\n *1│{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n *2│{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n *3│{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n *4│{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n *5│{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n *6│{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n *7│{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n *8│{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n *9│{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10│{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11│{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## gaki-normal-probe/\n### sessions.log\n*1│{\"ts\":\"2026-07-16T11:15:02Z\",\"session_id\":\"e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n\n## hertz/\n### sessions.log\n *1│{\"ts\":\"2026-07-10T03:09:05Z\",\"session_id\":\"sess-49664-1783652945861946300\",\"trigger\":\"boot\",\"ordinal\":0}\n *2│{\"ts\":\"2026-07-10T03:09:14Z\",\"session_id\":\"sess-57128-1783652954227634400\",\"trigger\":\"boot\",\"ordinal\":1}\n *3│{\"ts\":\"2026-07-10T03:09:23Z\",\"session_id\":\"sess-59652-1783652963828614600\",\"trigger\":\"boot\",\"ordinal\":2}\n *4│{\"ts\":\"2026-07-10T03:47:11Z\",\"session_id\":\"sess-64940-1783655231977229600\",\"trigger\":\"boot\",\"ordinal\":3}\n *5│{\"ts\":\"2026-07-10T03:48:30Z\",\"session_id\":\"sess-45624-1783655310056470400\",\"trigger\":\"boot\",\"ordinal\":4}\n *6│{\"ts\":\"2026-07-10T03:55:41Z\",\"session_id\":\"sess-79964-1783655741522321600\",\"trigger\":\"boot\",\"ordinal\":5}\n *7│{\"ts\":\"2026-07-10T03:56:52Z\",\"session_id\":\"sess-67680-1783655812329316200\",\"trigger\":\"boot\",\"ordinal\":6}\n *8│{\"ts\":\"2026-07-10T03:57:21Z\",\"session_id\":\"sess-49640-1783655841133432300\",\"trigger\":\"boot\",\"ordinal\":7}\n *9│{\"ts\":\"2026-07-10T03:57:52Z\",\"session_id\":\"sess-52628-1783655872037490700\",\"trigger\":\"boot\",\"ordinal\":8}\n*10│{\"ts\":\"2026-07-10T03:59:38Z\",\"session_id\":\"sess-57188-1783655978136495600\",\"trigger\":\"boot\",\"ordinal\":9}\n*11│{\"ts\":\"2026-07-10T03:59:55Z\",\"session_id\":\"sess-36976-1783655995507652300\",\"trigger\":\"boot\",\"ordinal\":10}\n*12│{\"ts\":\"2026-07-10T04:00:07Z\",\"session_id\":\"sess-38024-1783656007605696700\",\"trigger\":\"boot\",\"ordinal\":11}\n*13│{\"ts\":\"2026-07-10T04:00:14Z\",\"session_id\":\"sess-46120-1783656014981806400\",\"trigger\":\"boot\",\"ordinal\":12}\n*14│{\"ts\":\"2026-07-10T04:00:26Z\",\"session_id\":\"sess-77220-1783656026228588600\",\"trigger\":\"boot\",\"ordinal\":13}\n*15│{\"ts\":\"2026-07-10T04:00:37Z\",\"session_id\":\"sess-44820-1783656037158237600\",\"trigger\":\"boot\",\"ordinal\":14}\n*16│{\"ts\":\"2026-07-10T04:00:46Z\",\"session_id\":\"sess-47160-1783656046664586700\",\"trigger\":\"boot\",\"ordinal\":15}\n*17│{\"ts\":\"2026-07-10T04:03:48Z\",\"session_id\":\"sess-29624-1783656228813745900\",\"trigger\":\"boot\",\"ordinal\":16}\n*18│{\"ts\":\"2026-07-10T04:05:04Z\",\"session_id\":\"sess-56784-1783656304075360500\",\"trigger\":\"boot\",\"ordinal\":17}\n*19│{\"ts\":\"2026-07-10T04:06:17Z\",\"session_id\":\"sess-75108-1783656377065211600\",\"trigger\":\"boot\",\"ordinal\":18}\n*20│{\"ts\":\"2026-07-10T04:09:14Z\",\"session_id\":\"sess-45376-1783656554208398900\",\"trigger\":\"boot\",\"ordinal\":19}\n\n## lia/\n### sessions.log\n *1│{\"ts\":\"2026-07-08T04:27:46Z\",\"session_id\":\"e6e84eb4-8b78-4a2d-95ff-0cd81e88fd41\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":0,\"adapter\":\"claude-spt\"}\n *2│{\"ts\":\"2026-07-08T05:03:53Z\",\"session_id\":\"12bbfad8-2f30-4983-a3a3-bcb05ad4c577\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":1,\"adapter\":\"claude-spt\"}\n *3│{\"ts\":\"2026-07-08T12:09:46Z\",\"session_id\":\"f4df7cba-aae5-46c6-aa4f-50d2fb874894\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\liaison\",\"ordinal\":2,\"adapter\":\"claude-spt\"}\n *4│{\"ts\":\"2026-07-15T10:16:32Z\",\"session_id\":\"3d75265c-0071-44a0-98fa-3d748c66b87f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":3,\"adapter\":\"claude-spt\"}\n *5│{\"ts\":\"2026-07-15T10:22:26Z\",\"session_id\":\"43f1483b-0bfd-4ecb-88de-ad7f27bb52ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":4,\"adapter\":\"claude-spt\"}\n *6│{\"ts\":\"2026-07-16T00:42:33Z\",\"session_id\":\"59cfcf11-f9d7-4967-a9bc-8892efb0f320\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":5,\"adapter\":\"claude-spt\"}\n *7│{\"ts\":\"2026-07-16T00:42:42Z\",\"session_id\":\"ce1773f5-5e4a-41c9-8ee8-86700bc961c0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":6,\"adapter\":\"claude-spt\"}\n *8│{\"ts\":\"2026-07-16T00:43:32Z\",\"session_id\":\"6389a46d-930f-4662-b560-293532307149\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":7,\"adapter\":\"claude-spt\"}\n *9│{\"ts\":\"2026-07-16T14:13:17Z\",\"session_id\":\"7818eabc-d26c-4a0b-965c-b600016f1cea\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":8,\"adapter\":\"claude-spt\"}\n*10│{\"ts\":\"2026-07-16T14:13:52Z\",\"session_id\":\"9e0df17e-f217-4446-97a4-f528a56024ba\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":9,\"adapter\":\"claude-spt\"}\n*11│{\"ts\":\"2026-07-16T21:01:40Z\",\"session_id\":\"bf353802-556c-46ce-9865-e74a3092bbe9\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":10,\"adapter\":\"claude-spt\"}\n*12│{\"ts\":\"2026-07-17T01:09:26Z\",\"session_id\":\"fc582bea-2d15-4077-b21a-086cbcbe3cee\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13│{\"ts\":\"2026-07-17T01:16:00Z\",\"session_id\":\"5106270b-52d7-4a87-b78c-4edc06911b25\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n\n## mobile-gw/\n### sessions.log\n *1│{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}\n *2│{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}\n *3│{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}\n *4│{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}\n *5│{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}\n *6│{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}\n *7│{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6,\"adapter\":\"mobile\"}\n *8│{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n *9│{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n*10│{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n*11│{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n*12│{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n*13│{\"ts\":\"2026-07-08T03:22:32Z\",\"session_id\":\"spt-mobile-host-182524\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"mobile\"}\n*14│{\"ts\":\"2026-07-08T04:32:56Z\",\"session_id\":\"spt-mobile-host-60956\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"mobile\"}\n*15│{\"ts\":\"2026-07-08T10:59:20Z\",\"session_id\":\"spt-mobile-host-162676\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"mobile\"}\n*16│{\"ts\":\"2026-07-08T11:00:23Z\",\"session_id\":\"spt-mobile-host-103160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"mobile\"}\n*17│{\"ts\":\"2026-07-09T05:25:35Z\",\"session_id\":\"spt-mobile-host-179368\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"mobile\"}\n*18│{\"ts\":\"2026-07-09T07:56:17Z\",\"session_id\":\"spt-mobile-host-79536\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":17,\"adapter\":\"mobile\"}\n*19│{\"ts\":\"2026-07-09T07:59:04Z\",\"session_id\":\"spt-mobile-host-143376\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":18,\"adapter\":\"mobile\"}\n*20│{\"ts\":\"2026-07-09T08:01:16Z\",\"session_id\":\"spt-mobile-host-35852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"mobile\"}\n\n## perri/\n### sessions.log\n *1│{\"ts\":\"2026-07-07T05:13:29Z\",\"session_id\":\"d5b46b36-ff77-4131-a774-17f6caa2ff35\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T06:07:05Z\",\"session_id\":\"6db151cc-515e-4fdf-8fe7-9f98697b588b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T07:42:34Z\",\"session_id\":\"4c5e8257-ef66-4c12-a154-a6f83bdab25a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T10:23:14Z\",\"session_id\":\"13712404-60aa-4dc9-957b-9e854ac0f73d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-08T06:53:12Z\",\"session_id\":\"efdcbb37-8805-4cc2-9d17-ecc2f85984ce\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-08T09:40:38Z\",\"session_id\":\"6ea67f9d-c88a-454a-b88a-a0e4add41ba8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-08T11:14:36Z\",\"session_id\":\"bdc2d185-002c-43fb-9aa7-953755172bb8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-08T17:04:51Z\",\"session_id\":\"0841835d-f331-4ec7-abcd-af2ba0217cd0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-09T02:04:08Z\",\"session_id\":\"9f809150-e92c-474b-8ff6-ee237b441071\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-09T06:43:58Z\",\"session_id\":\"57495b6e-3f65-40bd-b9b7-a7177ccb8a8d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-09T12:42:29Z\",\"session_id\":\"3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T06:08:38Z\",\"session_id\":\"175d35a3-4eca-4ac8-8885-261f29f277ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13│{\"ts\":\"2026-07-10T08:39:26Z\",\"session_id\":\"0fe6cad5-3efb-4ced-8031-d9a41e22ff81\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n*14│{\"ts\":\"2026-07-10T11:22:29Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15│{\"ts\":\"2026-07-10T11:40:23Z\",\"session_id\":\"5c76a64f-45cd-41c9-952e-158341e9ca7d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":14,\"adapter\":\"claude-spt\"}\n*16│{\"ts\":\"2026-07-10T11:44:34Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"claude-spt\"}\n*17│{\"ts\":\"2026-07-10T12:01:52Z\",\"session_id\":\"26c49822-00bc-4abe-8be2-91f44b9e4fea\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"claude-spt\"}\n*18│{\"ts\":\"2026-07-10T13:14:15Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-10T15:33:32Z\",\"session_id\":\"5377b23a-8a93-4a9a-8cd2-73d2c26c87b6\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-10T15:34:35Z\",\"session_id\":\"b8f52b79-a26c-444b-bf0e-f3734d431e69\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## todlando/\n### sessions.log\n *1│{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-07T12:03:43Z\",\"session_id\":\"0ba7dcfd-be8d-4493-bcea-556930f4b70e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-07T12:25:25Z\",\"session_id\":\"3af96f92-b814-4c95-a1c1-33eeee615e34\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-07T15:40:04Z\",\"session_id\":\"a087cf04-b034-4517-bd05-f6649005505a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-07T21:15:22Z\",\"session_id\":\"25677501-2853-4e15-a6bc-dfac88dc673d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-08T01:02:55Z\",\"session_id\":\"de244f53-27c7-4ac7-ab09-d2e7c1cd7326\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-08T17:24:12Z\",\"session_id\":\"d57f9218-f4d0-4670-98d6-3d250517fe8f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-09T04:08:28Z\",\"session_id\":\"6b275a1d-9aa1-44d8-9617-a53a2562baca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-09T07:27:25Z\",\"session_id\":\"b76d3b71-a821-490b-bd8d-9b2cf1bf2717\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-09T10:11:53Z\",\"session_id\":\"49b8a14d-a9f3-4adf-9117-09086762be80\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-09T10:11:55Z\",\"session_id\":\"63fa684a-a93e-4405-a6c5-115f9bccac2a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-09T12:27:04Z\",\"session_id\":\"865cf2a3-f778-49e0-9934-af011cdf38e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-09T13:18:40Z\",\"session_id\":\"1078a652-2825-493a-904e-d11e678e8f0c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-09T14:23:04Z\",\"session_id\":\"c86c5100-c27b-41ff-a2c0-3f42102676ef\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-09T23:23:51Z\",\"session_id\":\"6545f400-48ee-481a-84f6-8b345a202853\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n\n## wakep9/\n### sessions.log\n*1│{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}\n*2│{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}\n\n## webbie/\n### sessions.log\n*1│{\"ts\":\"2026-07-16T23:51:06Z\",\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293386781}}
{"type":"message","id":"6f369e49","parentId":"4fad898e","timestamp":"2026-07-17T13:03:06.784Z","message":{"role":"toolResult","toolCallId":"call_B2olHbGqxGGNx1UFAhvZyhLs|fc_034a6be5a6696b6c016a5a280a23308191a958f8dde6051624","toolName":"grep","content":[{"type":"text","text":" 1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1005|BRAIN_RESTART: planned update respawn (generation 1)\n 1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1007|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008|=== spt brain stderr — generation 1 — pid 76764 ===\n...\n 1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018|PUMP_IPC_READER: spawned\n*1019|PUMP_IPC_READER: spawned\n 1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":3,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":3}],"truncated":false,"displayContent":" 1004│CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19… wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1005│BRAIN_RESTART: planned update respawn (generation 1)\n 1006│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]\n 1007│CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d… wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1008│=== spt brain stderr — generation 1 — pid 76764 ===\n     │...\n 1017│CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n*1018│PUMP_IPC_READER: spawned\n*1019│PUMP_IPC_READER: spawned\n 1020│CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n 1021│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1022│CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293386784}}
{"type":"message","id":"2fcc9b69","parentId":"6f369e49","timestamp":"2026-07-17T13:03:24.691Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Estimating row count from grep output limits**\n\n**Analyzing git spawn overhead and recent_projects regression**"},{"type":"toolCall","id":"call_BeDgqPok8bJaMWVFT6ya0sNX|fc_034a6be5a6696b6c016a5a281c28fc819191f7708f27c3357e","name":"grep","arguments":{"i":"Finding recent project feature release","pattern":"recent_projects|GOSSIP-ADAPTER-PROJECTS|gossiped.*project|project IDs","path":"CHANGELOG.md;docs;.claude/reports","selector":null,"case":false,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_CoGrmGPNJNDf4Uw7LQKpy5DE|fc_034a6be5a6696b6c016a5a281c291481919bf9f83f5e266189","name":"read","arguments":{"i":"Reading project index cache rationale","path":"crates/spt-daemon/src/projwriter.rs","selector":"100-240"}},{"type":"toolCall","id":"call_GfrPv7bS7EJ1O2dCvCaTbpRM|fc_034a6be5a6696b6c016a5a281c291c81919af9fd3c1f968c5f","name":"grep","arguments":{"i":"Locating project cwd cache","pattern":"cwd_cache|project_id_and_display_for_dir|project_id_for_dir","path":"crates/spt-daemon/src/projwriter.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ESELkFLaDGWDUDOZHfs8t6Vk|fc_034a6be5a6696b6c016a5a281c292481918e29c6d4ad8ce983","name":"grep","arguments":{"i":"Finding registry round log markers","pattern":"SEED_ROTATED|REGISTRY_EVICT|REGISTRY_OFFLINE_EVICT|PUMP_PEER_FAIL","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1000-4898","case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":17525,"output":625,"cacheRead":177664,"cacheWrite":0,"totalTokens":195814,"reasoningTokens":339,"cost":{"input":0.08762500000000001,"output":0.01875,"cacheRead":0.088832,"cacheWrite":0,"total":0.19520700000000002}},"stopReason":"toolUse","timestamp":1784293386826,"responseId":"resp_034a6be5a6696b6c016a5a280b48e08191a9aaac80e55fc8dc","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a280d528c819197177e5aa51a4144","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWigc9LoP6Uff_Pdd4asK38RTZMqZ5i0gn0PLNgj1nvTT98II8-fpWvc5fHP1L01PyiJnt6SoD27sZ-OQ4gFDcJ9R2pYu8-MTp25eUVGhj2Vu13JyvL_oyq1RyCaPziGO3HCejZ-gBxSAY4583Vsog3Ohu-I1cjTnnPW1zIAMFxAInjpitJYvTpfi6ykQcoRM54mChpy-5QHD-5XpTBfdm-rzAAwtSlCIPnB1Kz7dqOSBOPDS-jyOEZJ3mhRDHqx51bGWqXmZDaTwludpiIwug9iGdNHF-WxgV6BafjwRAT5izZWmdIcEPuIA6A4Afpcv16hEJdYrDhGeW2I2-FrGs-7zlS-kZCQPivUmzvMq3eX4dbXVKEiuyFLvnjkWIUR7BUFQclmgLohjFPIyca4HfN2gSt6rP_QacNgZ-RjJ6YbYiGZSJbFx28sw9GOcPorBCFqd1S2ZFDRh6UBYYqcJ16Nt88B1j-8c2ZwRrvpYQcdpmsZ-M5nhlynzGLtO4kIQEIPcXmAFWueFDK93pDFO0lVz668ncv9uU0xNtdZDYHdcU1nlx8YCWAX5Rxk8eyVTH0cQJ8wDHkZdnTjrZTEfNbJzYXuBESi7vyFfP54zdSlAH1SXDRAPinWvjoyNoAW4x9nnMwHWEy0tIb-eqVQs7untf9ZOeIhJAbYkSjscaZ9e6Vzrl-krdcp7I4eBJh42CLar1-tYPwnIO8QouJe10fXisRfDe7moRnFu_A0zsYNCCDK8jbAn9jVm-rO2auH8oscH8QB_k-PT99IHpBPswKfdnkzNIQraGVXN-_5N_dGuPp7Tl4ZEIJoVpEEET7pgAm4Chih2Ts1Z6OXeq7RGXqpBZOJOH9e6jX0SdQVHucz0LT_qBznzRdSpI8Zm7iz23Sy0UgNWSXUuxnu7ytn7sFW7gWj4nkHcK85qWSuOdtrFpA52L03jFFFxkYLUaFbUDDqcdDdgfq5xdrpsLSPUlisMENhRwgKniZ6oQsgJ68N2QGPkAWHvZU_pn1MpNv3zwM5-CSgIro6HKBeLDvBKQTW4R4b-GZN3TohWHefDdLakqiRIHbEb6qSAm2bnsb5nLjCsUzUEvHEBIU8uzHWPZCdxboUAz95kK6ApMCp0xqWOqOZbpxnPpIhMNM1d2IxEJrvPbfA9F7UHI_C2J3AE8w1PuTT_T_K8U8sdc1Ul9CqFur9j6oNYW4w51TWDVQ88i3tOdNjcdLBq3o40os2dyJg5cvjRbG72frG--vVC0RuuzDCFyLWMyx9tBn38OiwByKb-NI2pyv4Oeyj7cOMbo6KJupZIp92scQmifUNVt_rsIujMVVbkhSHGj-V5kO5lgImCw2Tdv7vdNZsSVxVV2IH4kyYaRSlyO1I9nRaEGL-38apfuAY6i6hIx6IUtr9uSFoN6c74fosc67fh6YIsY8cSDa6wT4HD34DG6veorGM35uD-_2-wRYAUu3b_aT82nVVaNabIzDj_uXS8u9r2OH3rvTBMl0r_FQIvGEKZKTnSeDmwrDqzZMr43KRColP_T_-ab0xTXvmmSuN3zAWWYjwqJPlpC5OA9YvkWdC8jDJ5EzWHQT1a0dQn9J9sJq0zlkRbaIu-rC010ZuNBogJxy3fx45U_Q7lmPvbpaB-AWFkYAiI3_HFy4AaGZSwdBTdRIWr00pXubGVYSEDfcWq5BQJGE3sjCwb6RH7cqXyKMhNehS2heGGDPitk6YhJTTES7i8qU5t54MnJjftPtnvj7ZhslK7VDEdN9MqPvCMrf8QpCkDfbp3l2-kZ2P_sgRiwcGzE6QPC3PSp0J-v5PkHBKaVhUGjhjcDTx0pQozamSGUqN5QLI8zyAh0qpt3xowDGDgEqKLa4aIHSt9O8djW6MylM7xOwncYdhmB8_L4gksrdB3nYPhLXitLIp6_TVs2ysZGDPK5e3jKF21FxaZFN1IAvXEoDcNKHdsfYR45ocy17B3unZznzc8rIogsnqG9YzWcw0td-zrZc9Vm_ILHD007H_N74Vx4OSO3c7K6CiMCdbvmOmclQuvpV_m3CSEznBADju7vd10fdCRgyJEqWa7EesrKhD2PQEvCVzYQ3JORvmy8hjggl6Ib96AXOUfWinxqFQUHm8HQ4PDdpkJCvbxUFYLCkvxwR5GF1uiqaLu0oB5BU1zY48vs3rGSSPLEq_NMqWD-iTMg35sVXSjCNaf1T0lIWU5TLcPOqSEGcIf5aiM37ja0EtaFvpf6dVl6OX162oQvOQqk4HC3_quJTKWblqq2QRvnOxxDvW6o-4qYCLDoYCTep5ufxYj7uOIZZiUsh-AcZ_b52sWNkLaJ_tYKn2YkWMYh0607OsgsRhCJBodUawB_KNMVIv8tnvzY5hMZY4n3EBjmB52VcCt6zaJszrMieJ5cM1v5Clsd36ZDwUGm7nCFdG1VJzLHAoR6-D1nj3C46d9ksBXJ9OM_8oIlqHmndavQHcTbwVnxcfDjSDn5Iscvh5WoxYIpH9BOT9phNAYMVLbwa6LoL8OmU58n2A3hE5GgfbcCzEKgaZbcUfFxnxsxLHS4ps6hvFgPkgmmvhlnAmsOelDi29j83ECVc4Da3uAtwLt440KZFc4_Ge43JhUJs4Kp1ktYbMPLK50CZhMYuwfkss8yJVqVRJ16WeK14F5IoX2qKH10blvi38yLIltmFEEew6v7CpzHjoXNF0Sc6h3H7HKgr_Yc0BW-xOayjRWnpIvChmBmScE8eSeAx-ckK4KLWTWRaPCVYTlyr7CfqLmpS2amFMAVoaFiRjOsBrMHnzAKlLydPqEZe4-zNWr--CFSnAAZTZYMJyIlqSbTb_LIjC8Qma0GVQrV_YQ8x3Q8ikSnfHTW_JCNS4=","summary":[{"type":"summary_text","text":"**Estimating row count from grep output limits**"},{"type":"summary_text","text":"**Analyzing git spawn overhead and recent_projects regression**"}]},{"id":"fc_034a6be5a6696b6c016a5a281c28fc819191f7708f27c3357e","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding recent project feature release\",\"pattern\":\"recent_projects|GOSSIP-ADAPTER-PROJECTS|gossiped.*project|project IDs\",\"path\":\"CHANGELOG.md;docs;.claude/reports\",\"selector\":null,\"case\":false,\"gitignore\":false,\"skip\":null}","call_id":"call_BeDgqPok8bJaMWVFT6ya0sNX","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a281c291481919bf9f83f5e266189","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project index cache rationale\",\"path\":\"crates/spt-daemon/src/projwriter.rs\",\"selector\":\"100-240\"}","call_id":"call_CoGrmGPNJNDf4Uw7LQKpy5DE","name":"read"},{"id":"fc_034a6be5a6696b6c016a5a281c291c81919af9fd3c1f968c5f","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating project cwd cache\",\"pattern\":\"cwd_cache|project_id_and_display_for_dir|project_id_for_dir\",\"path\":\"crates/spt-daemon/src/projwriter.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_GfrPv7bS7EJ1O2dCvCaTbpRM","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a281c292481918e29c6d4ad8ce983","type":"function_call","status":"completed","arguments":"{\"i\":\"Finding registry round log markers\",\"pattern\":\"SEED_ROTATED|REGISTRY_EVICT|REGISTRY_OFFLINE_EVICT|PUMP_PEER_FAIL\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1000-4898\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_ESELkFLaDGWDUDOZHfs8t6Vk","name":"grep"}]},"duration":17850.47089999914,"ttft":2584.1642000079155,"contextSnapshot":{"promptTokens":195189,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_BeDgqPok8bJaMWVFT6ya0sNX|fc_034a6be5a6696b6c016a5a281c28fc819191f7708f27c3357e","toolName":"grep","startedAt":"2026-07-17T13:03:24.691Z","args":{"path":"CHANGELOG.md;docs;.claude/reports"},"intent":"Finding recent project feature release"},"id":"46f3adbc","parentId":"2fcc9b69","timestamp":"2026-07-17T13:03:24.691Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_CoGrmGPNJNDf4Uw7LQKpy5DE|fc_034a6be5a6696b6c016a5a281c291481919bf9f83f5e266189","toolName":"read","startedAt":"2026-07-17T13:03:24.692Z","args":{"path":"crates/spt-daemon/src/projwriter.rs"},"intent":"Reading project index cache rationale"},"id":"0121b620","parentId":"46f3adbc","timestamp":"2026-07-17T13:03:24.692Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_GfrPv7bS7EJ1O2dCvCaTbpRM|fc_034a6be5a6696b6c016a5a281c291c81919af9fd3c1f968c5f","toolName":"grep","startedAt":"2026-07-17T13:03:24.692Z","args":{"path":"crates/spt-daemon/src/projwriter.rs"},"intent":"Locating project cwd cache"},"id":"5b926181","parentId":"0121b620","timestamp":"2026-07-17T13:03:24.692Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ESELkFLaDGWDUDOZHfs8t6Vk|fc_034a6be5a6696b6c016a5a281c292481918e29c6d4ad8ce983","toolName":"grep","startedAt":"2026-07-17T13:03:24.692Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Finding registry round log markers"},"id":"8cf829dc","parentId":"5b926181","timestamp":"2026-07-17T13:03:24.692Z"}
{"type":"message","id":"15dc86f1","parentId":"8cf829dc","timestamp":"2026-07-17T13:03:24.697Z","message":{"role":"toolResult","toolCallId":"call_GfrPv7bS7EJ1O2dCvCaTbpRM|fc_034a6be5a6696b6c016a5a281c291c81919af9fd3c1f968c5f","toolName":"grep","content":[{"type":"text","text":" 113|    #[serde(default)]\n*114|    pub cwd_cache_hits: u64,\n 115|    #[serde(default)]\n*116|    pub cwd_cache_misses: u64,\n 117|    /// Cycles that FAILED to publish — every read until the next success is a\n 118|    /// stale (last-known-good) read by contract.\n 119|    #[serde(default)]\n...\n 218|    /// normalized cwd → stamped derivation (the C term's cross-cycle cache).\n*219|    cwd_cache: HashMap<String, CwdDerivation>,\n 220|    /// Pending repair: the on-disk index was unreadable/foreign at load; the\n 221|    /// next successful publish counts as a repair.\n 222|    repair_pending: bool,\n...\n 259|            branch_order: Vec::new(),\n*260|            cwd_cache: HashMap::new(),\n 261|            repair_pending,\n 262|            stats,\n 263|        }\n...\n 282|        for cwd in &req.cwds {\n*283|            self.cwd_cache.remove(&projderive::normalize_path(Path::new(cwd)));\n 284|        }\n 285|\n 286|        // ── 1. ONE branch enumeration → fingerprint ──────────────────────\n...\n 374|        // cwd cache: one real derivation per distinct normalized cwd.\n*375|        let cache = std::cell::RefCell::new(&mut self.cwd_cache);\n 376|        let hits = std::cell::Cell::new(0u64);\n 377|        let misses = std::cell::Cell::new(0u64);\n 378|        let derivations = std::cell::Cell::new(0u64);\n...\n 391|            derivations.set(derivations.get() + 1);\n*392|            let (id, display) = spt_store::project::project_id_and_display_for_dir(dir);\n 393|            cache.insert(\n 394|                key,\n 395|                CwdDerivation { id: id.clone(), display: display.clone(), marker, stamp },\n...\n 461|        counters.derivations += derivations.get();\n*462|        self.stats.cwd_cache_hits += hits.get();\n*463|        self.stats.cwd_cache_misses += misses.get();\n 464|\n 465|        // The persisted cwd map (W3 additive `cwds` — the resume pane's\n 466|        // per-session-cwd source, REQ-RESUME-ROW-PER-PROJECT without git): a\n...\n 476|        };\n*477|        for (norm, entry) in self.cwd_cache.iter() {\n 478|            if !entry.id.is_empty() {\n 479|                cwds.insert(\n 480|                    norm.clone(),\n...\n 529|        self.stats.pending_refresh = false;\n*530|        self.stats.cwds = self.cwd_cache.len() as u64;\n 531|        self.write_stats();\n 532|    }\n 533|\n...\n 802|        );\n*803|        assert_eq!(engine.stats.cwd_cache_hits, 2, \"both cwds re-answered from cache\");\n 804|\n 805|        // One branch moves → exactly ONE rescan (≤1 tree scan per CHANGED branch).\n 806|        fx.membership(\"alpha\", \"ep3\");\n...\n 1122|    // p-* branches by recency, derived through the REAL git\n*1123|    // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo\n 1124|    // WITH a remote (slug ≠ folder name — the display-parity hard case), a\n 1125|    // plain dir, an origin-only endpoint, branch-only membership, and the\n 1126|    // per-cwd map the resume pane reads.\n...\n 1193|                &owlery,\n*1194|                spt_store::project::project_id_and_display_for_dir,\n 1195|            )\n 1196|            .into_iter()\n 1197|            .map(|d| (d.id, d.dir, d.display))\n...\n 1239|            let (want_id, want_display) =\n*1240|                spt_store::project::project_id_and_display_for_dir(cwd);\n 1241|            let got = idx\n 1242|                .project_for_cwd(cwd)\n 1243|                .unwrap_or_else(|| panic!(\"cwd map must hold {cwd:?}\"));"}],"details":{"scopePath":"crates/spt-daemon/src/projwriter.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\projwriter.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":15,"fileCount":1,"files":["crates/spt-daemon/src/projwriter.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/projwriter.rs","count":15}],"truncated":false,"displayContent":"  113│    #[serde(default)]\n *114│    pub cwd_cache_hits: u64,\n  115│    #[serde(default)]\n *116│    pub cwd_cache_misses: u64,\n  117│    /// Cycles that FAILED to publish — every read until the next success is a\n  118│    /// stale (last-known-good) read by contract.\n  119│    #[serde(default)]\n     │...\n  218│    /// normalized cwd → stamped derivation (the C term's cross-cycle cache).\n *219│    cwd_cache: HashMap<String, CwdDerivation>,\n  220│    /// Pending repair: the on-disk index was unreadable/foreign at load; the\n  221│    /// next successful publish counts as a repair.\n  222│    repair_pending: bool,\n     │...\n  259│            branch_order: Vec::new(),\n *260│            cwd_cache: HashMap::new(),\n  261│            repair_pending,\n  262│            stats,\n  263│        }\n     │...\n  282│        for cwd in &req.cwds {\n *283│            self.cwd_cache.remove(&projderive::normalize_path(Path::new(cwd)));\n  284│        }\n  285│\n  286│        // ── 1. ONE branch enumeration → fingerprint ──────────────────────\n     │...\n  374│        // cwd cache: one real derivation per distinct normalized cwd.\n *375│        let cache = std::cell::RefCell::new(&mut self.cwd_cache);\n  376│        let hits = std::cell::Cell::new(0u64);\n  377│        let misses = std::cell::Cell::new(0u64);\n  378│        let derivations = std::cell::Cell::new(0u64);\n     │...\n  391│            derivations.set(derivations.get() + 1);\n *392│            let (id, display) = spt_store::project::project_id_and_display_for_dir(dir);\n  393│            cache.insert(\n  394│                key,\n  395│                CwdDerivation { id: id.clone(), display: display.clone(), marker, stamp },\n     │...\n  461│        counters.derivations += derivations.get();\n *462│        self.stats.cwd_cache_hits += hits.get();\n *463│        self.stats.cwd_cache_misses += misses.get();\n  464│\n  465│        // The persisted cwd map (W3 additive `cwds` — the resume pane's\n  466│        // per-session-cwd source, REQ-RESUME-ROW-PER-PROJECT without git): a\n     │...\n  476│        };\n *477│        for (norm, entry) in self.cwd_cache.iter() {\n  478│            if !entry.id.is_empty() {\n  479│                cwds.insert(\n  480│                    norm.clone(),\n     │...\n  529│        self.stats.pending_refresh = false;\n *530│        self.stats.cwds = self.cwd_cache.len() as u64;\n  531│        self.write_stats();\n  532│    }\n  533│\n     │...\n  802│        );\n *803│        assert_eq!(engine.stats.cwd_cache_hits, 2, \"both cwds re-answered from cache\");\n  804│\n  805│        // One branch moves → exactly ONE rescan (≤1 tree scan per CHANGED branch).\n  806│        fx.membership(\"alpha\", \"ep3\");\n     │...\n 1122│    // p-* branches by recency, derived through the REAL git\n*1123│    // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo\n 1124│    // WITH a remote (slug ≠ folder name — the display-parity hard case), a\n 1125│    // plain dir, an origin-only endpoint, branch-only membership, and the\n 1126│    // per-cwd map the resume pane reads.\n     │...\n 1193│                &owlery,\n*1194│                spt_store::project::project_id_and_display_for_dir,\n 1195│            )\n 1196│            .into_iter()\n 1197│            .map(|d| (d.id, d.dir, d.display))\n     │...\n 1239│            let (want_id, want_display) =\n*1240│                spt_store::project::project_id_and_display_for_dir(cwd);\n 1241│            let got = idx\n 1242│                .project_for_cwd(cwd)\n 1243│                .unwrap_or_else(|| panic!(\"cwd map must hold {cwd:?}\"));"},"isError":false,"timestamp":1784293404697}}
{"type":"message","id":"6b85288a","parentId":"15dc86f1","timestamp":"2026-07-17T13:03:24.709Z","message":{"role":"toolResult","toolCallId":"call_CoGrmGPNJNDf4Uw7LQKpy5DE|fc_034a6be5a6696b6c016a5a281c291481919bf9f83f5e266189","toolName":"read","content":[{"type":"text","text":"pub struct IndexWriterStats {\n…\n    pub last_duration_ms: u64,\n    /// The last cycle failure, if the most recent cycle failed (`None` = last\n    /// cycle succeeded). While set, readers are on last-known-good.\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n    pub last_error: Option<String>,\n    /// Row counts of the published snapshot.\n    #[serde(default)]\n    pub endpoints: u64,\n    #[serde(default)]\n    pub projects: u64,\n    /// Distinct cwds in the derivation cache.\n    #[serde(default)]\n    pub cwds: u64,\n    /// Cumulative cwd-cache hit/miss census.\n    #[serde(default)]\n    pub cwd_cache_hits: u64,\n    #[serde(default)]\n    pub cwd_cache_misses: u64,\n    /// Cycles that FAILED to publish — every read until the next success is a\n    /// stale (last-known-good) read by contract.\n    #[serde(default)]\n    pub stale_reads: u64,\n    /// Publishes that REPLACED an unreadable / schema-mismatched index file\n    /// (the writer repairing a torn or foreign snapshot).\n    #[serde(default)]\n    pub repairs: u64,\n    /// The most recent cycle's complexity counters (the CI-gate surface).\n    #[serde(default)]\n    pub last_cycle: CycleCounters,\n    /// Lifetime totals (this brain generation).\n    #[serde(default)]\n    pub cumulative: CycleCounters,\n}\n\n/// The stats sidecar path, beside the index inside `projindex::index_dir()`.\npub fn stats_path() -> PathBuf {\n    projindex::index_dir().join(\"project-index-stats.json\")\n}\n\n/// Read the stats sidecar (tolerant: absent/corrupt → `None`) — the\n/// `spt daemon status` consumer half.\npub fn read_stats_at(path: &Path) -> Option<IndexWriterStats> {\n    let raw = std::fs::read_to_string(path).ok()?;\n    serde_json::from_str(&raw).ok()\n}\n\n/// Every filesystem root the engine touches, injected so units run against\n/// plain temp dirs with zero env games.\n#[derive(Debug, Clone)]\npub struct WriterPaths {\n    pub owlery: PathBuf,\n    /// The context store's bare seed repo (`tracked/.seed.git`).\n    pub seed_git: PathBuf,\n    pub index_path: PathBuf,\n    pub stats_path: PathBuf,\n    pub invalidations_dir: PathBuf,\n}\n\nimpl WriterPaths {\n    /// The production layout under the live `$SPT_HOME`.\n    pub fn production() -> WriterPaths {\n        WriterPaths {\n            owlery: perch::owlery_dir(),\n            seed_git: contextstore::seed_git_dir(&perch::tracked_dir()),\n            index_path: projindex::index_path(),\n            stats_path: stats_path(),\n            invalidations_dir: projinval::invalidations_dir(),\n        }\n    }\n}\n\n/// One scanned branch: its tip at scan time + the endpoint ids holding\n/// `<id>/project-context.md` in that tip tree.\n#[derive(Debug, Clone)]\nstruct BranchScan {\n    tip: String,\n    members: BTreeSet<String>,\n}\n\n/// One cached cwd derivation, stamped with the repo-identity marker that\n/// decides its validity: the discovered `.git/config` (or the `.git` gitfile\n/// for a linked worktree). Identity refreshes ONLY when the marker path or\n/// its (mtime, len) stamp moves — ordinary commits touch neither (ADR-0037\n/// §3: commits do not alter project identity).\n#[derive(Debug, Clone)]\nstruct CwdDerivation {\n    id: String,\n    display: String,\n    marker: Option<PathBuf>,\n    stamp: Option<(u64, u64)>,\n}\n\n/// What one reconcile cycle did — the unit-gate surface.\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct CycleReport {\n    pub counters: CycleCounters,\n    /// A new snapshot was written.\n    pub published: bool,\n    /// The cycle proved the store unchanged and exited without scanning,\n    /// deriving, or writing — the warm-start / no-op contract.\n    pub skipped_unchanged: bool,\n}\n\n/// The single-flight reconcile engine. ONE instance lives on ONE writer\n/// thread — single-flight is by construction, not by locking.\npub struct WriterEngine {\n    paths: WriterPaths,\n    /// The last published snapshot (in-memory copy; `None` until the first\n    /// load/publish).\n    current: Option<ProjectIndex>,\n    /// The fingerprint the published snapshot was derived from.\n    last_fingerprint: String,\n    /// branch → last scan (tips + membership), the ≤1-scan-per-changed-branch\n    /// cache. Brain-local: a brain restart re-scans (bounded by B) only when\n    /// the fingerprint moved or rows must be recomposed.\n    branch_cache: BTreeMap<String, BranchScan>,\n    /// `p-*` branches in recency order as of the last enumeration:\n    /// `(project_id, branch)`.\n    branch_order: Vec<(String, String)>,\n    /// normalized cwd → stamped derivation (the C term's cross-cycle cache).\n    cwd_cache: HashMap<String, CwdDerivation>,\n    /// Pending repair: the on-disk index was unreadable/foreign at load; the\n    /// next successful publish counts as a repair.\n    repair_pending: bool,\n    pub stats: IndexWriterStats,\n}\n\nimpl WriterEngine {\n    /// Build the engine and LOAD the persisted index (ADR-0037 §2: load at\n    /// startup, ready without warm — this constructor performs pure file I/O\n    /// and returns immediately; reconciling is the thread's job).\n    // [impl->REQ-PROJECT-INDEX-WRITER]\n    pub fn new(paths: WriterPaths) -> WriterEngine {\n        let (current, repair_pending) = match projindex::read_index_at(&paths.index_path) {\n            IndexRead::Snapshot(idx) => (Some(idx), false),\n            IndexRead::Absent(AbsentReason::Missing) => (None, false),\n            // Torn/corrupt/foreign file present: readers are degrading to `-`;\n            // our next publish REPAIRS it (and is counted as such).\n            IndexRead::Absent(_) => (None, true),\n        };\n        let last_fingerprint = current\n            .as_ref()\n            .map(|i| i.source_generation.clone())\n            .unwrap_or_default();\n        let mut stats = IndexWriterStats {\n…\n        };\n…\n    }\n…\n}\n\n[Showing lines 99-243 of 1270. Use :244 to continue]"}],"details":{"truncation":{"content":"    pub last_duration_ms: u64,\r\n    /// The last cycle failure, if the most recent cycle failed (`None` = last\r\n    /// cycle succeeded). While set, readers are on last-known-good.\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub last_error: Option<String>,\r\n    /// Row counts of the published snapshot.\r\n    #[serde(default)]\r\n    pub endpoints: u64,\r\n    #[serde(default)]\r\n    pub projects: u64,\r\n    /// Distinct cwds in the derivation cache.\r\n    #[serde(default)]\r\n    pub cwds: u64,\r\n    /// Cumulative cwd-cache hit/miss census.\r\n    #[serde(default)]\r\n    pub cwd_cache_hits: u64,\r\n    #[serde(default)]\r\n    pub cwd_cache_misses: u64,\r\n    /// Cycles that FAILED to publish — every read until the next success is a\r\n    /// stale (last-known-good) read by contract.\r\n    #[serde(default)]\r\n    pub stale_reads: u64,\r\n    /// Publishes that REPLACED an unreadable / schema-mismatched index file\r\n    /// (the writer repairing a torn or foreign snapshot).\r\n    #[serde(default)]\r\n    pub repairs: u64,\r\n    /// The most recent cycle's complexity counters (the CI-gate surface).\r\n    #[serde(default)]\r\n    pub last_cycle: CycleCounters,\r\n    /// Lifetime totals (this brain generation).\r\n    #[serde(default)]\r\n    pub cumulative: CycleCounters,\r\n}\r\n\r\n/// The stats sidecar path, beside the index inside `projindex::index_dir()`.\r\npub fn stats_path() -> PathBuf {\r\n    projindex::index_dir().join(\"project-index-stats.json\")\r\n}\r\n\r\n/// Read the stats sidecar (tolerant: absent/corrupt → `None`) — the\r\n/// `spt daemon status` consumer half.\r\npub fn read_stats_at(path: &Path) -> Option<IndexWriterStats> {\r\n    let raw = std::fs::read_to_string(path).ok()?;\r\n    serde_json::from_str(&raw).ok()\r\n}\r\n\r\n/// Every filesystem root the engine touches, injected so units run against\r\n/// plain temp dirs with zero env games.\r\n#[derive(Debug, Clone)]\r\npub struct WriterPaths {\r\n    pub owlery: PathBuf,\r\n    /// The context store's bare seed repo (`tracked/.seed.git`).\r\n    pub seed_git: PathBuf,\r\n    pub index_path: PathBuf,\r\n    pub stats_path: PathBuf,\r\n    pub invalidations_dir: PathBuf,\r\n}\r\n\r\nimpl WriterPaths {\r\n    /// The production layout under the live `$SPT_HOME`.\r\n    pub fn production() -> WriterPaths {\r\n        WriterPaths {\r\n            owlery: perch::owlery_dir(),\r\n            seed_git: contextstore::seed_git_dir(&perch::tracked_dir()),\r\n            index_path: projindex::index_path(),\r\n            stats_path: stats_path(),\r\n            invalidations_dir: projinval::invalidations_dir(),\r\n        }\r\n    }\r\n}\r\n\r\n/// One scanned branch: its tip at scan time + the endpoint ids holding\r\n/// `<id>/project-context.md` in that tip tree.\r\n#[derive(Debug, Clone)]\r\nstruct BranchScan {\r\n    tip: String,\r\n    members: BTreeSet<String>,\r\n}\r\n\r\n/// One cached cwd derivation, stamped with the repo-identity marker that\r\n/// decides its validity: the discovered `.git/config` (or the `.git` gitfile\r\n/// for a linked worktree). Identity refreshes ONLY when the marker path or\r\n/// its (mtime, len) stamp moves — ordinary commits touch neither (ADR-0037\r\n/// §3: commits do not alter project identity).\r\n#[derive(Debug, Clone)]\r\nstruct CwdDerivation {\r\n    id: String,\r\n    display: String,\r\n    marker: Option<PathBuf>,\r\n    stamp: Option<(u64, u64)>,\r\n}\r\n\r\n/// What one reconcile cycle did — the unit-gate surface.\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct CycleReport {\r\n    pub counters: CycleCounters,\r\n    /// A new snapshot was written.\r\n    pub published: bool,\r\n    /// The cycle proved the store unchanged and exited without scanning,\r\n    /// deriving, or writing — the warm-start / no-op contract.\r\n    pub skipped_unchanged: bool,\r\n}\r\n\r\n/// The single-flight reconcile engine. ONE instance lives on ONE writer\r\n/// thread — single-flight is by construction, not by locking.\r\npub struct WriterEngine {\r\n    paths: WriterPaths,\r\n    /// The last published snapshot (in-memory copy; `None` until the first\r\n    /// load/publish).\r\n    current: Option<ProjectIndex>,\r\n    /// The fingerprint the published snapshot was derived from.\r\n    last_fingerprint: String,\r\n    /// branch → last scan (tips + membership), the ≤1-scan-per-changed-branch\r\n    /// cache. Brain-local: a brain restart re-scans (bounded by B) only when\r\n    /// the fingerprint moved or rows must be recomposed.\r\n    branch_cache: BTreeMap<String, BranchScan>,\r\n    /// `p-*` branches in recency order as of the last enumeration:\r\n    /// `(project_id, branch)`.\r\n    branch_order: Vec<(String, String)>,\r\n    /// normalized cwd → stamped derivation (the C term's cross-cycle cache).\r\n    cwd_cache: HashMap<String, CwdDerivation>,\r\n    /// Pending repair: the on-disk index was unreadable/foreign at load; the\r\n    /// next successful publish counts as a repair.\r\n    repair_pending: bool,\r\n    pub stats: IndexWriterStats,\r\n}\r\n\r\nimpl WriterEngine {\r\n    /// Build the engine and LOAD the persisted index (ADR-0037 §2: load at\r\n    /// startup, ready without warm — this constructor performs pure file I/O\r\n    /// and returns immediately; reconciling is the thread's job).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    pub fn new(paths: WriterPaths) -> WriterEngine {\r\n        let (current, repair_pending) = match projindex::read_index_at(&paths.index_path) {\r\n            IndexRead::Snapshot(idx) => (Some(idx), false),\r\n            IndexRead::Absent(AbsentReason::Missing) => (None, false),\r\n            // Torn/corrupt/foreign file present: readers are degrading to `-`;\r\n            // our next publish REPAIRS it (and is counted as such).\r\n            IndexRead::Absent(_) => (None, true),\r\n        };\r\n        let last_fingerprint = current\r\n            .as_ref()\r\n            .map(|i| i.source_generation.clone())\r\n            .unwrap_or_default();\r\n        let mut stats = IndexWriterStats {\r","truncated":true,"truncatedBy":"lines","totalLines":1172,"totalBytes":5854,"outputLines":145,"outputBytes":5854,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"pub struct IndexWriterStats {\n…\n    pub last_duration_ms: u64,\r\n    /// The last cycle failure, if the most recent cycle failed (`None` = last\r\n    /// cycle succeeded). While set, readers are on last-known-good.\r\n    #[serde(default, skip_serializing_if = \"Option::is_none\")]\r\n    pub last_error: Option<String>,\r\n    /// Row counts of the published snapshot.\r\n    #[serde(default)]\r\n    pub endpoints: u64,\r\n    #[serde(default)]\r\n    pub projects: u64,\r\n    /// Distinct cwds in the derivation cache.\r\n    #[serde(default)]\r\n    pub cwds: u64,\r\n    /// Cumulative cwd-cache hit/miss census.\r\n    #[serde(default)]\r\n    pub cwd_cache_hits: u64,\r\n    #[serde(default)]\r\n    pub cwd_cache_misses: u64,\r\n    /// Cycles that FAILED to publish — every read until the next success is a\r\n    /// stale (last-known-good) read by contract.\r\n    #[serde(default)]\r\n    pub stale_reads: u64,\r\n    /// Publishes that REPLACED an unreadable / schema-mismatched index file\r\n    /// (the writer repairing a torn or foreign snapshot).\r\n    #[serde(default)]\r\n    pub repairs: u64,\r\n    /// The most recent cycle's complexity counters (the CI-gate surface).\r\n    #[serde(default)]\r\n    pub last_cycle: CycleCounters,\r\n    /// Lifetime totals (this brain generation).\r\n    #[serde(default)]\r\n    pub cumulative: CycleCounters,\r\n}\r\n\r\n/// The stats sidecar path, beside the index inside `projindex::index_dir()`.\r\npub fn stats_path() -> PathBuf {\r\n    projindex::index_dir().join(\"project-index-stats.json\")\r\n}\r\n\r\n/// Read the stats sidecar (tolerant: absent/corrupt → `None`) — the\r\n/// `spt daemon status` consumer half.\r\npub fn read_stats_at(path: &Path) -> Option<IndexWriterStats> {\r\n    let raw = std::fs::read_to_string(path).ok()?;\r\n    serde_json::from_str(&raw).ok()\r\n}\r\n\r\n/// Every filesystem root the engine touches, injected so units run against\r\n/// plain temp dirs with zero env games.\r\n#[derive(Debug, Clone)]\r\npub struct WriterPaths {\r\n    pub owlery: PathBuf,\r\n    /// The context store's bare seed repo (`tracked/.seed.git`).\r\n    pub seed_git: PathBuf,\r\n    pub index_path: PathBuf,\r\n    pub stats_path: PathBuf,\r\n    pub invalidations_dir: PathBuf,\r\n}\r\n\r\nimpl WriterPaths {\r\n    /// The production layout under the live `$SPT_HOME`.\r\n    pub fn production() -> WriterPaths {\r\n        WriterPaths {\r\n            owlery: perch::owlery_dir(),\r\n            seed_git: contextstore::seed_git_dir(&perch::tracked_dir()),\r\n            index_path: projindex::index_path(),\r\n            stats_path: stats_path(),\r\n            invalidations_dir: projinval::invalidations_dir(),\r\n        }\r\n    }\r\n}\r\n\r\n/// One scanned branch: its tip at scan time + the endpoint ids holding\r\n/// `<id>/project-context.md` in that tip tree.\r\n#[derive(Debug, Clone)]\r\nstruct BranchScan {\r\n    tip: String,\r\n    members: BTreeSet<String>,\r\n}\r\n\r\n/// One cached cwd derivation, stamped with the repo-identity marker that\r\n/// decides its validity: the discovered `.git/config` (or the `.git` gitfile\r\n/// for a linked worktree). Identity refreshes ONLY when the marker path or\r\n/// its (mtime, len) stamp moves — ordinary commits touch neither (ADR-0037\r\n/// §3: commits do not alter project identity).\r\n#[derive(Debug, Clone)]\r\nstruct CwdDerivation {\r\n    id: String,\r\n    display: String,\r\n    marker: Option<PathBuf>,\r\n    stamp: Option<(u64, u64)>,\r\n}\r\n\r\n/// What one reconcile cycle did — the unit-gate surface.\r\n#[derive(Debug, Clone, PartialEq, Eq)]\r\npub struct CycleReport {\r\n    pub counters: CycleCounters,\r\n    /// A new snapshot was written.\r\n    pub published: bool,\r\n    /// The cycle proved the store unchanged and exited without scanning,\r\n    /// deriving, or writing — the warm-start / no-op contract.\r\n    pub skipped_unchanged: bool,\r\n}\r\n\r\n/// The single-flight reconcile engine. ONE instance lives on ONE writer\r\n/// thread — single-flight is by construction, not by locking.\r\npub struct WriterEngine {\r\n    paths: WriterPaths,\r\n    /// The last published snapshot (in-memory copy; `None` until the first\r\n    /// load/publish).\r\n    current: Option<ProjectIndex>,\r\n    /// The fingerprint the published snapshot was derived from.\r\n    last_fingerprint: String,\r\n    /// branch → last scan (tips + membership), the ≤1-scan-per-changed-branch\r\n    /// cache. Brain-local: a brain restart re-scans (bounded by B) only when\r\n    /// the fingerprint moved or rows must be recomposed.\r\n    branch_cache: BTreeMap<String, BranchScan>,\r\n    /// `p-*` branches in recency order as of the last enumeration:\r\n    /// `(project_id, branch)`.\r\n    branch_order: Vec<(String, String)>,\r\n    /// normalized cwd → stamped derivation (the C term's cross-cycle cache).\r\n    cwd_cache: HashMap<String, CwdDerivation>,\r\n    /// Pending repair: the on-disk index was unreadable/foreign at load; the\r\n    /// next successful publish counts as a repair.\r\n    repair_pending: bool,\r\n    pub stats: IndexWriterStats,\r\n}\r\n\r\nimpl WriterEngine {\r\n    /// Build the engine and LOAD the persisted index (ADR-0037 §2: load at\r\n    /// startup, ready without warm — this constructor performs pure file I/O\r\n    /// and returns immediately; reconciling is the thread's job).\r\n    // [impl->REQ-PROJECT-INDEX-WRITER]\r\n    pub fn new(paths: WriterPaths) -> WriterEngine {\r\n        let (current, repair_pending) = match projindex::read_index_at(&paths.index_path) {\r\n            IndexRead::Snapshot(idx) => (Some(idx), false),\r\n            IndexRead::Absent(AbsentReason::Missing) => (None, false),\r\n            // Torn/corrupt/foreign file present: readers are degrading to `-`;\r\n            // our next publish REPAIRS it (and is counted as such).\r\n            IndexRead::Absent(_) => (None, true),\r\n        };\r\n        let last_fingerprint = current\r\n            .as_ref()\r\n            .map(|i| i.source_generation.clone())\r\n            .unwrap_or_default();\r\n        let mut stats = IndexWriterStats {\r\n…\n        };\n…\n    }\n…\n}","startLine":84,"lineNumbers":[84,null,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,null,249,null,264,null,544]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\projwriter.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1270,"totalBytes":5854,"outputLines":145,"outputBytes":5854,"shownRange":{"start":99,"end":243},"nextOffset":244}}},"isError":false,"timestamp":1784293404709}}
{"type":"message","id":"63242294","parentId":"6b85288a","timestamp":"2026-07-17T13:03:24.711Z","message":{"role":"toolResult","toolCallId":"call_ESELkFLaDGWDUDOZHfs8t6Vk|fc_034a6be5a6696b6c016a5a281c292481918e29c6d4ad8ce983","toolName":"grep","content":[{"type":"text","text":" 1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1423|CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427|CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428|CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1609|CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613|CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614|CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 1796|CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800|CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801|CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2058|CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n...\n 2590|CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595|CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n...\n 3623|CONN_LIFECYCLE: conn=1477 role=brain wall_ms=1784292979227 mono_ms=564862 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3624|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464\n*3625|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480\n 3626|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3627|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3628|CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":14,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","count":14}],"truncated":false,"displayContent":" 1253│CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1254│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\n*1255│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\n 1256│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1257│CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1258│CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1423│CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1424│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\n*1425│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\n 1426│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1427│CONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1428│CONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1609│CONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1610│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n*1611│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\n 1612│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1613│CONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1614│CONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 1796│CONN_LIFECYCLE: conn=722 role=brain wall_ms=1784292666066 mono_ms=251702 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*1797│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n*1798│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292668403 mono_ms=81495\n 1799│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 1800│CONN_LIFECYCLE: conn=723 role=brain wall_ms=1784292669784 mono_ms=255420 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 1801│CONN_LIFECYCLE: conn=724 role=brain stream-subscriber stream=281 wall_ms=1784292669784 mono_ms=255420 event=stream-sub-attach stream=281 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2058│CONN_LIFECYCLE: conn=833 role=brain wall_ms=1784292712226 mono_ms=297861 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2059│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714431 mono_ms=127523\n*2060│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292714432 mono_ms=127523\n 2061│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714499 mono_ms=300135 event=stream-sub-attach stream=330 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n 2062│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292714778 mono_ms=300414 event=stream-sub-release stream=330 [REQ-CONN-POISON-ATTRIBUTION]\n 2063│CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173… wall_ms=1784292715554 mono_ms=301190 event=stream-sub-attach stream=331 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 2590│CONN_LIFECYCLE: conn=1049 role=brain wall_ms=1784292805348 mono_ms=390983 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*2591│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n*2592│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372\n 2593│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 2594│CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 2595│CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n     │...\n 3623│CONN_LIFECYCLE: conn=1477 role=brain wall_ms=1784292979227 mono_ms=564862 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n*3624│PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464\n*3625│PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480\n 3626│CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n 3627│CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n 3628│CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"},"isError":false,"timestamp":1784293404710}}
{"type":"message","id":"8e586f83","parentId":"63242294","timestamp":"2026-07-17T13:03:24.716Z","message":{"role":"toolResult","toolCallId":"call_BeDgqPok8bJaMWVFT6ya0sNX|fc_034a6be5a6696b6c016a5a281c28fc819191f7708f27c3357e","toolName":"grep","content":[{"type":"text","text":"# CHANGELOG.md\n 600|\n*601|- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.\n 602|- **A controlled endpoint now reads as CONTROLLED accurately — and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.\n 603|- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.\n 604|- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.\n\n# docs/\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 149|**Fix shape:** additive gossip fields, N-1-safe exactly like `endpoint_type`:\n*150|`Instance.adapter` (composite `<adapter>[:profile]`) + `Instance.recent_projects`\n 151|(bounded, newest-first) → thread to `ResourceRow` → `from_resource_row` stops faking.\n 152|\n*153|**Project representation ruling (operator 2026-07-03): project IDs only, EVERYWHERE —\n 154|including local display.** Full paths are clutter locally and leak usernames/dir\n 155|structure cross-node. When two entries' IDs collide, disambiguate minimally: append the\n 156|one-level-up parent folder and/or the root drive letter (e.g. `spt-core (projects)` vs\n...\n 229|(sessions.log-derived, owlery-excluded). Remote rows: head of #4's gossiped\n*230|`recent_projects`. Project IDs only + #4's disambiguation rule; `-` when unknown\n 231|(pre-field remote rows). Extends the fresh v0.21.0 node-grouped renderer\n 232|(`format_instance_rows` — additive column, alignment already char-width-safe).\n 233|`--json`: additive `project` field on the row DTO (skip-if-none, N-1 safe).\n...\n 285|| W1 presence-truth | #2 reap-clears + REQ-HAZARD-CONTROL-STAMP-LIFETIME mint; #3 local controlled-display; **#9 self-id PID-ancestry (rolled in — field-active)** | Field-visible lies about control/identity state; smallest, highest confidence; #7 depends on honest stamps |\n*286|| W2 history+details-truth | #1 sessions.log-derived history + owlery exclusion + project-ID display w/ disambiguation; SI-1 branchless-store RCA (full item); #4 gossip adapter+recent_projects | #1/#4 share the history/gossip seams; #5/#8 depend on both |\n 287|| W3 surfaces | #8 project column (list + --json additive); #7 `spt api endpoint-info` | Consume W1 stamps + W2 sources; xtask docs regen both |\n 288|| W4 UX | #5 choose-project step; #6 resume panel retention; **#10 BrokenPipe (micro)** | Build on W2's dir-carrying history model; #10 slots anywhere cheap |\n 289|\n## PROJECT-INDEX-TRIAGE.md\n 47|- **Behavioral parity is binding**: precedence session-cwd → origin-cwd →\n*48|  context-recency; rendered project IDs/display names must not change.\n 49|\n 50|## Waves\n 51|\n\n# .claude/reports/2026-07-10-hertz-session/\n## 03-cli-project-index-latency-rca.md\n 117|\n*118|Optimization must not change rendered project IDs/display names.\n 119|\n 120|## Regression tests\n 121|"}],"details":{"scopePath":"CHANGELOG.md, docs, .claude/reports","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":7,"fileCount":4,"files":["CHANGELOG.md","docs/NEXT-MILESTONE-PICKER-TRIAGE.md","docs/PROJECT-INDEX-TRIAGE.md",".claude/reports/2026-07-10-hertz-session/03-cli-project-index-latency-rca.md"],"fileMatches":[{"path":"CHANGELOG.md","count":1},{"path":"docs/NEXT-MILESTONE-PICKER-TRIAGE.md","count":4},{"path":"docs/PROJECT-INDEX-TRIAGE.md","count":1},{"path":".claude/reports/2026-07-10-hertz-session/03-cli-project-index-latency-rca.md","count":1}],"truncated":false,"displayContent":"# CHANGELOG.md\n 600│\n*601│- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.\n 602│- **A controlled endpoint now reads as CONTROLLED accurately — and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.\n 603│- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.\n 604│- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.\n\n# docs/\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 149│**Fix shape:** additive gossip fields, N-1-safe exactly like `endpoint_type`:\n*150│`Instance.adapter` (composite `<adapter>[:profile]`) + `Instance.recent_projects`\n 151│(bounded, newest-first) → thread to `ResourceRow` → `from_resource_row` stops faking.\n 152│\n*153│**Project representation ruling (operator 2026-07-03): project IDs only, EVERYWHERE —\n 154│including local display.** Full paths are clutter locally and leak usernames/dir\n 155│structure cross-node. When two entries' IDs collide, disambiguate minimally: append the\n 156│one-level-up parent folder and/or the root drive letter (e.g. `spt-core (projects)` vs\n    │...\n 229│(sessions.log-derived, owlery-excluded). Remote rows: head of #4's gossiped\n*230│`recent_projects`. Project IDs only + #4's disambiguation rule; `-` when unknown\n 231│(pre-field remote rows). Extends the fresh v0.21.0 node-grouped renderer\n 232│(`format_instance_rows` — additive column, alignment already char-width-safe).\n 233│`--json`: additive `project` field on the row DTO (skip-if-none, N-1 safe).\n    │...\n 285│| W1 presence-truth | #2 reap-clears + REQ-HAZARD-CONTROL-STAMP-LIFETIME mint; #3 local controlled-display; **#9 self-id PID-ancestry (rolled in — field-active)** | Field-visible lies about control/identity state; smallest, highest confidence; #7 depends on honest stamps |\n*286│| W2 history+details-truth | #1 sessions.log-derived history + owlery exclusion + project-ID display w/ disambiguation; SI-1 branchless-store RCA (full item); #4 gossip adapter+recent_projects | #1/#4 share the history/gossip seams; #5/#8 depend on both |\n 287│| W3 surfaces | #8 project column (list + --json additive); #7 `spt api endpoint-info` | Consume W1 stamps + W2 sources; xtask docs regen both |\n 288│| W4 UX | #5 choose-project step; #6 resume panel retention; **#10 BrokenPipe (micro)** | Build on W2's dir-carrying history model; #10 slots anywhere cheap |\n 289│\n## PROJECT-INDEX-TRIAGE.md\n 47│- **Behavioral parity is binding**: precedence session-cwd → origin-cwd →\n*48│  context-recency; rendered project IDs/display names must not change.\n 49│\n 50│## Waves\n 51│\n\n# .claude/reports/2026-07-10-hertz-session/\n## 03-cli-project-index-latency-rca.md\n 117│\n*118│Optimization must not change rendered project IDs/display names.\n 119│\n 120│## Regression tests\n 121│"},"isError":false,"timestamp":1784293404716}}
{"type":"message","id":"5712bde2","parentId":"8e586f83","timestamp":"2026-07-17T13:03:58.239Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Clarifying performance issue origin**\n\n**Analyzing registry round timing and CPU bursts**\n\n**Inspecting registry JSON file timestamps**"},{"type":"thinking","thinking":"**Counting ledger entries for sessions 50-64**\n\n**Planning grep search for external cwd paths**"},{"type":"toolCall","id":"call_wNxngucSD8nLEPy7MuuR4kLE|fc_034a6be5a6696b6c016a5a283dd4b08191b012488e2ae0756b","name":"grep","arguments":{"i":"Counting Doyle project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_NutEaJ10M9cD4D5slo7rp6Fc|fc_034a6be5a6696b6c016a5a283dd4cc8191b95c41b2dd4a8925","name":"grep","arguments":{"i":"Counting Flynn project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_5qoZAkjildnNZ8UXr5ajOOK9|fc_034a6be5a6696b6c016a5a283dd4d88191a75045e62cb8d02c","name":"grep","arguments":{"i":"Counting Perri project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_TSRJialWdb1dlgfQpkbJujHH|fc_034a6be5a6696b6c016a5a283dd4dc819195e1971dbfa077c2","name":"grep","arguments":{"i":"Counting Todlando project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_x98tam16NxSHnjb31udmwCoS|fc_034a6be5a6696b6c016a5a283dd4e48191914b5feb46445daf","name":"grep","arguments":{"i":"Counting mobile project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_pQQUKkLgOKyCJtDeqLgZetjv|fc_034a6be5a6696b6c016a5a283dd4e8819180a1326e40e3ad9a","name":"grep","arguments":{"i":"Counting Hertz project rows","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":9738,"output":1233,"cacheRead":192000,"cacheWrite":0,"totalTokens":202971,"reasoningTokens":756,"cost":{"input":0.048690000000000004,"output":0.03699,"cacheRead":0.096,"cacheWrite":0,"total":0.18168}},"stopReason":"toolUse","timestamp":1784293404723,"responseId":"resp_034a6be5a6696b6c016a5a281d35688191938c2bd3b57e5c9c","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_034a6be5a6696b6c016a5a281ea5d48191986bf9b0a1c7b8e4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWigueizyXz6Fm0nCXE8fPEjUQWVRTUQ1VMirIvmmKbD4Eer3kLvhXc_YIhryGPMHH6brUXgYQM-mzxO6LfjV1GBir2DPd-cwOd07eCRIi3ZfeNk21C_-y91810Nlq1LQhSjJfU3dQ7sfdbfIEVQJA5_CKU5xfU9S0HrfjcH8zA_HKbOAY-S_fd1lYyCCb9nW0mY-0Fz-Zp3vueGgNUGkZ9NIVyeuRKTJM81JvnAtpEt2Mvbya89E33eth9_LKocFOjtASxBWdtlDS07yBOtTT2lc2Hyg1KEtyyNelaJwhfs6oF36aEMQvI5Afs3A7BEd_PIbjczJOUrX8bCAuc0zG_n91_jPkV9tuKh5zdvnFA8pRHlKjE796MD5xkhGzLSOQ23bXPcnSrDA3d9KPAbMdXggfxannrRzq4lQeaSxtcnon5A0yeVy-Ep9HXCoE6ntHZT1wTQbIlCq1vZV9rLeWjNFn1JRastFA85HbjUTzhlAY1OGFNyaP_siOAZcN9mK86v-KmrnaMSfqGqb6qkdINDoGQYIdvvHL8bJZWk5uPdfo7SHSRpgQGgZfbBSjvGIH7nNiPIcTInz2cwN7HzovwK2bQ3JESG1f5LrTc8qS_pdZa1O0Y_uYQMcPe59PQ-smDnC4V5eqcxf32oGGZuHKWpxj0PiSEktfONZ8xudyJX8MRyZR2yuwYnrO2pRDfXiec4cGJI1TsV8dYK06f6wIxqIFTGOOqQMSB-KcOHFpGORHdvqun-t2JA99aScDi6H1VM1nbJ3l3Sb1RZHhY7WYi13EuDyHHUP4bvqW_wPGu01MsI2m1_usnDg5IFbWq2DI5rit6hMor_UiPWZGcQ0h6uN8ZygVR-_Swss7MedeaPBvLHrnnvTk7DxbSgZEslo8zbBgNRWJ5IghkmwqG8lFxiGmwSf8NQ67voFSUKp1vV-QLbuEer-adD-xa9W83G1ugEJBLkrwU5khuIqbm2NzEFUszArcC4-ZjOS92Nn4mVPo5w83S9myBy1jwLLO2BiHeIqt4bNvQ3I55fSvSfZGv9bc4vpZY3bElyXsJAFFKMYfq-qtj9ChJ49IyM0Kt7NO6qbirFHcikyRz9G1WonBKCx1m8rgVgB4LBR4NidpSoxcLsOlac30CJd2WmYsTXS3Vz_jNS7Eu4ErWmxuPM5RcVc6PuzwQRYNvfYvYQRumleKXTEZ0qyp4jZfGABdluJQ2nxl2F0-T6vt9D5liol7wSzXxetH-Of1-mOnlssvFUPuhOE6lfBJPHYtOHOUokLel2AR4Van8lMw4in2tUdHksZ9J-1BYFFJvZJStb_0_nhx5qxSlvHqaaK0_i1efiL4-mHpKV7sJIEcCULBf7YB5hXyupYIGAHUG9L63DLKXNU7pdyjz5tqBPH0bsQp9_8GT8WEDCSHhXKo09br42xv0gJ9qAYnNyy1GbgjqY72J6js6txe3LVG7Cbh9p72icHQDtZZhZKYgn-QHfe5Ofc2WtYXDpx4Kp05BNzGtlYLpPQ-kFaXO4vt6Wk0oXovIvo98q6l-EPZ5tjLuRmNU9PN2nXuBiM8pOMgvuIHSGRvGRR_RKI6KTpmUYS5x1HRuwYpRk-ZZI_WOT6QIFX3awIcygQsTH_qXkqzvO8cIHGFlgjSU0uhCEGvlUJp78LhUwV0zYyGl-nPl9PD5DTYqZpub3NWumVmlOYijpwiMnEPLZ9ONKQia0MViem2EB5gF8T59DRuGY1S8ugypWSCcE6RFlBzVhypHCj0AFtBBQZaWu8o0kWfj8FNMeBXQy4KIngSV0YUTUwq-Oi39E6UklmrtyGvZ7rr9iY78dp-CwHiPO-q3WhIC_qCjxgPda7yRCYqFHnyfq3pVm3NXQS7ctpXpqhWFnmufkwQLb6SL2ttBnx1PwO00a91f54TBHBCkBGd1Ejyky9Awmy5Z8YwlIdunr_xHwaWOSS2LgoWkNKaA-oTCPA3enReqEPt1jEEQvfge30TCufzkMnYOX9hA4vbUQugG9WXbnRtUwrvOO05kfxNkF4zMWSVVXOMWiAci99Xo1WjvONPFb2Xmd07Nqy7SkjrLx6zNZpoUn62gRupBAR-W2khcAdfdbFWXtop-XbEICb0HSf3DMZVdcn-dInIiyh2xTHRa20LWS-uDtbJxvIg9DXFYfoGny6wfk1ZHfJwmMhiQ2XuuyI10XfF1O_m6fGUqPPHpiAs9lL5MNNVMSD9KFiVA6Vzo9NlR_HTMmdlWNBEzlYaJAokPOXzMC_T5HKyPhcYkwu_ElTVZB0E6FXLgtORczVr9YF1rV1Zgwxc4majvCZy5Kxim9_RNIVt5iBNfYYGpahiYGAKD-AC2DDN9KX9NqQcbCY7aKoWq58CC_86feLCjkNR2DF_-1FRTm-z6B6KRlkYTpxH4it1wnfc9Oy3GkB3S2Couav_rAEQkE_Pdh7UEM_F4FE4RmhK2KfUwyKKT9H13Vksu-iJ0qBROKCE2lBfxo04ya897nnq9UbfLupJoAjRj9axsZ7LCVoIRd4-YfHQ846vBtZSOIt0M0Zkp1kkXIsPBlEmhh8W8F2yWs4kgaFmcbi4xaAyjAyJZOwGkmyAcZ8HTIDRuZ84kDRzaXfgdJNzvqOigFibacuT-FKyUI3RH_ZTMOmumtmwfDQn50clMYENR8H_mw0F7QnlTURU1ZpLyiTDFFXzae_Dktrv6nZnJ8UWJdyj5eIiRmGMiPTKjoDH0fShXY-aih_E54OGepgWb3kWC0GSqXpryaiRJWkUc2oCwrWAlkTC-CNgVF5vGTy0UdfQPKdtP99ZElu6t6pbpbw9o47I1nwOjXavLPqIXMjBUoHCu9P6dBv9HXp0WWTGI7eyROQXAtrmqlJJuNtKGFMIXDnxZrOyI-CUbnT0q0k9XBQGIQZu2DpZ-BtWA85yvHGWrsGRj66kwRzkO1MpPs_LmesIeciEUEukEQbGdcWcq0zgih3oij-Gtw3fA2AzJDLTgmo6H79cGePI6mtMELXQBDIF9oFfU1HI8mSlOPKBKJ6qINlL4jZK-2VwQEJY2Mn2pj9TPBByW7n4wYXCZDR7HLkIu1UJMauVN0iNWiyNIkfiATlhf2a0LnBQL191t14Fu1Y-mfbILAOO4BOEDZj5WreWY00BDDeK1VH6ak88O3klgOTFTP94Tb8ce--BbZeyw01tLH2USlo0lTSrKv-DBXDJm22lKQ6ZBrNZ9Y3MpfET1T6Glbg33ixWYPvI9sF4Zv0p1gLttEuif8TohLaHk3tRakJAJw1kyLDydvhR3qlFA1JXWgp6IQaGFslcnjzyoVtjFx4Wo0GpExRhn-Q8I5vQv7n-ALUQLZ2PoFPReORlptDIb2qihlITZUp9PGA_E12CN23_0WfL1XvwWQ5aOAeBVeqg1mJe_QO0XiLdpZEwz_Io89SdA-XPiRukfzNl8OwT3fclN77TVvkGMrRdrj8mUVGzYlCEn8ZRcFWDZw-yRUryQxotX0OHxgPtmvYMCms3KXXUd4ivi3zHlW085IaeQ62AVn_YZuvbDtXn-nvWD_rl7HBslco_SbqCHGwJsQ9corwGR3Wu-1eCZAEjPtASdq_LuQGA-qRjY19MpOfRyNEX-tERvVVeIWD-8Pbm-zUnypf73IWlh1em-sn7AKUFOSBl-Tg6THPsgW84TzbEa-COCuIEUib5H_HVDztuX8vT-5B15dqtEMbyIuiBznCxkXzm3J2B02NoLDplvTM1GJiLcZQ9i-fq-ucIrFc-EHLyiBlf3lgiG_8pSOBNSi3CoWaDi6YRFEi0w3bdnEd37aEp_iBCOh9FRzp6HZKYWEgoFZTY16D4L-z5AtQUlWaYbvTpjycV4lkNmEg82mxTqbqkCONLBBfq6uQTJE3-I-ThJEaFttsoKW4soklOdIJOBCfQOAcBI9m_M67HnS75Vo4-Isgqo1u8LlJOzRBHIvJGTlwf9ryVg3ZSewpMGW_dJupDnWbR4oK1jCQSyIjj12-Wgypi670U8vFP6Mdg9hXFCoaJ7ltsuW0aCH4G2W6glYVK3IUg_MsrTuzD2fjnuAcvg==","summary":[{"type":"summary_text","text":"**Clarifying performance issue origin**"},{"type":"summary_text","text":"**Analyzing registry round timing and CPU bursts**"},{"type":"summary_text","text":"**Inspecting registry JSON file timestamps**"}]},{"id":"rs_034a6be5a6696b6c016a5a282ed9108191a8df425763422a7e","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWig96GnaTfr8_BiWQdnC7769ttjARraUalJCExAx69TzywtKg0M--dbLFnu9zJZp1prAPtITSeC8TifVfTJr2XrClZfkfG2tJHXzrpGTPn2YKSBaT1bFr6otl71_az99zA9xyJzJ4Nv11yQttMUKxCrfIQAWQhHKqAaou5WlH2EBThcHCQI5GiPr5TRz0pX7SyMm79SFpm9ZYKXkuVnaXw62RUgcXn8WtDenV5DDrpoHMTrTmadP8WGNQPcOx5_SAoKU5wZ3VtP_7bk8eZvBrYp5js3IIvQ06klWyGGNxJFwhLvAns4lqKyHYdbPyLoC2mkxu6IQP7_FZfR1Dp2wGKOTRL1Uzn0nJ48Saf9ZfwxhYiqHAq588Xh0uilt9ZlrZEkzDraPFpkMbBRRHvXBd1li-wuLjm3ehXgjDbT2v0oZTlqaIBs-rt0pEpAs3mR-egRIxa_wShkLg--K-drvZ6Sxkw6iaL2N8d669Y0a3yLbKOuOi_rfMQ-AlCRzWAZBLIt513TVGp8z1WeEn_k9ACsSwtMVYhI9b5SIeaKeJlGDO5Dwzskak0ROa8j-Z_iNfGInEomKwAlm_YtMzVqYfpz7ZrYWqoVY2uA2KoexyAVsQ7-FWloY7BCuHVJ8ugwU1v5-eAev-Dmon6zS9BFhzk04AJbzwOILtUwBgOjc0J4a3nEcQ17v6ReXXpgpiT63xC05yaKWEsNPPSKK07RE0P28eg-mB451IvwqgUFXx-GJk7BiA8gq5O3S7oWB9f1eNLrz-asxtJ0WRGGlH3-6Li2uRJEgW-ncXEWyL9l2edHYuJ5EC550DuCt3VCA6MEKwIwNlrrTnybyhjAT_3htPvNhQyBFG8fNKlXePacseECx6psTFghZrVkO3DjHmay5b-3H82VUp1m5JOfW9X0e9KqEBPbkg-BTddj17M7_uOOEZkUI7v_OQsjmiHfDcpCc07eIc2NJbyrt5AfksHqlYGUUyCpgzdt52Cs_JTuoGDvOrORCDj_UQdmAk-rhIXdS0p-BibSLXkKikyVnkOxJZrdR29v9CGa7OxDPenOl_y_3AbHDIuDTW2gCNdD_Em_JASTFjYIZh9SsHHwjZa-gxXS5dM8fu8nP6Gpc0Q96Z_fdpyKtDHD7SJDrQvjASn8g7hp_s9GOUpHhlxM0kG-gkL3MaFKcDIesnYsBjw2DJKigYtiKPQLGO_jY6HusAwaeuM8syS7BnfLbr2CqG4M_SpLh7m0PtnfUDnjZSpf4vGd4_CtcGt2VLe25ZUHPmq-nZo2u6cboUVwnK51k8If03OnetYidcapk9-SixuOdYSk7Z-sDJlMrP7ntS9kaYoFl_cFXK-dusy7O1uJyR7JDBFEfPvEQrQDOkjANbl4PgZK8eeMdio3CbRwkoJl0_Lqptns5Rib9YZxyr4Wj39msoi9rJKtodJ_XSd5JQTRX0PKBrb1lFk_Z8iMIitUv1fguP8YiDOZr2KitsMHRdaMouR8p5Put3JWH2Z9jT4RZLTmtrLq9yU3PWgSc6kHPzGQTdjY10cWW7yqROfmVOupHrJWjqkPrWkSYOwp6j9EH-X2BVKiH66rnO01jVZI7LV-bOkd82A5n_pvNVJFoy9OpRhcms-QLb6lUKMpcwZG2CgU1XeEcL6_NIoSqnI_e02wbz4X66cp9Hpl15Q6kzfqUSDD-PSSeQ0mFsNchGm5jiQh0NJHS2gCwg1IftMqYpJ7MAcv7Te7t4_mqP8PyOMpm88uO8kF3dcabaW2ydrVD_0F8S3iGtMqb7dnCqg5rw1iSK-qIfF6dJhcEh-FiBdpGf_MNZqdScYdFky2OGGYk_mh9L1OSNI6Blm3l6rIzefptvDkicjlrqs2VCeclQMXKGK8AMybQ5_TIg7dWGEcBK-fXVp-_47dSH_l9_gWQnJG_H4yaVEXgLsJ2x7Nq6acskb73ANbOy7JZWpsKDF0gyOPxefZYHL-wrcl5NQYh0Do89-Pq-TFWtjLzODHANBkUU9Pr7x-EyfiopmDOovD-JfBHGgDd1GrQDqMmmx1nu6gqqkDZ2ZHofNhXYXqkLmcZqjHB0In5pUQmW9Q_aXzGMpoD9YKBBRlZVbWedWkWTkiH-swyBT0-D_A7vxwJQaGAaOZk7pgb_IxsOl3XDjcuaz_L-dLagXur_tN6E0WQHLeIDlvO5WGPtYvVWIWWBscN32k2nYxKmoFAacDf-kqTj2Xf9zY=","summary":[{"type":"summary_text","text":"**Counting ledger entries for sessions 50-64**"},{"type":"summary_text","text":"**Planning grep search for external cwd paths**"}]},{"id":"fc_034a6be5a6696b6c016a5a283dd4b08191b012488e2ae0756b","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Doyle project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_wNxngucSD8nLEPy7MuuR4kLE","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a283dd4cc8191b95c41b2dd4a8925","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Flynn project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_NutEaJ10M9cD4D5slo7rp6Fc","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a283dd4d88191a75045e62cb8d02c","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Perri project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_5qoZAkjildnNZ8UXr5ajOOK9","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a283dd4dc819195e1971dbfa077c2","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Todlando project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_TSRJialWdb1dlgfQpkbJujHH","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a283dd4e48191914b5feb46445daf","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting mobile project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_x98tam16NxSHnjb31udmwCoS","name":"grep"},{"id":"fc_034a6be5a6696b6c016a5a283dd4e8819180a1326e40e3ad9a","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Hertz project rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_pQQUKkLgOKyCJtDeqLgZetjv","name":"grep"}]},"duration":33505.067599996924,"ttft":2007.1406000107527,"contextSnapshot":{"promptTokens":201738,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_wNxngucSD8nLEPy7MuuR4kLE|fc_034a6be5a6696b6c016a5a283dd4b08191b012488e2ae0756b","toolName":"grep","startedAt":"2026-07-17T13:03:58.239Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log"},"intent":"Counting Doyle project rows"},"id":"f2cebebd","parentId":"5712bde2","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_NutEaJ10M9cD4D5slo7rp6Fc|fc_034a6be5a6696b6c016a5a283dd4cc8191b95c41b2dd4a8925","toolName":"grep","startedAt":"2026-07-17T13:03:58.240Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log"},"intent":"Counting Flynn project rows"},"id":"25ab2a00","parentId":"f2cebebd","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5qoZAkjildnNZ8UXr5ajOOK9|fc_034a6be5a6696b6c016a5a283dd4d88191a75045e62cb8d02c","toolName":"grep","startedAt":"2026-07-17T13:03:58.240Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log"},"intent":"Counting Perri project rows"},"id":"efb4a036","parentId":"25ab2a00","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_TSRJialWdb1dlgfQpkbJujHH|fc_034a6be5a6696b6c016a5a283dd4dc819195e1971dbfa077c2","toolName":"grep","startedAt":"2026-07-17T13:03:58.240Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log"},"intent":"Counting Todlando project rows"},"id":"7c5dd874","parentId":"efb4a036","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_x98tam16NxSHnjb31udmwCoS|fc_034a6be5a6696b6c016a5a283dd4e48191914b5feb46445daf","toolName":"grep","startedAt":"2026-07-17T13:03:58.240Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log"},"intent":"Counting mobile project rows"},"id":"beb3de65","parentId":"7c5dd874","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_pQQUKkLgOKyCJtDeqLgZetjv|fc_034a6be5a6696b6c016a5a283dd4e8819180a1326e40e3ad9a","toolName":"grep","startedAt":"2026-07-17T13:03:58.240Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log"},"intent":"Counting Hertz project rows"},"id":"2b305468","parentId":"beb3de65","timestamp":"2026-07-17T13:03:58.240Z"}
{"type":"message","id":"a6d638e8","parentId":"2b305468","timestamp":"2026-07-17T13:03:58.243Z","message":{"role":"toolResult","toolCallId":"call_wNxngucSD8nLEPy7MuuR4kLE|fc_034a6be5a6696b6c016a5a283dd4b08191b012488e2ae0756b","toolName":"grep","content":[{"type":"text","text":" 4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n 6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n 7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n 8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n...\n 46|{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":341,\"adapter\":\"claude-spt:ccs\"}\n*47|{\"ts\":\"2026-07-10T05:04:35Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":342,\"adapter\":\"claude-spt:ccs\"}\n*48|{\"ts\":\"2026-07-10T05:08:36Z\",\"session_id\":\"50b0fc81-455e-4b65-8e93-f7400599c6c6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":343,\"adapter\":\"claude-spt:ccs\"}\n*49|{\"ts\":\"2026-07-10T10:22:28Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":344,\"adapter\":\"claude-spt:ccs\"}\n*50|{\"ts\":\"2026-07-10T11:46:04Z\",\"session_id\":\"02db10e4-ffdd-4107-884e-891c47a7239e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":345,\"adapter\":\"claude-spt:ccs\"}\n*51|{\"ts\":\"2026-07-10T11:46:05Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":346,\"adapter\":\"claude-spt:ccs\"}\n*52|{\"ts\":\"2026-07-10T12:07:57Z\",\"session_id\":\"feec8b93-34d3-41da-b2cc-6874150e6916\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":347,\"adapter\":\"claude-spt:ccs\"}\n*53|{\"ts\":\"2026-07-10T12:14:12Z\",\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":348,\"adapter\":\"claude-spt\"}\n*54|{\"ts\":\"2026-07-10T13:12:11Z\",\"session_id\":\"c9c02696-1ec3-4319-8b23-b7f72090fdb3\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":349,\"adapter\":\"claude-spt:ccs\"}\n*55|{\"ts\":\"2026-07-10T23:30:12Z\",\"session_id\":\"ac5baee4-ed52-42f1-b3af-dfdc0f84a836\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":350,\"adapter\":\"claude-spt:ccs\"}\n*56|{\"ts\":\"2026-07-11T02:03:15Z\",\"session_id\":\"9b628b62-efe8-4891-bbc1-f32a6de35e3f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":351,\"adapter\":\"claude-spt:ccs\"}\n*57|{\"ts\":\"2026-07-11T03:30:11Z\",\"session_id\":\"5b71855b-82d2-483b-908f-4b2c3f57db84\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":352,\"adapter\":\"claude-spt:ccs\"}\n*58|{\"ts\":\"2026-07-15T02:54:06Z\",\"session_id\":\"1fae2b4c-9daf-44fc-afe5-06c410ac69b8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":353,\"adapter\":\"claude-spt:ccs\"}\n*59|{\"ts\":\"2026-07-15T10:31:41Z\",\"session_id\":\"5d3eec33-6de0-42f8-8c63-740485dc0d39\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":354,\"adapter\":\"claude-spt:ccs\"}\n*60|{\"ts\":\"2026-07-16T00:36:13Z\",\"session_id\":\"cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":355,\"adapter\":\"claude-spt:ccs\"}\n*61|{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}\n*62|{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}\n*63|{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}\n*64|{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":19,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","count":19}],"truncated":false,"displayContent":"  4│{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n  6│{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n  7│{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n  8│{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n   │...\n 46│{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":341,\"adapter\":\"claude-spt:ccs\"}\n*47│{\"ts\":\"2026-07-10T05:04:35Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":342,\"adapter\":\"claude-spt:ccs\"}\n*48│{\"ts\":\"2026-07-10T05:08:36Z\",\"session_id\":\"50b0fc81-455e-4b65-8e93-f7400599c6c6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":343,\"adapter\":\"claude-spt:ccs\"}\n*49│{\"ts\":\"2026-07-10T10:22:28Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":344,\"adapter\":\"claude-spt:ccs\"}\n*50│{\"ts\":\"2026-07-10T11:46:04Z\",\"session_id\":\"02db10e4-ffdd-4107-884e-891c47a7239e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":345,\"adapter\":\"claude-spt:ccs\"}\n*51│{\"ts\":\"2026-07-10T11:46:05Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":346,\"adapter\":\"claude-spt:ccs\"}\n*52│{\"ts\":\"2026-07-10T12:07:57Z\",\"session_id\":\"feec8b93-34d3-41da-b2cc-6874150e6916\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":347,\"adapter\":\"claude-spt:ccs\"}\n*53│{\"ts\":\"2026-07-10T12:14:12Z\",\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":348,\"adapter\":\"claude-spt\"}\n*54│{\"ts\":\"2026-07-10T13:12:11Z\",\"session_id\":\"c9c02696-1ec3-4319-8b23-b7f72090fdb3\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":349,\"adapter\":\"claude-spt:ccs\"}\n*55│{\"ts\":\"2026-07-10T23:30:12Z\",\"session_id\":\"ac5baee4-ed52-42f1-b3af-dfdc0f84a836\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":350,\"adapter\":\"claude-spt:ccs\"}\n*56│{\"ts\":\"2026-07-11T02:03:15Z\",\"session_id\":\"9b628b62-efe8-4891-bbc1-f32a6de35e3f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":351,\"adapter\":\"claude-spt:ccs\"}\n*57│{\"ts\":\"2026-07-11T03:30:11Z\",\"session_id\":\"5b71855b-82d2-483b-908f-4b2c3f57db84\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":352,\"adapter\":\"claude-spt:ccs\"}\n*58│{\"ts\":\"2026-07-15T02:54:06Z\",\"session_id\":\"1fae2b4c-9daf-44fc-afe5-06c410ac69b8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":353,\"adapter\":\"claude-spt:ccs\"}\n*59│{\"ts\":\"2026-07-15T10:31:41Z\",\"session_id\":\"5d3eec33-6de0-42f8-8c63-740485dc0d39\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":354,\"adapter\":\"claude-spt:ccs\"}\n*60│{\"ts\":\"2026-07-16T00:36:13Z\",\"session_id\":\"cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":355,\"adapter\":\"claude-spt:ccs\"}\n*61│{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}\n*62│{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}\n*63│{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}\n*64│{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293438242}}
{"type":"message","id":"85e9a7b3","parentId":"a6d638e8","timestamp":"2026-07-17T13:03:58.243Z","message":{"role":"toolResult","toolCallId":"call_pQQUKkLgOKyCJtDeqLgZetjv|fc_034a6be5a6696b6c016a5a283dd4e8819180a1326e40e3ad9a","toolName":"grep","content":[{"type":"text","text":" 26|{\"ts\":\"2026-07-15T03:20:08Z\",\"session_id\":\"sess-45312-1784085608400930900\",\"trigger\":\"boot\",\"ordinal\":25}\n*27|{\"ts\":\"2026-07-16T08:00:33Z\",\"session_id\":\"019f69f1-0d18-7000-9d01-44e3ec52844a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":26,\"adapter\":\"omp-spt\"}\n*28|{\"ts\":\"2026-07-16T08:01:29Z\",\"session_id\":\"019f69f1-ea23-7000-95cb-ee768a4c7126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":27,\"adapter\":\"omp-spt\"}\n 29|{\"ts\":\"2026-07-16T08:13:34Z\",\"session_id\":\"sess-34280-1784189614810498300\",\"trigger\":\"boot\",\"ordinal\":28,\"adapter\":\"omp-spt\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log","count":2}],"truncated":false,"displayContent":" 26│{\"ts\":\"2026-07-15T03:20:08Z\",\"session_id\":\"sess-45312-1784085608400930900\",\"trigger\":\"boot\",\"ordinal\":25}\n*27│{\"ts\":\"2026-07-16T08:00:33Z\",\"session_id\":\"019f69f1-0d18-7000-9d01-44e3ec52844a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":26,\"adapter\":\"omp-spt\"}\n*28│{\"ts\":\"2026-07-16T08:01:29Z\",\"session_id\":\"019f69f1-ea23-7000-95cb-ee768a4c7126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":27,\"adapter\":\"omp-spt\"}\n 29│{\"ts\":\"2026-07-16T08:13:34Z\",\"session_id\":\"sess-34280-1784189614810498300\",\"trigger\":\"boot\",\"ordinal\":28,\"adapter\":\"omp-spt\"}"},"isError":false,"timestamp":1784293438243}}
{"type":"message","id":"29eafd3c","parentId":"85e9a7b3","timestamp":"2026-07-17T13:03:58.244Z","message":{"role":"toolResult","toolCallId":"call_5qoZAkjildnNZ8UXr5ajOOK9|fc_034a6be5a6696b6c016a5a283dd4d88191a75045e62cb8d02c","toolName":"grep","content":[{"type":"text","text":"*1|{\"ts\":\"2026-07-07T05:13:29Z\",\"session_id\":\"d5b46b36-ff77-4131-a774-17f6caa2ff35\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T06:07:05Z\",\"session_id\":\"6db151cc-515e-4fdf-8fe7-9f98697b588b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T07:42:34Z\",\"session_id\":\"4c5e8257-ef66-4c12-a154-a6f83bdab25a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T10:23:14Z\",\"session_id\":\"13712404-60aa-4dc9-957b-9e854ac0f73d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-08T06:53:12Z\",\"session_id\":\"efdcbb37-8805-4cc2-9d17-ecc2f85984ce\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-08T09:40:38Z\",\"session_id\":\"6ea67f9d-c88a-454a-b88a-a0e4add41ba8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-08T11:14:36Z\",\"session_id\":\"bdc2d185-002c-43fb-9aa7-953755172bb8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-08T17:04:51Z\",\"session_id\":\"0841835d-f331-4ec7-abcd-af2ba0217cd0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-09T02:04:08Z\",\"session_id\":\"9f809150-e92c-474b-8ff6-ee237b441071\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-09T06:43:58Z\",\"session_id\":\"57495b6e-3f65-40bd-b9b7-a7177ccb8a8d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-09T12:42:29Z\",\"session_id\":\"3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T06:08:38Z\",\"session_id\":\"175d35a3-4eca-4ac8-8885-261f29f277ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13|{\"ts\":\"2026-07-10T08:39:26Z\",\"session_id\":\"0fe6cad5-3efb-4ced-8031-d9a41e22ff81\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n*14|{\"ts\":\"2026-07-10T11:22:29Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15|{\"ts\":\"2026-07-10T11:40:23Z\",\"session_id\":\"5c76a64f-45cd-41c9-952e-158341e9ca7d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":14,\"adapter\":\"claude-spt\"}\n*16|{\"ts\":\"2026-07-10T11:44:34Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"claude-spt\"}\n*17|{\"ts\":\"2026-07-10T12:01:52Z\",\"session_id\":\"26c49822-00bc-4abe-8be2-91f44b9e4fea\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"claude-spt\"}\n*18|{\"ts\":\"2026-07-10T13:14:15Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-10T15:33:32Z\",\"session_id\":\"5377b23a-8a93-4a9a-8cd2-73d2c26c87b6\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-10T15:34:35Z\",\"session_id\":\"b8f52b79-a26c-444b-bf0e-f3734d431e69\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21|{\"ts\":\"2026-07-10T16:07:28Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22|{\"ts\":\"2026-07-15T00:20:50Z\",\"session_id\":\"b4fe0587-e19f-4b78-81a8-c97931c52126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":21,\"adapter\":\"claude-spt:ccs\"}\n*23|{\"ts\":\"2026-07-16T01:39:08Z\",\"session_id\":\"058dcb6f-1586-47a0-a0cd-0a4a085881ca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}\n*24|{\"ts\":\"2026-07-16T08:22:01Z\",\"session_id\":\"c1427211-6e8d-4571-aeb8-30d36fa816a6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25|{\"ts\":\"2026-07-16T10:27:26Z\",\"session_id\":\"anchor-int-proof\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":25,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log","count":25}],"truncated":false,"displayContent":" *1│{\"ts\":\"2026-07-07T05:13:29Z\",\"session_id\":\"d5b46b36-ff77-4131-a774-17f6caa2ff35\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T06:07:05Z\",\"session_id\":\"6db151cc-515e-4fdf-8fe7-9f98697b588b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T07:42:34Z\",\"session_id\":\"4c5e8257-ef66-4c12-a154-a6f83bdab25a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T10:23:14Z\",\"session_id\":\"13712404-60aa-4dc9-957b-9e854ac0f73d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-08T06:53:12Z\",\"session_id\":\"efdcbb37-8805-4cc2-9d17-ecc2f85984ce\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-08T09:40:38Z\",\"session_id\":\"6ea67f9d-c88a-454a-b88a-a0e4add41ba8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-08T11:14:36Z\",\"session_id\":\"bdc2d185-002c-43fb-9aa7-953755172bb8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-08T17:04:51Z\",\"session_id\":\"0841835d-f331-4ec7-abcd-af2ba0217cd0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-09T02:04:08Z\",\"session_id\":\"9f809150-e92c-474b-8ff6-ee237b441071\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-09T06:43:58Z\",\"session_id\":\"57495b6e-3f65-40bd-b9b7-a7177ccb8a8d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-09T12:42:29Z\",\"session_id\":\"3a9e5d72-e4e3-4661-a30a-eb6d97e38fb9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T06:08:38Z\",\"session_id\":\"175d35a3-4eca-4ac8-8885-261f29f277ef\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":11,\"adapter\":\"claude-spt\"}\n*13│{\"ts\":\"2026-07-10T08:39:26Z\",\"session_id\":\"0fe6cad5-3efb-4ced-8031-d9a41e22ff81\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":12,\"adapter\":\"claude-spt\"}\n*14│{\"ts\":\"2026-07-10T11:22:29Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":13,\"adapter\":\"claude-spt\"}\n*15│{\"ts\":\"2026-07-10T11:40:23Z\",\"session_id\":\"5c76a64f-45cd-41c9-952e-158341e9ca7d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":14,\"adapter\":\"claude-spt\"}\n*16│{\"ts\":\"2026-07-10T11:44:34Z\",\"session_id\":\"0c476962-db50-49a2-851c-8f4a14e85a36\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"claude-spt\"}\n*17│{\"ts\":\"2026-07-10T12:01:52Z\",\"session_id\":\"26c49822-00bc-4abe-8be2-91f44b9e4fea\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"claude-spt\"}\n*18│{\"ts\":\"2026-07-10T13:14:15Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-10T15:33:32Z\",\"session_id\":\"5377b23a-8a93-4a9a-8cd2-73d2c26c87b6\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-10T15:34:35Z\",\"session_id\":\"b8f52b79-a26c-444b-bf0e-f3734d431e69\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21│{\"ts\":\"2026-07-10T16:07:28Z\",\"session_id\":\"ecd15339-2c75-4e4c-ba1a-2c25bd437233\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\\\\tools\\\\claude-spt\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22│{\"ts\":\"2026-07-15T00:20:50Z\",\"session_id\":\"b4fe0587-e19f-4b78-81a8-c97931c52126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":21,\"adapter\":\"claude-spt:ccs\"}\n*23│{\"ts\":\"2026-07-16T01:39:08Z\",\"session_id\":\"058dcb6f-1586-47a0-a0cd-0a4a085881ca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}\n*24│{\"ts\":\"2026-07-16T08:22:01Z\",\"session_id\":\"c1427211-6e8d-4571-aeb8-30d36fa816a6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25│{\"ts\":\"2026-07-16T10:27:26Z\",\"session_id\":\"anchor-int-proof\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293438244}}
{"type":"message","id":"5b72ac53","parentId":"29eafd3c","timestamp":"2026-07-17T13:03:58.246Z","message":{"role":"toolResult","toolCallId":"call_x98tam16NxSHnjb31udmwCoS|fc_034a6be5a6696b6c016a5a283dd4e48191914b5feb46445daf","toolName":"grep","content":[{"type":"text","text":"*1|{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}\n*2|{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}\n*3|{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}\n*4|{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}\n*5|{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}\n*6|{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}\n*7|{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6,\"adapter\":\"mobile\"}\n*8|{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n 9|{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n*10|{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n*11|{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n*12|{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n*13|{\"ts\":\"2026-07-08T03:22:32Z\",\"session_id\":\"spt-mobile-host-182524\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"mobile\"}\n*14|{\"ts\":\"2026-07-08T04:32:56Z\",\"session_id\":\"spt-mobile-host-60956\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"mobile\"}\n*15|{\"ts\":\"2026-07-08T10:59:20Z\",\"session_id\":\"spt-mobile-host-162676\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"mobile\"}\n*16|{\"ts\":\"2026-07-08T11:00:23Z\",\"session_id\":\"spt-mobile-host-103160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"mobile\"}\n*17|{\"ts\":\"2026-07-09T05:25:35Z\",\"session_id\":\"spt-mobile-host-179368\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"mobile\"}\n*18|{\"ts\":\"2026-07-09T07:56:17Z\",\"session_id\":\"spt-mobile-host-79536\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":17,\"adapter\":\"mobile\"}\n*19|{\"ts\":\"2026-07-09T07:59:04Z\",\"session_id\":\"spt-mobile-host-143376\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":18,\"adapter\":\"mobile\"}\n*20|{\"ts\":\"2026-07-09T08:01:16Z\",\"session_id\":\"spt-mobile-host-35852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"mobile\"}\n*21|{\"ts\":\"2026-07-09T08:01:58Z\",\"session_id\":\"spt-mobile-host-85064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":20,\"adapter\":\"mobile\"}\n*22|{\"ts\":\"2026-07-09T08:05:05Z\",\"session_id\":\"diag-session-22174\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":21,\"adapter\":\"mobile\"}\n*23|{\"ts\":\"2026-07-09T08:05:37Z\",\"session_id\":\"diag-session-175780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":22,\"adapter\":\"mobile\"}\n*24|{\"ts\":\"2026-07-09T08:17:27Z\",\"session_id\":\"spt-mobile-host-39304\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":23,\"adapter\":\"mobile\"}\n*25|{\"ts\":\"2026-07-09T08:25:39Z\",\"session_id\":\"spt-mobile-host-39372\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":24,\"adapter\":\"mobile\"}\n*26|{\"ts\":\"2026-07-09T08:30:36Z\",\"session_id\":\"spt-mobile-host-22652\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":25,\"adapter\":\"mobile\"}\n*27|{\"ts\":\"2026-07-09T09:15:29Z\",\"session_id\":\"spt-mobile-host-40520\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":26,\"adapter\":\"mobile\"}\n*28|{\"ts\":\"2026-07-09T09:21:04Z\",\"session_id\":\"spt-mobile-host-37008\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":27,\"adapter\":\"mobile\"}\n*29|{\"ts\":\"2026-07-09T09:42:50Z\",\"session_id\":\"spt-mobile-host-40808\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":28,\"adapter\":\"mobile\"}\n*30|{\"ts\":\"2026-07-09T09:43:47Z\",\"session_id\":\"spt-mobile-host-37628\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":29,\"adapter\":\"mobile\"}\n*31|{\"ts\":\"2026-07-09T23:22:03Z\",\"session_id\":\"spt-mobile-host-60544\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":30,\"adapter\":\"mobile\"}\n*32|{\"ts\":\"2026-07-10T04:28:53Z\",\"session_id\":\"spt-mobile-host-46396\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":31,\"adapter\":\"mobile\"}\n*33|{\"ts\":\"2026-07-10T05:06:45Z\",\"session_id\":\"spt-mobile-host-28772\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":32,\"adapter\":\"mobile\"}\n*34|{\"ts\":\"2026-07-10T06:02:53Z\",\"session_id\":\"spt-mobile-host-75960\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"mobile\"}\n 35|{\"ts\":\"2026-07-10T22:21:56Z\",\"session_id\":\"spt-mobile-host-24328\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":34,\"adapter\":\"mobile\"}\n*36|{\"ts\":\"2026-07-11T05:13:10Z\",\"session_id\":\"spt-mobile-host-23720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":35,\"adapter\":\"mobile\"}\n*37|{\"ts\":\"2026-07-15T03:10:00Z\",\"session_id\":\"spt-mobile-host-14720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":36,\"adapter\":\"mobile\"}\n*38|{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}\n*39|{\"ts\":\"2026-07-15T10:21:59Z\",\"session_id\":\"spt-mobile-host-23152\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":38,\"adapter\":\"mobile\"}\n*40|{\"ts\":\"2026-07-16T05:32:17Z\",\"session_id\":\"spt-mobile-host-23816\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":39,\"adapter\":\"mobile\"}\n*41|{\"ts\":\"2026-07-16T14:13:14Z\",\"session_id\":\"spt-mobile-host-79616\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":40,\"adapter\":\"mobile\"}\n*42|{\"ts\":\"2026-07-16T14:13:49Z\",\"session_id\":\"spt-mobile-host-56016\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":41,\"adapter\":\"mobile\"}\n*43|{\"ts\":\"2026-07-16T21:01:38Z\",\"session_id\":\"spt-mobile-host-43680\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":42,\"adapter\":\"mobile\"}\n*44|{\"ts\":\"2026-07-17T01:09:24Z\",\"session_id\":\"spt-mobile-host-46564\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":43,\"adapter\":\"mobile\"}\n*45|{\"ts\":\"2026-07-17T01:13:12Z\",\"session_id\":\"spt-mobile-host-93200\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":44,\"adapter\":\"mobile\"}\n*46|{\"ts\":\"2026-07-17T01:15:58Z\",\"session_id\":\"spt-mobile-host-82128\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":45,\"adapter\":\"mobile\"}\n*47|{\"ts\":\"2026-07-17T05:14:03Z\",\"session_id\":\"spt-mobile-host-86180\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":46,\"adapter\":\"mobile\"}\n*48|{\"ts\":\"2026-07-17T12:46:55Z\",\"session_id\":\"spt-mobile-host-75468\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":47,\"adapter\":\"mobile\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":46,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","count":46}],"truncated":false,"displayContent":" *1│{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}\n *2│{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}\n *3│{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}\n *4│{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}\n *5│{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}\n *6│{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}\n *7│{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6,\"adapter\":\"mobile\"}\n *8│{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n  9│{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n*10│{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n*11│{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n*12│{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n*13│{\"ts\":\"2026-07-08T03:22:32Z\",\"session_id\":\"spt-mobile-host-182524\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"mobile\"}\n*14│{\"ts\":\"2026-07-08T04:32:56Z\",\"session_id\":\"spt-mobile-host-60956\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"mobile\"}\n*15│{\"ts\":\"2026-07-08T10:59:20Z\",\"session_id\":\"spt-mobile-host-162676\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"mobile\"}\n*16│{\"ts\":\"2026-07-08T11:00:23Z\",\"session_id\":\"spt-mobile-host-103160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":15,\"adapter\":\"mobile\"}\n*17│{\"ts\":\"2026-07-09T05:25:35Z\",\"session_id\":\"spt-mobile-host-179368\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":16,\"adapter\":\"mobile\"}\n*18│{\"ts\":\"2026-07-09T07:56:17Z\",\"session_id\":\"spt-mobile-host-79536\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":17,\"adapter\":\"mobile\"}\n*19│{\"ts\":\"2026-07-09T07:59:04Z\",\"session_id\":\"spt-mobile-host-143376\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":18,\"adapter\":\"mobile\"}\n*20│{\"ts\":\"2026-07-09T08:01:16Z\",\"session_id\":\"spt-mobile-host-35852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"mobile\"}\n*21│{\"ts\":\"2026-07-09T08:01:58Z\",\"session_id\":\"spt-mobile-host-85064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":20,\"adapter\":\"mobile\"}\n*22│{\"ts\":\"2026-07-09T08:05:05Z\",\"session_id\":\"diag-session-22174\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":21,\"adapter\":\"mobile\"}\n*23│{\"ts\":\"2026-07-09T08:05:37Z\",\"session_id\":\"diag-session-175780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":22,\"adapter\":\"mobile\"}\n*24│{\"ts\":\"2026-07-09T08:17:27Z\",\"session_id\":\"spt-mobile-host-39304\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":23,\"adapter\":\"mobile\"}\n*25│{\"ts\":\"2026-07-09T08:25:39Z\",\"session_id\":\"spt-mobile-host-39372\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":24,\"adapter\":\"mobile\"}\n*26│{\"ts\":\"2026-07-09T08:30:36Z\",\"session_id\":\"spt-mobile-host-22652\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":25,\"adapter\":\"mobile\"}\n*27│{\"ts\":\"2026-07-09T09:15:29Z\",\"session_id\":\"spt-mobile-host-40520\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":26,\"adapter\":\"mobile\"}\n*28│{\"ts\":\"2026-07-09T09:21:04Z\",\"session_id\":\"spt-mobile-host-37008\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":27,\"adapter\":\"mobile\"}\n*29│{\"ts\":\"2026-07-09T09:42:50Z\",\"session_id\":\"spt-mobile-host-40808\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":28,\"adapter\":\"mobile\"}\n*30│{\"ts\":\"2026-07-09T09:43:47Z\",\"session_id\":\"spt-mobile-host-37628\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":29,\"adapter\":\"mobile\"}\n*31│{\"ts\":\"2026-07-09T23:22:03Z\",\"session_id\":\"spt-mobile-host-60544\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":30,\"adapter\":\"mobile\"}\n*32│{\"ts\":\"2026-07-10T04:28:53Z\",\"session_id\":\"spt-mobile-host-46396\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":31,\"adapter\":\"mobile\"}\n*33│{\"ts\":\"2026-07-10T05:06:45Z\",\"session_id\":\"spt-mobile-host-28772\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":32,\"adapter\":\"mobile\"}\n*34│{\"ts\":\"2026-07-10T06:02:53Z\",\"session_id\":\"spt-mobile-host-75960\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"mobile\"}\n 35│{\"ts\":\"2026-07-10T22:21:56Z\",\"session_id\":\"spt-mobile-host-24328\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":34,\"adapter\":\"mobile\"}\n*36│{\"ts\":\"2026-07-11T05:13:10Z\",\"session_id\":\"spt-mobile-host-23720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":35,\"adapter\":\"mobile\"}\n*37│{\"ts\":\"2026-07-15T03:10:00Z\",\"session_id\":\"spt-mobile-host-14720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":36,\"adapter\":\"mobile\"}\n*38│{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}\n*39│{\"ts\":\"2026-07-15T10:21:59Z\",\"session_id\":\"spt-mobile-host-23152\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":38,\"adapter\":\"mobile\"}\n*40│{\"ts\":\"2026-07-16T05:32:17Z\",\"session_id\":\"spt-mobile-host-23816\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":39,\"adapter\":\"mobile\"}\n*41│{\"ts\":\"2026-07-16T14:13:14Z\",\"session_id\":\"spt-mobile-host-79616\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":40,\"adapter\":\"mobile\"}\n*42│{\"ts\":\"2026-07-16T14:13:49Z\",\"session_id\":\"spt-mobile-host-56016\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":41,\"adapter\":\"mobile\"}\n*43│{\"ts\":\"2026-07-16T21:01:38Z\",\"session_id\":\"spt-mobile-host-43680\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":42,\"adapter\":\"mobile\"}\n*44│{\"ts\":\"2026-07-17T01:09:24Z\",\"session_id\":\"spt-mobile-host-46564\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":43,\"adapter\":\"mobile\"}\n*45│{\"ts\":\"2026-07-17T01:13:12Z\",\"session_id\":\"spt-mobile-host-93200\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":44,\"adapter\":\"mobile\"}\n*46│{\"ts\":\"2026-07-17T01:15:58Z\",\"session_id\":\"spt-mobile-host-82128\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":45,\"adapter\":\"mobile\"}\n*47│{\"ts\":\"2026-07-17T05:14:03Z\",\"session_id\":\"spt-mobile-host-86180\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":46,\"adapter\":\"mobile\"}\n*48│{\"ts\":\"2026-07-17T12:46:55Z\",\"session_id\":\"spt-mobile-host-75468\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":47,\"adapter\":\"mobile\"}"},"isError":false,"timestamp":1784293438246}}
{"type":"message","id":"389464bd","parentId":"5b72ac53","timestamp":"2026-07-17T13:03:58.247Z","message":{"role":"toolResult","toolCallId":"call_NutEaJ10M9cD4D5slo7rp6Fc|fc_034a6be5a6696b6c016a5a283dd4cc8191b95c41b2dd4a8925","toolName":"grep","content":[{"type":"text","text":"*1|{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n*3|{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n*4|{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n*5|{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n*6|{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n*7|{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n*8|{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n*9|{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10|{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11|{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21|{\"ts\":\"2026-07-07T06:30:47Z\",\"session_id\":\"1f9acb7a-3c8a-43f0-85f7-cf0e577b07ca\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22|{\"ts\":\"2026-07-07T06:30:51Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":21,\"adapter\":\"claude-spt:ccs\"}\n*23|{\"ts\":\"2026-07-07T06:32:02Z\",\"session_id\":\"ce778223-2746-4550-a320-9e98b3077b1c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}\n*24|{\"ts\":\"2026-07-07T10:15:18Z\",\"session_id\":\"55befc10-c2e5-45a6-9675-b732672f58ff\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25|{\"ts\":\"2026-07-07T10:15:20Z\",\"session_id\":\"ce778223-2746-4550-a320-9e98b3077b1c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}\n*26|{\"ts\":\"2026-07-07T10:32:01Z\",\"session_id\":\"55befc10-c2e5-45a6-9675-b732672f58ff\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":25,\"adapter\":\"claude-spt:ccs\"}\n*27|{\"ts\":\"2026-07-07T11:21:13Z\",\"session_id\":\"ab18a9b1-56ec-4f34-827c-144947b68957\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":26,\"adapter\":\"claude-spt:ccs\"}\n*28|{\"ts\":\"2026-07-08T06:33:53Z\",\"session_id\":\"64a4fdc0-143b-40b2-94c9-ede7ea392fd6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":27,\"adapter\":\"claude-spt:ccs\"}\n*29|{\"ts\":\"2026-07-08T08:04:57Z\",\"session_id\":\"05349b87-6f6e-438e-bfb0-518336b819b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":28,\"adapter\":\"claude-spt:ccs\"}\n*30|{\"ts\":\"2026-07-09T02:42:47Z\",\"session_id\":\"586ab982-8ebe-470a-b47a-15332f8edfab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":29,\"adapter\":\"claude-spt:ccs\"}\n*31|{\"ts\":\"2026-07-09T08:21:21Z\",\"session_id\":\"6d9b215d-2a35-4124-84e9-9eef2a691def\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":30,\"adapter\":\"claude-spt:ccs\"}\n*32|{\"ts\":\"2026-07-09T08:24:08Z\",\"session_id\":\"586ab982-8ebe-470a-b47a-15332f8edfab\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}\n*33|{\"ts\":\"2026-07-09T23:28:04Z\",\"session_id\":\"b20becd2-4961-4419-956b-fd8b43ca727c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}\n*34|{\"ts\":\"2026-07-09T23:57:53Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}\n*35|{\"ts\":\"2026-07-10T04:24:34Z\",\"session_id\":\"a2476c7e-db88-40fa-9ec3-ce902985829a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}\n*36|{\"ts\":\"2026-07-10T04:25:21Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":35,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":36,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log","count":36}],"truncated":false,"displayContent":" *1│{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}\n *2│{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}\n *3│{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}\n *4│{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}\n *5│{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}\n *6│{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}\n *7│{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":6}\n *8│{\"ts\":\"2026-07-06T12:07:41Z\",\"session_id\":\"34b6748e-3d03-44fc-944a-4d59c47e6723\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7}\n *9│{\"ts\":\"2026-07-06T12:18:57Z\",\"session_id\":\"5de4ef11-0f0e-415c-be0b-cb76f574a113\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":8}\n*10│{\"ts\":\"2026-07-06T22:48:58Z\",\"session_id\":\"4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9}\n*11│{\"ts\":\"2026-07-06T23:15:38Z\",\"session_id\":\"30bb4d05-daa4-4c19-99d9-66d1d16f7689\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-06T23:36:55Z\",\"session_id\":\"89ec2fc3-5be9-4b37-9692-4ff8ea78250b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-07T00:08:33Z\",\"session_id\":\"322c9412-fcf5-43c4-bc35-c8049c413349\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-07T00:17:58Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-07T04:59:39Z\",\"session_id\":\"1f0ab40b-01b9-4aef-bcb6-0672b31b6b1d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\app\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-07T04:59:40Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-07T06:07:40Z\",\"session_id\":\"1e0b078b-0cf2-45b5-807a-cf5b826a9dec\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-07T06:08:11Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"compact\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-07T06:27:30Z\",\"session_id\":\"40232b79-a106-4b1d-a10d-560190206617\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\\\\relcheck\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-07T06:27:31Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21│{\"ts\":\"2026-07-07T06:30:47Z\",\"session_id\":\"1f9acb7a-3c8a-43f0-85f7-cf0e577b07ca\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22│{\"ts\":\"2026-07-07T06:30:51Z\",\"session_id\":\"c73433d8-d070-4f7e-b04f-a9be62c4068a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":21,\"adapter\":\"claude-spt:ccs\"}\n*23│{\"ts\":\"2026-07-07T06:32:02Z\",\"session_id\":\"ce778223-2746-4550-a320-9e98b3077b1c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}\n*24│{\"ts\":\"2026-07-07T10:15:18Z\",\"session_id\":\"55befc10-c2e5-45a6-9675-b732672f58ff\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25│{\"ts\":\"2026-07-07T10:15:20Z\",\"session_id\":\"ce778223-2746-4550-a320-9e98b3077b1c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}\n*26│{\"ts\":\"2026-07-07T10:32:01Z\",\"session_id\":\"55befc10-c2e5-45a6-9675-b732672f58ff\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":25,\"adapter\":\"claude-spt:ccs\"}\n*27│{\"ts\":\"2026-07-07T11:21:13Z\",\"session_id\":\"ab18a9b1-56ec-4f34-827c-144947b68957\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":26,\"adapter\":\"claude-spt:ccs\"}\n*28│{\"ts\":\"2026-07-08T06:33:53Z\",\"session_id\":\"64a4fdc0-143b-40b2-94c9-ede7ea392fd6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":27,\"adapter\":\"claude-spt:ccs\"}\n*29│{\"ts\":\"2026-07-08T08:04:57Z\",\"session_id\":\"05349b87-6f6e-438e-bfb0-518336b819b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":28,\"adapter\":\"claude-spt:ccs\"}\n*30│{\"ts\":\"2026-07-09T02:42:47Z\",\"session_id\":\"586ab982-8ebe-470a-b47a-15332f8edfab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":29,\"adapter\":\"claude-spt:ccs\"}\n*31│{\"ts\":\"2026-07-09T08:21:21Z\",\"session_id\":\"6d9b215d-2a35-4124-84e9-9eef2a691def\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":30,\"adapter\":\"claude-spt:ccs\"}\n*32│{\"ts\":\"2026-07-09T08:24:08Z\",\"session_id\":\"586ab982-8ebe-470a-b47a-15332f8edfab\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}\n*33│{\"ts\":\"2026-07-09T23:28:04Z\",\"session_id\":\"b20becd2-4961-4419-956b-fd8b43ca727c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}\n*34│{\"ts\":\"2026-07-09T23:57:53Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}\n*35│{\"ts\":\"2026-07-10T04:24:34Z\",\"session_id\":\"a2476c7e-db88-40fa-9ec3-ce902985829a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}\n*36│{\"ts\":\"2026-07-10T04:25:21Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":35,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293438247}}
{"type":"message","id":"8176997f","parentId":"389464bd","timestamp":"2026-07-17T13:03:58.249Z","message":{"role":"toolResult","toolCallId":"call_TSRJialWdb1dlgfQpkbJujHH|fc_034a6be5a6696b6c016a5a283dd4dc819195e1971dbfa077c2","toolName":"grep","content":[{"type":"text","text":"*1|{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-07T12:03:43Z\",\"session_id\":\"0ba7dcfd-be8d-4493-bcea-556930f4b70e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-07T12:25:25Z\",\"session_id\":\"3af96f92-b814-4c95-a1c1-33eeee615e34\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-07T15:40:04Z\",\"session_id\":\"a087cf04-b034-4517-bd05-f6649005505a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-07T21:15:22Z\",\"session_id\":\"25677501-2853-4e15-a6bc-dfac88dc673d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-08T01:02:55Z\",\"session_id\":\"de244f53-27c7-4ac7-ab09-d2e7c1cd7326\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-08T17:24:12Z\",\"session_id\":\"d57f9218-f4d0-4670-98d6-3d250517fe8f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-09T04:08:28Z\",\"session_id\":\"6b275a1d-9aa1-44d8-9617-a53a2562baca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-09T07:27:25Z\",\"session_id\":\"b76d3b71-a821-490b-bd8d-9b2cf1bf2717\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-09T10:11:53Z\",\"session_id\":\"49b8a14d-a9f3-4adf-9117-09086762be80\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-09T10:11:55Z\",\"session_id\":\"63fa684a-a93e-4405-a6c5-115f9bccac2a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-09T12:27:04Z\",\"session_id\":\"865cf2a3-f778-49e0-9934-af011cdf38e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-09T13:18:40Z\",\"session_id\":\"1078a652-2825-493a-904e-d11e678e8f0c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-09T14:23:04Z\",\"session_id\":\"c86c5100-c27b-41ff-a2c0-3f42102676ef\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-09T23:23:51Z\",\"session_id\":\"6545f400-48ee-481a-84f6-8b345a202853\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21|{\"ts\":\"2026-07-10T00:46:27Z\",\"session_id\":\"812e5b03-e915-4e2e-a1ee-661d33165f74\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22|{\"ts\":\"2026-07-10T02:31:38Z\",\"session_id\":\"3dc68cec-22f8-4fc8-86e6-cb53d9b1f17f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":21,\"adapter\":\"claude-spt\"}\n*23|{\"ts\":\"2026-07-10T07:54:31Z\",\"session_id\":\"fa4bae0f-ba28-4088-86d4-6708a0340f53\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":22,\"adapter\":\"claude-spt\"}\n*24|{\"ts\":\"2026-07-10T12:39:18Z\",\"session_id\":\"d70e7d9c-0cc4-41fc-a449-82e91f5839b2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25|{\"ts\":\"2026-07-10T13:01:14Z\",\"session_id\":\"cc028229-9168-4eea-baad-be66585c2a19\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":24,\"adapter\":\"claude-spt\"}\n*26|{\"ts\":\"2026-07-11T01:35:47Z\",\"session_id\":\"2e0954ff-f101-4071-8cf6-5fa7dab1c3fe\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":25,\"adapter\":\"claude-spt\"}\n*27|{\"ts\":\"2026-07-13T23:08:49Z\",\"session_id\":\"8247f171-5398-4afb-9a95-d51e296457f8\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":26,\"adapter\":\"claude-spt:ccs\"}\n*28|{\"ts\":\"2026-07-15T10:47:12Z\",\"session_id\":\"9cdf1ef4-61b4-4d64-8140-d117483eebb1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":27,\"adapter\":\"claude-spt:ccs\"}\n*29|{\"ts\":\"2026-07-16T01:48:08Z\",\"session_id\":\"40d414f2-dfec-4781-af87-c282b9dd99ff\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":28,\"adapter\":\"claude-spt:ccs\"}\n*30|{\"ts\":\"2026-07-16T07:10:17Z\",\"session_id\":\"d775ecef-5e7d-49a2-bb74-662ef770ca54\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":29,\"adapter\":\"claude-spt:ccs\"}\n*31|{\"ts\":\"2026-07-16T11:40:30Z\",\"session_id\":\"a939a0fc-5494-4c46-bc4a-dead01317ec1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":30,\"adapter\":\"claude-spt:ccs\"}\n*32|{\"ts\":\"2026-07-17T01:30:24Z\",\"session_id\":\"75f8fe4c-b308-426d-8625-1f1c21e90a16\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}\n*33|{\"ts\":\"2026-07-17T07:15:50Z\",\"session_id\":\"06a08dcc-5f8a-4ff9-bfd4-a428722081b3\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}\n*34|{\"ts\":\"2026-07-17T08:41:43Z\",\"session_id\":\"a9315053-ac8e-4ef2-a769-aab81d8e5835\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}\n*35|{\"ts\":\"2026-07-17T11:39:02Z\",\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":35,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log","count":35}],"truncated":false,"displayContent":" *1│{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-07T12:03:43Z\",\"session_id\":\"0ba7dcfd-be8d-4493-bcea-556930f4b70e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":6,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-07T12:25:25Z\",\"session_id\":\"3af96f92-b814-4c95-a1c1-33eeee615e34\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":7,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-07T15:40:04Z\",\"session_id\":\"a087cf04-b034-4517-bd05-f6649005505a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":8,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-07T21:15:22Z\",\"session_id\":\"25677501-2853-4e15-a6bc-dfac88dc673d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":9,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-08T01:02:55Z\",\"session_id\":\"de244f53-27c7-4ac7-ab09-d2e7c1cd7326\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":10,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-08T17:24:12Z\",\"session_id\":\"d57f9218-f4d0-4670-98d6-3d250517fe8f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":11,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-09T04:08:28Z\",\"session_id\":\"6b275a1d-9aa1-44d8-9617-a53a2562baca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":12,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-09T07:27:25Z\",\"session_id\":\"b76d3b71-a821-490b-bd8d-9b2cf1bf2717\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":13,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-09T10:11:53Z\",\"session_id\":\"49b8a14d-a9f3-4adf-9117-09086762be80\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":14,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-09T10:11:55Z\",\"session_id\":\"63fa684a-a93e-4405-a6c5-115f9bccac2a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":15,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-09T12:27:04Z\",\"session_id\":\"865cf2a3-f778-49e0-9934-af011cdf38e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":16,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-09T13:18:40Z\",\"session_id\":\"1078a652-2825-493a-904e-d11e678e8f0c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":17,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-09T14:23:04Z\",\"session_id\":\"c86c5100-c27b-41ff-a2c0-3f42102676ef\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":18,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-09T23:23:51Z\",\"session_id\":\"6545f400-48ee-481a-84f6-8b345a202853\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":19,\"adapter\":\"claude-spt:ccs\"}\n*21│{\"ts\":\"2026-07-10T00:46:27Z\",\"session_id\":\"812e5b03-e915-4e2e-a1ee-661d33165f74\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":20,\"adapter\":\"claude-spt:ccs\"}\n*22│{\"ts\":\"2026-07-10T02:31:38Z\",\"session_id\":\"3dc68cec-22f8-4fc8-86e6-cb53d9b1f17f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":21,\"adapter\":\"claude-spt\"}\n*23│{\"ts\":\"2026-07-10T07:54:31Z\",\"session_id\":\"fa4bae0f-ba28-4088-86d4-6708a0340f53\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":22,\"adapter\":\"claude-spt\"}\n*24│{\"ts\":\"2026-07-10T12:39:18Z\",\"session_id\":\"d70e7d9c-0cc4-41fc-a449-82e91f5839b2\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}\n*25│{\"ts\":\"2026-07-10T13:01:14Z\",\"session_id\":\"cc028229-9168-4eea-baad-be66585c2a19\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":24,\"adapter\":\"claude-spt\"}\n*26│{\"ts\":\"2026-07-11T01:35:47Z\",\"session_id\":\"2e0954ff-f101-4071-8cf6-5fa7dab1c3fe\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":25,\"adapter\":\"claude-spt\"}\n*27│{\"ts\":\"2026-07-13T23:08:49Z\",\"session_id\":\"8247f171-5398-4afb-9a95-d51e296457f8\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":26,\"adapter\":\"claude-spt:ccs\"}\n*28│{\"ts\":\"2026-07-15T10:47:12Z\",\"session_id\":\"9cdf1ef4-61b4-4d64-8140-d117483eebb1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":27,\"adapter\":\"claude-spt:ccs\"}\n*29│{\"ts\":\"2026-07-16T01:48:08Z\",\"session_id\":\"40d414f2-dfec-4781-af87-c282b9dd99ff\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":28,\"adapter\":\"claude-spt:ccs\"}\n*30│{\"ts\":\"2026-07-16T07:10:17Z\",\"session_id\":\"d775ecef-5e7d-49a2-bb74-662ef770ca54\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":29,\"adapter\":\"claude-spt:ccs\"}\n*31│{\"ts\":\"2026-07-16T11:40:30Z\",\"session_id\":\"a939a0fc-5494-4c46-bc4a-dead01317ec1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":30,\"adapter\":\"claude-spt:ccs\"}\n*32│{\"ts\":\"2026-07-17T01:30:24Z\",\"session_id\":\"75f8fe4c-b308-426d-8625-1f1c21e90a16\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}\n*33│{\"ts\":\"2026-07-17T07:15:50Z\",\"session_id\":\"06a08dcc-5f8a-4ff9-bfd4-a428722081b3\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}\n*34│{\"ts\":\"2026-07-17T08:41:43Z\",\"session_id\":\"a9315053-ac8e-4ef2-a769-aab81d8e5835\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}\n*35│{\"ts\":\"2026-07-17T11:39:02Z\",\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293438249}}
{"type":"message","id":"2b59b1f1","parentId":"8176997f","timestamp":"2026-07-17T13:05:10.624Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Summarizing external match counts**\n\n**Analyzing git process frequency and failure timing**\n\n**Noting pump round scheduling interval**"},{"type":"thinking","thinking":"**Distinguishing failure sources by process timestamps**\n\n**Identifying live pulse discriminator and gating release**"},{"type":"toolCall","id":"call_AjVgq0A6YvJvK63WIxLgHIBf|fc_025b30212318a818016a5a288296088190b38a926882715c8d","name":"irc","arguments":{"i":"Reporting registry CPU root cause","op":"send","to":"Main","message":"Highest-confidence residual brain burst source: registry pump’s recent-project gossip. Every 30s (`config.rs:39`, live daemon.json=30000), RegistryWorker pre_round calls `advertise_local` (`pump/registry.rs:141-162`). For each of 12 perches, `registryhost.rs:488-1009` reads full bounded sessions.log and calls `project_id_for_dir` BEFORE dedup; `spt-store/project.rs:94-124` spawns `git -C <cwd> remote get-url origin` (and rev-parse fallback) per ledger row. Current ledgers imply ~202 derivations/process launches per registry round (todlando35, flynn36, mobile48, perri25, doyle~19, lia13, etc.), mostly duplicate cwds. This is periodic burst work, pre-existing recent_projects implementation (not introduced by v0.37 lifecycle), now exposed after hash fix. Falsifier: capture child process starts + CPU timestamps; registry cause predicts ~200 git.exe launches clustered every ~30s; dispatcher predicts stream-sub-attach clusters without git; 5s livehost predicts lia last_active/info writes. Gate: lifecycle poison/thread fix can pass (post-gen1 zero poison/dispatch failure), but CPU-to-noise gate HOLD/FAIL until this is measured/removed; 8.39% mean isn’t noise.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":215825,"output":1178,"cacheRead":0,"cacheWrite":0,"totalTokens":217003,"reasoningTokens":837,"cost":{"input":1.0791250000000001,"output":0.03534,"cacheRead":0,"cacheWrite":0,"total":1.114465}},"stopReason":"toolUse","timestamp":1784293438256,"responseId":"resp_025b30212318a818016a5a2869c4c08190bab6252aac35e12b","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_025b30212318a818016a5a286dbf848190b479b882bc9529a3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWih4v9xFhYEZzIMfvhtzxBb5S_uIpUmUpxKS6Scm2vx_EZwQ2a_V8Cd5liAaadrsUU-DvrOBBdGqPRjHQsuzP1AoEVV3RKAZt4A3xlObuwT1NrRpzNvYIjxWTWpKRfJczamStqZsujEN3n05ms3ouO8Prwtx9Ew8AZkBPwc5wnaJBCG_vF9D-2_zXo2uYLujKBWVuvQwoPlqr4oB0CNpu910j2q75aFPJjEVxIRRUpY3Kq8MEthe98QbgmaJ6NzuT1KsTtcSXSgaQcXX-cm34MZ-FsOibX_ADvNgCIvpVrhDP1dlpKV1S6pm_vxtPR6AXPoLr3TMnE81eiaILzuNpDzpLUqdsXAdSPy41uMAaL-vZnSmafc95ohiMApoHmaXP6rzM4LwM-6TxLDxmiP2RNWZih7tHGDPs0u_R2iWVTwCywwuENqnoAyc4N79VCgTXX0Sb-e817MLOdofUqQ2JFPoD8imz94DeW-kGbY_WK6RkKVGUscdLIA0rF3it_6HzD188XoVDDlZ6nhvdW6KTDxpFAinKUd-LSJkxrNchoI-mQpAgGnt38Y5w22L1yBhW7epWtwa-dq50f3U90tioaynQ04vNkCCHzxh_4ZpKxTLwX1K-qRePmSGabeSqLcRxIbP_g0HPP3NtcYf1XRT0JU68pwykHTYljdRFF9oGwClXeTT5NTr2V9r7WWKCVpEiGx8YGVUdP0xRiO3OLNS8pcMbnrHkevqeqb3R-sZk6VY4UogsEYDY_bynrvVjAjW5aWV_CnS4Bn9rMPL1KAD-fd_h002RpjzGSLtgRAjny_MFgnfqmU2q_bWp6DxI3NjCMDi_DxYOJeawBisLcdWYmakGqa5Jbfmv8aJbp-nF4nPwwG332jM_EMEN3Qf1ORr5RADm-GNrFQiQpbfoIX8hq49ugiQ1POuRPa8ohxzvoVtR16BnFLwuyK5Po-rlRIvNs7aFwOH7lUS1LSpkjcpsvJWM0fgEsHmV-nVI8x0s1qI5NtTdP9oejukLshi25lo8vcMZLLpwErYL_ZbS34KHkpv4m-W1mehJmCutO1fhYl0lMK9xFZrUKGh9nZBj_PzTLr4JRns3sfllIVby7y6k6HISPmOGALhNLTOIYQNC5hguTUmVVlq1ea_BngUPprfgzZ7FeKLKrfiAp0qWFb_JafrkKyWz-4M0YOmppzzCNYTXoKTZ7ikWmLbdZPUOGGDspZBxAbP0qGcU0FAYWnjLndY0J9-wvAolS8Hg6sNNZxanoZ_NIPhhfx6S-bcMd7hfAx4PdmZFxJsdK4z9CictVooMmj5uKPqEg-JCln4z3xQLtOdXoGGCQAsojME279FmtfmqPXSmo9n_wkr67_bF2f7eNDDuTf2UblajoPAteQLXwOWUY90_eiWjGSLyoY_voUPfalbJrVTcbMheu2_z6wIrw0IgNtLO6Kd0Zo-OG7IP84aO6i74GA89t4MIRaquFLGD8Y9NjeT54-_Wpln9ekW_CVRaTwAp6VzR3sy-Ki1fxpQ1oXK7z2FqNtzUtWxM8Mk01jiNZCJvmrzrhx_tnPFrC5y2BpD8S_Zc_fqChKvxzaQpdJnLv4xy9NKF5YsCOidKAQXJXJVMPGZx0pvvWoRRKhRpiymk1hRmeAGX1x8es7CROnAxIwMZsj1YDt4g_KfVD7yg8N-Ijq8ry1_zVDxW5jv4Ysg3u9ADqNhA8YkhBfyGJ4Q_BhF5Krsw2KCuxTO7ClB4YHFKrQWXcIYIMexACLupD781NvvSm2jJ4iohM6o-fnWDsrRfBzf2m6MD8Mm_50QT9HFgYct_saOJIx9PAU0DcLDAzX486Cv7ttz-SbALInM2i7dT7ZlPTrhwXbVOY0rrWIjPtjI4m3pDKGPB1bpZy5xSgHfwkIq08IBWixVBWpA2FxRVQtfpCZRSG2G6MWiDwPIojkNzlk9uRFCom4N11GBQLjBwMzooEcrA9LT97GztqITe_C-FSbC2wAKhT08WYsDrbASVipNVJYUuhfYla8_XFltivGE9FWRnK0QwmrJhuQ0z8fG3TIHAqb-d2kva6NJTjLCIlxQK6ho1SdIA-yC6LbhJmYXYsKUBrJJnASFOrylCBmjDTK0kpJ38u--AwmR_aoMNPWsa2R0bjIxfzUNPtcRKenvHJkFgmV3_3z4-Lf1NENJ-Fa58EOn7UD9oEclVg99cdhrIXzqnDERTYKOVQ_vPAHJqnZpTNV5eXV_hop7dlhRYZ5C-3LHsicFF-XNKU74ZiNJyA-lorb_ithdyQwI7l1BZfsPPsW-u_2MZwux-z1nQfyW3lt6C9zuM8_aejAQJ4rSoWZqhQiKl4xBONcJSN50LJvUi6K1YnsZAEsG8eQtxLWYAH2tVqAKyj4ZcpAuty2J4T3zkJ8DAbmrJ8xs_-QAUgjESHY0JxY-h-GPBUZwquJDrccobagV7E-L0VaXInuQGWRWbRZfthxH7rrYJ0C_yByffG_x_mHUm-JnnJ7Q0vVMDVoRFe0ow3awE6OTA04ImeFkD3s_vXLZLgB1a0iTFtglaRI8iE1gmGl4pQAz39dCRfsHo6Q7Eii6rhHqMeW0J7Am0QF84pyEdNHzagcMqe-5V7aH7JazDFClstyBztpkUeF-gvQUF6Mih__AiH-ZvnwRPf8kUhNR7dCvAkvcf9X0-T8l4JMogi_HpSRVFLQqT2nth-2ZMLFJxt_hExJjm4BcoWla6pOZ0BzDN1bn8xFB_5a6VLNtfIYM6Z1yihmken7D4tpycmdupCSk9rGNaCWFf5mzsDhyPNwK8bVTi_7shSw3e0GoP5ko71AmKpn-utLgrZ6rWMFk-i90inpASvgiBoosqtvhvrXZnvwCTCDmVXuJzD6Pv72K57MEKg_O-oZmdi90E2yj_weLfyhRSEJRGEn5OxaoowfOwzBjJ40NBS0rTYAZdC3FLMy4yuxRD4E1mXJBLyeK67Mwbci7KzO8DOKM1KjzpBvJ2uGEaD5jUVkp5ydaOxf2IBUJhOKmwZuyKwR5mFWRXWDuRwXUxKn6g3BGG9ad2Ab2xyQOFMjnf084TyA_673WX51hojF45qXBkINNEm_xPnIzGP7ec4er_QlKkywtYcBa_T3C5RkQSXmbmXkt4zwXHKjPRLDT6Muhx2qo2JtEAltfGw1f8lxqurfNnj7wYpgm5hKCcAjmPHiFQLNvcjdCVcXyiSwZ8OiNKotYFrpbWkBnrYTe5u0HZj5gVlG_Z1LAoE7_M3x-7Q0aifEzNtZmIuuopB7Q01UI7cO31SFT94ktQ6hIp_8pBqYy4TBIUA9delaY7ms3G69E7T7FuDo_mXW1wKwGGOjrp84X3RuvTqq3itgSVoR7K_aRZwWEhlydy4lYaYP8ZO8Ycy6evZgTajd_1HT07kJl860uOwq6Du5apVQPBHu0pSNe9oyrz_-J8hYp5dw89KO6BqmOQHPPsfpnY6MUdlPablVbusMW0L_EA_UGvsvoZuJqRQ_noaoWtYFe9d6bqGjUZX2GwAVxYdJur6akPalHy8qu5hoTbZ_jY8V0zRz7mbHY2eV69-2EMTGYv3uxGrR0Ov9B-x5I06pV7AbcVL9vWaB7rakv6qDlwuSEdlOywQ==","summary":[{"type":"summary_text","text":"**Summarizing external match counts**"},{"type":"summary_text","text":"**Analyzing git process frequency and failure timing**"},{"type":"summary_text","text":"**Noting pump round scheduling interval**"}]},{"id":"rs_025b30212318a818016a5a287815f88190b5243967a43a1e0c","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiiCbIFEojDqQowWgikX2CSMMKMr-6qkaGVheDiHTZIBPzW6jjt-mCPsinpVPzB18wwUum3tmsBFfeQTFw2vpSHpBWzS6e3cNCHWx874XKHvs4fIq6Q7Mg84phodQA5Bz2EnJylNVpzPmUyPxI4irKAANYlXAWdenA_CMbF3mRuqvhPITbG7eDg-RhApCuVDlTron_R_BhhXypVSA9VPMzCO6Vgq_Z4FC86JnX9D7zLX1_GtmGTu9eNsnVXrH3vL3QSRJAqMhuaFtlOTeaBN4b2dV_dzGd-xAB5qKNFi4xexxA22y0lM2-igE5-plTSU7hkGv5CtloMIpeAVbZfeNz9mKKbbK128LKUenrlifgwtL-NUHSFJxMotL0sKidDz7xZqHXfz1KOXbreYPWI6i6WBGg_RSLtPovGfV62ijgI-FWU1b9ZbVEisv-IzS6xL1i4DBCt93Thka0xoCtFuyoVLAMtrblvrsQPYKqkxXTfNqYMy0ay_uFWvsgNrAFSmoAS81ujKS-3-VTYkoe2RPIm08zxv_MoIEfZhNQ-EQt_H1vsouY8MEMxHW3WOIhJ_YV6MbMfYv1vrpYavZjxZ2YAF4uUaUmHpl08dQaRmft7mHhkTBCBcjLdYF7lv53JgHqji9hrskwpZvHZ8dVuwcbcc4u84RhEPLrTTrkCCoTHrvxqucO01Oe3jup1OGbJbsMcek1lpvDm704ReezpFSga10LcwqthUEXPT319zXS2uC4MaXCf1MaCAonXOxgmx3GxS92c9OPUaspEZa-jicb5pc8tNIfIDAdJnia2ElbNz241F8QVpQrDbtmhWRcLKUn4HKWfR1nwJQWzpskFq3tQ4Kz7yy5crt17R2jy2wY-DipqBfz6jUEMggch34yQJwaDUS9ViwEr2CdJ7uA5aLuXudJNfXqGQIn3RS4WHwG9zvrkiRahB0wFqM0AO2QJOilMeKZoOrG7I4hEh7lUg2YM2PrbZxSjcJC2sbIXCXURBcWaQCCvYXPissEIN0B5yuzEs3qT5Q8lIwEioLv8WfIzA2_EmeD19_2agAJCtbw-e82AtC4GNM26NIqmpbIiL-UpLW8zZku_wrcU6xuzRYU0C5GFS7zYoWJEAPZri1lpRqXXnoN3ZmCRZL4eaQaseNRkqjRclLOEXCQCMQPi-4GMnlnnt0-Gmlg78IFkbf180SOgfVfF37ipnRfcz6-0itl6Z_k90F0jD89IA8mdhj_MEJZXFGWjVPrXZblQXSafVL75Gg4zSFG0_sELZglw8YlFPIvagWf9Esm5bccclcW8xWaBd4ei8NBulWCuD93gqtqU6hAmj2Myq__JMY-accGBkZXzHfZd7qqFmYGZ75m9MxhYcDqylowZF5-vCWDdndD561ZbkmD_5RGDTytgAPV2Jnr8nZ5hTaQ74Bqyih9yrMwJzeEhOKQzLD3sW5DnWnlmG9cC7XkBzrcXM2BoZcHodfZylAOomIIpwHwY6BBZunwfxwE6lllbgMwdw84ZuJ6vCAJ6fN-_u8_sy2-mH9QPtyDzqlaV7g-aOAW64yooDuDv3pKGA3BFo2EKTkQ7YVuYCLrG-94J913Qq6giK5jAibPzDXGTEOo9WggvRvk8K3p30Mxr5iGfpYbnQcI-raozynptlx3_Ip_k5y5LvyHxQXPCwyycoGSWzRacWZr-4dWk7q5e8lOaSu2UjNBfIkKmjzOr3TbF9I6Fw2G44PQW0kdX2glRSzfJKPtVBQOc4Msa269En1t32cj5DslGWw-UAdJQsGaj8A7QjnDYnQeA-n9OBuVEBfgtbPhNGFODN3TwnqYA2LSTo5F_RnEaFOugrXVb23e5KjNSXIDb-90FyRyzH06JsryLH1iyMsLTlzKfPdSuR3oC3EKfXNYrMr0wL5efDIoGyDxZgel7iHJLZYA_uoiwxvMc7YtSUiUA53Nx-AnVjHSUTR35HH0M4ARtFPI818P2KnGR9WHlfAikXv_QErplu8foH1SPvJuip-kXRJNmATreBxkkkz9FPe9GMSHqfzTwzusxGouFVVLcLjcrtw2-cvhCeagbM3uqVEReefNuCazSqT_zwWxArhc-QNkS4ZOFhjr4qfaGHmpSFJ86ZnIqnTJqZKfSiziVF_L73Z5eCgToSU-PsA9JW-ksW4UIRQoz0ACDdVKnRWs4Dl2DT_Unz-nDUVJi1taY8D8HBLCNBFNskWiz6Peo4gDnhQiRwno5q590crGTYGyN43pm1o8v0w6j3z9Ffu8UGBSNaqlRoe2i6sWcYxBWjHEpOvdwzzDZ39kO5sDmRPRg6XdZMM6KmKOr0C9hSXC_gy2vrQeJJJ6JAfai9kR1RooTIWIAGGVrs9nfPIa3C-RatBtuOb8hi_JQqFwLuzbNv8cW7xoWbiGnV9r7JeNuv-2qlfeTSQSDQgcBMNiGjgNwdkdyZRVEN_jQBaD9Ht1KEHxqwDSR-N8PnoySpx7UvkYdig9ImfdyZqYIA5Wib1_FB_b8HLMmAAHSaMldru50UvtcBZOEH9cga7PjgSisurq__v-vZ6RJ3F8QOrMC77x79vjxa6BmSbNRulYGNTl0Iqm39wDMs4x1Lozxf1lyP-P6MbA-jWdVoWM24TaQ4yfu7Md2ByWRVjnmtIPUabPIyWKZerxtp8i80OGbPUX1iOCtVfihwat80JfgRIDAkis7XjYN4WGT9nJ6gvkcM2hYtVz-yGf5LXHULPtgH0pV8fL023aubBjOSJDU99U4pcaV6Tts__zzPhUjgNY_tVpvFO2p3MBhbZoZMSLleX5ZymezPlVO-UAQ1-16eKCBti8e0","summary":[{"type":"summary_text","text":"**Distinguishing failure sources by process timestamps**"},{"type":"summary_text","text":"**Identifying live pulse discriminator and gating release**"}]},{"id":"fc_025b30212318a818016a5a288296088190b38a926882715c8d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reporting registry CPU root cause\",\"op\":\"send\",\"to\":\"Main\",\"message\":\"Highest-confidence residual brain burst source: registry pump’s recent-project gossip. Every 30s (`config.rs:39`, live daemon.json=30000), RegistryWorker pre_round calls `advertise_local` (`pump/registry.rs:141-162`). For each of 12 perches, `registryhost.rs:488-1009` reads full bounded sessions.log and calls `project_id_for_dir` BEFORE dedup; `spt-store/project.rs:94-124` spawns `git -C <cwd> remote get-url origin` (and rev-parse fallback) per ledger row. Current ledgers imply ~202 derivations/process launches per registry round (todlando35, flynn36, mobile48, perri25, doyle~19, lia13, etc.), mostly duplicate cwds. This is periodic burst work, pre-existing recent_projects implementation (not introduced by v0.37 lifecycle), now exposed after hash fix. Falsifier: capture child process starts + CPU timestamps; registry cause predicts ~200 git.exe launches clustered every ~30s; dispatcher predicts stream-sub-attach clusters without git; 5s livehost predicts lia last_active/info writes. Gate: lifecycle poison/thread fix can pass (post-gen1 zero poison/dispatch failure), but CPU-to-noise gate HOLD/FAIL until this is measured/removed; 8.39% mean isn’t noise.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_AjVgq0A6YvJvK63WIxLgHIBf","name":"irc"}]},"duration":72366.6372000128,"ttft":47518.621400013566,"contextSnapshot":{"promptTokens":215825,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_AjVgq0A6YvJvK63WIxLgHIBf|fc_025b30212318a818016a5a288296088190b38a926882715c8d","toolName":"irc","startedAt":"2026-07-17T13:05:10.624Z","intent":"Reporting registry CPU root cause"},"id":"58b6cea9","parentId":"2b59b1f1","timestamp":"2026-07-17T13:05:10.624Z"}
{"type":"message","id":"a6befef0","parentId":"58b6cea9","timestamp":"2026-07-17T13:05:10.625Z","message":{"role":"toolResult","toolCallId":"call_AjVgq0A6YvJvK63WIxLgHIBf|fc_025b30212318a818016a5a288296088190b38a926882715c8d","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- Main: injected"}],"details":{"op":"send","from":"ResidualBrainCpu","to":"Main","receipts":[{"to":"Main","outcome":"injected"}]},"isError":false,"timestamp":1784293510624}}
{"type":"message","id":"30cd3f36","parentId":"a6befef0","timestamp":"2026-07-17T13:05:24.157Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Refining exact count calculations**\n\n**Verifying external line counts per project**"},{"type":"toolCall","id":"call_WquReoth4mYBr3nBJyKhw0mQ|fc_06d46b5d5adc7d27016a5a289384e48196b7d3011099f4067f","name":"read","arguments":{"i":"Reading self perch enumeration","path":"crates/spt-store/src/perch.rs","selector":"410-450"}},{"type":"toolCall","id":"call_5YMBJWUkT5pKMAhDeWUrZaWZ|fc_06d46b5d5adc7d27016a5a289384f88196bbf1767b4e5fd18d","name":"read","arguments":{"i":"Reading Wakep9 state","path":"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json","selector":"raw"}},{"type":"toolCall","id":"call_xVhfiFHqG1QtsT0TLF7fzIH8|fc_06d46b5d5adc7d27016a5a28938500819688b123aebc0a3401","name":"grep","arguments":{"i":"Counting Doyle external rows exactly","pattern":"\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\Documents","path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","selector":"1-64","case":true,"gitignore":false,"skip":null}},{"type":"toolCall","id":"call_bX1q9APRl9xe0DwFCPOvA2wG|fc_06d46b5d5adc7d27016a5a2893850881969299f3b4e0d79c2e","name":"grep","arguments":{"i":"Counting nonproject ledger rows","pattern":"\"cwd\":\"C:\\\\\\\\Windows|\"cwd\":\"C:\\\\\\\\Users\\\\\\\\decid\\\\\\\\AppData","path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log","selector":null,"case":true,"gitignore":false,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":4545,"output":608,"cacheRead":212480,"cacheWrite":0,"totalTokens":217633,"reasoningTokens":344,"cost":{"input":0.022725000000000002,"output":0.01824,"cacheRead":0.10624,"cacheWrite":0,"total":0.147205}},"stopReason":"toolUse","timestamp":1784293510631,"responseId":"resp_06d46b5d5adc7d27016a5a2886ff6881968f6d013139077638","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_06d46b5d5adc7d27016a5a288869c88196bdb77872527ad8cf","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiiT6QBh7TuYfFcjRxBi7y3li0rV_OXQG_vrEnt0tO9dAa-c1wVt2HR7Muj5SeuTe5Wm6niw5WqlTcjhz34vOPF54KLsHWXMvSR2l5dAOsSnf5NwceOXlXwX0uKt4UtxoSAkYkraA5IaxGNTI51jGF6H6lo-8MXhY8tTVnxpc9oWUT7CJX9OpIyb6XcAKuk7Xs-p0eyiJ8-IdlXRG-eC9OVrTsgrxY2fXZFY5UiXEvQf5qpv-zB9501kIQZjcWehDv-pQKW9IzouIPD6YIfHjCUGt7-1zIW5J62Tpn9HKwbT6FZEXB-807gnnrOoGt_SyXsoQlEhEpvC-_D1Y-4u9W6d-J6ABqv4mJN3B5EBLkHbFYQR_jMrx7q1kbbuPhp7529LS3w82Z1zXH7DQYgrdsxUw6HcK0bC5LFUeVV4x12gJv6lLEfwDChRCHKE88vfAcRw5MReaDXTBxTGG55OqRXEWjL3L1GUYSn-tuoZJO_Z9K4K3VhczYWZddo9P4FuikpjB9rOz38jYeiRIiPjdc6r3pW0cASU59ulCWvfShf2S5VpP_aH_kV7pwPn6AhqJlAeL4NArQIWWGtQagMis7pVbkURxhWFXrOs1sQj4Glff87I-vFTERnHIHMx7pML1WhkaMxNciZxhy4wIABWzwBVdthyd8EC1u6v0peKGuImU3QigKApLwOijsRpeWfop3e4jJDNYPO0hH_E4VrXtDRcZ_S-bOqdFB4JpXJzRckBVWG2uXPN_HPegAIj3A53z2c2tijwchMGa6QwcfO5IyQIgrEaXh6xhGC0CyuCkXKC5sl_2eE4gZq6R9vwLmKzbNdkXVMivZ2nkHBPN_gVGImlaVPn6zM3fsehS0PxWqjrhEwGbYLyOWSU_o7NMliV3YdWRwfMXVrrshIzFnc56UR6Muzemjg4oGXP6wrL1c6EOidby-QpR0EndvvAerTqaACNFfYMhPnUKJ6NZpBXW6VNivjLHau3pRwd_pFszdytCY6ZVoFl630XhZREjaJuL-7cFxgPUNWqO-Kz_YyGEGHnAnUisPv4uP2oqJxKmLDNArm0fqX7QQp_qCtLgdydsK_ciMPOtWFuLskvz3mkeSy_SswGd8pZWgWBxgZRJqz56KS1cFP5QuLhtuqR38XPPYjCLdYjUKeb01vBxy4WAfooOS9PqHCMFf_v8MbWCY307zOMGZXhWG_VdfGhkFyuvBQTHBdRHA27che5RLzCZZAA1i4YXQMwolSUFfwaMnIeO9H22G79fwBqWwUHriCJLJjBrvVI3ytGTH-Ehs4RLpnxVNNz6vCP1xEaVxYIC0Og2Th-t1h6GlJoubOe_Mc7ityO3ep8u8lIJLAOI0llsPxVgJ_6p78dwf1XHm2K7-DSILkYs4BLicR803qzhpzTXxCAssD7McfV-tWJZ5qsYCvyTc-B2SrCUxF8X3hio_BtGzCrygSIXbp1DWifC8f2ziBVT0fOhQT0mIClH2B0RFfZRE0kJZZ6DqcmaxvyIFDyrPv6qmYsLVaB8CYsEmS9XwbgYtnmjTsUv6wHgjPGG7Pf9q-1K7neIi7a4jWf38w4Qj7YIRl9wE2L4r7CrhW_QxRQ0Pfv3PVY8A77Z8t2iWelmIZMpF5Q6N5b_xodBgTkoLne9555x2x2U2UdgQw3y-tzBqtbEDk6jb__hnnQ0eW3kzpkfScEQwlxbXw4l0B34Sz24P3dceUi-I2GBBcpZQZHbZXhc90JSK4zXYwmMMJHz2J7OynVpOuI9rLixkDqfLDZUWxER-IdXkdg7Wfi2cM4uuNV0iGGWzKK7OMkQ7uG07B_xRs7mZLdeCExYkX-lRA0OUGU-bXraERPJxZHabflvcmdL-TbIdOl-aA0q0KTLWkSWR6QLO7spUoeBmFy-NBK49epLGVeTLdApmhfwq7HRFjerwziZvH9ilJcaYsx6lOYVoFfjEZ7edlSb2GPAJh0RuOYUmMvSG0uquaJauRIRhcsIZlUfk6aEDPGlYGkJaui15tI4KCAUaEQfe9_W-xsxKB3RauqqBxrhvs5hKG69WaeN4JeXiiqluCJtl0INlbov3x8LTqAyu4-wUQkyJmknXVwiI6ciz-4Y5Wbu2nkFa6OdRu-bNUO8LEbdXPf38W73i5g7gLLFXkx-pYHJuu2piiYy2zRteAmRamEtVdeFAUh9ZCmT_Q4vFwjj8zQCGCJHhXCrO8ESVAJbMurfrdtqrDZgcOX5nFbCGdu6b9YDCwX-X6dTmQvwvXbDJHomLjw2TUvuG-O-4eFz248IIXZXOlbwGXSgPbdy9O0ecElDRRZnAFEfDJu5v8k4v4ZJ_Nw8g3iJuZNO-EY8zcIpUxeAuinwn1zccZzMr-U_V3g695aDVF6GAovioXhiNHsTg6WGILIPRkgFUFIUd7ygA1_vs1vVtvGQmpYr-Htjk8bs1tspVHwAvsc5D3hnYlYl9_eQIrj5txMhiCSPE_edz01Glkja9nPsBdWJiiDtRjo7ic5lNLnYHaG0M3fftzBtenL8qinljqzbPBF0WbZboZfI7OopHJ7G6mWBHYDRFrSLLb3igrsd3QExa8Cm7I_3GnVjuqncrDvWkwuslUw8CSqJv824IQ5_6GQRD9rC-_i7XYPH15B7BItjm0qLMITA14eKWtQmiaJDaSkqBMG8tg1oE35uOSKFpqUDiJRtRyuG_EjFeSl0LfJWoFD_fTrkc1xcMqykzLWPpUvKZsuL11r8oOEb_Jq54VJRsrI0Bwn","summary":[{"type":"summary_text","text":"**Refining exact count calculations**"},{"type":"summary_text","text":"**Verifying external line counts per project**"}]},{"id":"fc_06d46b5d5adc7d27016a5a289384e48196b7d3011099f4067f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading self perch enumeration\",\"path\":\"crates/spt-store/src/perch.rs\",\"selector\":\"410-450\"}","call_id":"call_WquReoth4mYBr3nBJyKhw0mQ","name":"read"},{"id":"fc_06d46b5d5adc7d27016a5a289384f88196bbf1767b4e5fd18d","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading Wakep9 state\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json\",\"selector\":\"raw\"}","call_id":"call_5YMBJWUkT5pKMAhDeWUrZaWZ","name":"read"},{"id":"fc_06d46b5d5adc7d27016a5a28938500819688b123aebc0a3401","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting Doyle external rows exactly\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log\",\"selector\":\"1-64\",\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_xVhfiFHqG1QtsT0TLF7fzIH8","name":"grep"},{"id":"fc_06d46b5d5adc7d27016a5a2893850881969299f3b4e0d79c2e","type":"function_call","status":"completed","arguments":"{\"i\":\"Counting nonproject ledger rows\",\"pattern\":\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Windows|\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\AppData\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\",\"selector\":null,\"case\":true,\"gitignore\":false,\"skip\":null}","call_id":"call_bX1q9APRl9xe0DwFCPOvA2wG","name":"grep"}]},"duration":13524.396899998188,"ttft":1813.8269999921322,"contextSnapshot":{"promptTokens":217025,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_WquReoth4mYBr3nBJyKhw0mQ|fc_06d46b5d5adc7d27016a5a289384e48196b7d3011099f4067f","toolName":"read","startedAt":"2026-07-17T13:05:24.157Z","args":{"path":"crates/spt-store/src/perch.rs"},"intent":"Reading self perch enumeration"},"id":"77d64366","parentId":"30cd3f36","timestamp":"2026-07-17T13:05:24.157Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_5YMBJWUkT5pKMAhDeWUrZaWZ|fc_06d46b5d5adc7d27016a5a289384f88196bbf1767b4e5fd18d","toolName":"read","startedAt":"2026-07-17T13:05:24.157Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json"},"intent":"Reading Wakep9 state"},"id":"ad4acd59","parentId":"77d64366","timestamp":"2026-07-17T13:05:24.157Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_xVhfiFHqG1QtsT0TLF7fzIH8|fc_06d46b5d5adc7d27016a5a28938500819688b123aebc0a3401","toolName":"grep","startedAt":"2026-07-17T13:05:24.157Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log"},"intent":"Counting Doyle external rows exactly"},"id":"145355b1","parentId":"ad4acd59","timestamp":"2026-07-17T13:05:24.157Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_bX1q9APRl9xe0DwFCPOvA2wG|fc_06d46b5d5adc7d27016a5a2893850881969299f3b4e0d79c2e","toolName":"grep","startedAt":"2026-07-17T13:05:24.157Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log"},"intent":"Counting nonproject ledger rows"},"id":"67b2a366","parentId":"145355b1","timestamp":"2026-07-17T13:05:24.157Z"}
{"type":"message","id":"eb7bfdc6","parentId":"67b2a366","timestamp":"2026-07-17T13:05:24.160Z","message":{"role":"toolResult","toolCallId":"call_xVhfiFHqG1QtsT0TLF7fzIH8|fc_06d46b5d5adc7d27016a5a28938500819688b123aebc0a3401","toolName":"grep","content":[{"type":"text","text":" 4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n 6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n 7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n 8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n...\n 46|{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":341,\"adapter\":\"claude-spt:ccs\"}\n*47|{\"ts\":\"2026-07-10T05:04:35Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":342,\"adapter\":\"claude-spt:ccs\"}\n*48|{\"ts\":\"2026-07-10T05:08:36Z\",\"session_id\":\"50b0fc81-455e-4b65-8e93-f7400599c6c6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":343,\"adapter\":\"claude-spt:ccs\"}\n*49|{\"ts\":\"2026-07-10T10:22:28Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":344,\"adapter\":\"claude-spt:ccs\"}\n*50|{\"ts\":\"2026-07-10T11:46:04Z\",\"session_id\":\"02db10e4-ffdd-4107-884e-891c47a7239e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":345,\"adapter\":\"claude-spt:ccs\"}\n*51|{\"ts\":\"2026-07-10T11:46:05Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":346,\"adapter\":\"claude-spt:ccs\"}\n*52|{\"ts\":\"2026-07-10T12:07:57Z\",\"session_id\":\"feec8b93-34d3-41da-b2cc-6874150e6916\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":347,\"adapter\":\"claude-spt:ccs\"}\n*53|{\"ts\":\"2026-07-10T12:14:12Z\",\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":348,\"adapter\":\"claude-spt\"}\n*54|{\"ts\":\"2026-07-10T13:12:11Z\",\"session_id\":\"c9c02696-1ec3-4319-8b23-b7f72090fdb3\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":349,\"adapter\":\"claude-spt:ccs\"}\n*55|{\"ts\":\"2026-07-10T23:30:12Z\",\"session_id\":\"ac5baee4-ed52-42f1-b3af-dfdc0f84a836\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":350,\"adapter\":\"claude-spt:ccs\"}\n*56|{\"ts\":\"2026-07-11T02:03:15Z\",\"session_id\":\"9b628b62-efe8-4891-bbc1-f32a6de35e3f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":351,\"adapter\":\"claude-spt:ccs\"}\n*57|{\"ts\":\"2026-07-11T03:30:11Z\",\"session_id\":\"5b71855b-82d2-483b-908f-4b2c3f57db84\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":352,\"adapter\":\"claude-spt:ccs\"}\n*58|{\"ts\":\"2026-07-15T02:54:06Z\",\"session_id\":\"1fae2b4c-9daf-44fc-afe5-06c410ac69b8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":353,\"adapter\":\"claude-spt:ccs\"}\n*59|{\"ts\":\"2026-07-15T10:31:41Z\",\"session_id\":\"5d3eec33-6de0-42f8-8c63-740485dc0d39\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":354,\"adapter\":\"claude-spt:ccs\"}\n*60|{\"ts\":\"2026-07-16T00:36:13Z\",\"session_id\":\"cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":355,\"adapter\":\"claude-spt:ccs\"}\n*61|{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}\n*62|{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}\n*63|{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}\n*64|{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":19,"fileCount":1,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","count":19}],"truncated":false,"displayContent":"  4│{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n *5│{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n  6│{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n  7│{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n  8│{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n   │...\n 46│{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":341,\"adapter\":\"claude-spt:ccs\"}\n*47│{\"ts\":\"2026-07-10T05:04:35Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":342,\"adapter\":\"claude-spt:ccs\"}\n*48│{\"ts\":\"2026-07-10T05:08:36Z\",\"session_id\":\"50b0fc81-455e-4b65-8e93-f7400599c6c6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":343,\"adapter\":\"claude-spt:ccs\"}\n*49│{\"ts\":\"2026-07-10T10:22:28Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":344,\"adapter\":\"claude-spt:ccs\"}\n*50│{\"ts\":\"2026-07-10T11:46:04Z\",\"session_id\":\"02db10e4-ffdd-4107-884e-891c47a7239e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":345,\"adapter\":\"claude-spt:ccs\"}\n*51│{\"ts\":\"2026-07-10T11:46:05Z\",\"session_id\":\"039d3ba0-c5ab-402f-b0bf-aef0792375e7\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":346,\"adapter\":\"claude-spt:ccs\"}\n*52│{\"ts\":\"2026-07-10T12:07:57Z\",\"session_id\":\"feec8b93-34d3-41da-b2cc-6874150e6916\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":347,\"adapter\":\"claude-spt:ccs\"}\n*53│{\"ts\":\"2026-07-10T12:14:12Z\",\"session_id\":\"6cf22920-8f60-4a09-9b8d-7d46280f9a8c\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":348,\"adapter\":\"claude-spt\"}\n*54│{\"ts\":\"2026-07-10T13:12:11Z\",\"session_id\":\"c9c02696-1ec3-4319-8b23-b7f72090fdb3\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":349,\"adapter\":\"claude-spt:ccs\"}\n*55│{\"ts\":\"2026-07-10T23:30:12Z\",\"session_id\":\"ac5baee4-ed52-42f1-b3af-dfdc0f84a836\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":350,\"adapter\":\"claude-spt:ccs\"}\n*56│{\"ts\":\"2026-07-11T02:03:15Z\",\"session_id\":\"9b628b62-efe8-4891-bbc1-f32a6de35e3f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":351,\"adapter\":\"claude-spt:ccs\"}\n*57│{\"ts\":\"2026-07-11T03:30:11Z\",\"session_id\":\"5b71855b-82d2-483b-908f-4b2c3f57db84\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":352,\"adapter\":\"claude-spt:ccs\"}\n*58│{\"ts\":\"2026-07-15T02:54:06Z\",\"session_id\":\"1fae2b4c-9daf-44fc-afe5-06c410ac69b8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":353,\"adapter\":\"claude-spt:ccs\"}\n*59│{\"ts\":\"2026-07-15T10:31:41Z\",\"session_id\":\"5d3eec33-6de0-42f8-8c63-740485dc0d39\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":354,\"adapter\":\"claude-spt:ccs\"}\n*60│{\"ts\":\"2026-07-16T00:36:13Z\",\"session_id\":\"cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":355,\"adapter\":\"claude-spt:ccs\"}\n*61│{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}\n*62│{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}\n*63│{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}\n*64│{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}"},"isError":false,"timestamp":1784293524160}}
{"type":"message","id":"6ad20186","parentId":"eb7bfdc6","timestamp":"2026-07-17T13:05:24.167Z","message":{"role":"toolResult","toolCallId":"call_WquReoth4mYBr3nBJyKhw0mQ|fc_06d46b5d5adc7d27016a5a289384e48196b7d3011099f4067f","toolName":"read","content":[{"type":"text","text":"/// `<perch_path>/info.json` from an already-resolved path.\npub fn info_file_at(perch_path: &Path) -> PathBuf {\n    perch_path.join(\"info.json\")\n}\n\n/// Enumerate the **top-level `Self_` perch ids** in `owlery` — every immediate\n/// subdirectory that carries an `info.json` (a bound perch). Pure dir scan,\n/// tolerant: a missing/unreadable owlery, or an entry without `info.json`, is\n/// silently skipped (never panics, never hard-fails). Nested Psyche/Worker\n/// perches live under `<self>/nested/` and are deliberately excluded — the\n/// consent-target resolver wants the user's *agent* sessions, not their hosted\n/// children. Order is unspecified (the caller ranks by recency).\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\npub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {\n    let Ok(entries) = std::fs::read_dir(owlery) else {\n        return Vec::new();\n    };\n    let mut ids = Vec::new();\n    for entry in entries.flatten() {\n        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\n            continue;\n        }\n        if !info_file_at(&entry.path()).is_file() {\n            continue; // a dir without info.json is not a bound perch\n        }\n        if let Some(name) = entry.file_name().to_str() {\n            ids.push(name.to_string());\n        }\n    }\n    ids\n}\n\n/// Enumerate **every bound perch dir** under `owlery` — the top-level `Self_`\n/// perches (`owlery/<id>/`) AND their nested Psyche/Worker children\n/// (`owlery/<parent>/nested/<child>/`), any dir that carries an `info.json`.\n/// Unlike [`list_self_perch_ids`] (which deliberately excludes children for the\n/// consent-target roster), this is the identity-truth enumerator: self-detection\n/// by session_id and the cross-perch bind-honesty guard MUST see the nested\n/// level, or a psyche-hosted session never resolves to its OWN perch and a\n/// foreign perch can be silently rebound to it (F028 C2 contamination,\n/// REQ-BIND-HONEST-SELF-STAMP). Pure dir scan, tolerant: a missing/unreadable\n/// owlery or nested dir, or a dir without `info.json`, is silently skipped\n/// (never panics). Order is unspecified.\n// [impl->REQ-BIND-HONEST-SELF-STAMP]\npub fn list_all_perch_dirs(owlery: &Path) -> Vec<PathBuf> {\n…\n}\n\n[Showing lines 409-453 of 695. Use :454 to continue]"}],"details":{"truncation":{"content":"/// `<perch_path>/info.json` from an already-resolved path.\r\npub fn info_file_at(perch_path: &Path) -> PathBuf {\r\n    perch_path.join(\"info.json\")\r\n}\r\n\r\n/// Enumerate the **top-level `Self_` perch ids** in `owlery` — every immediate\r\n/// subdirectory that carries an `info.json` (a bound perch). Pure dir scan,\r\n/// tolerant: a missing/unreadable owlery, or an entry without `info.json`, is\r\n/// silently skipped (never panics, never hard-fails). Nested Psyche/Worker\r\n/// perches live under `<self>/nested/` and are deliberately excluded — the\r\n/// consent-target resolver wants the user's *agent* sessions, not their hosted\r\n/// children. Order is unspecified (the caller ranks by recency).\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {\r\n    let Ok(entries) = std::fs::read_dir(owlery) else {\r\n        return Vec::new();\r\n    };\r\n    let mut ids = Vec::new();\r\n    for entry in entries.flatten() {\r\n        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\r\n            continue;\r\n        }\r\n        if !info_file_at(&entry.path()).is_file() {\r\n            continue; // a dir without info.json is not a bound perch\r\n        }\r\n        if let Some(name) = entry.file_name().to_str() {\r\n            ids.push(name.to_string());\r\n        }\r\n    }\r\n    ids\r\n}\r\n\r\n/// Enumerate **every bound perch dir** under `owlery` — the top-level `Self_`\r\n/// perches (`owlery/<id>/`) AND their nested Psyche/Worker children\r\n/// (`owlery/<parent>/nested/<child>/`), any dir that carries an `info.json`.\r\n/// Unlike [`list_self_perch_ids`] (which deliberately excludes children for the\r\n/// consent-target roster), this is the identity-truth enumerator: self-detection\r\n/// by session_id and the cross-perch bind-honesty guard MUST see the nested\r\n/// level, or a psyche-hosted session never resolves to its OWN perch and a\r\n/// foreign perch can be silently rebound to it (F028 C2 contamination,\r\n/// REQ-BIND-HONEST-SELF-STAMP). Pure dir scan, tolerant: a missing/unreadable\r\n/// owlery or nested dir, or a dir without `info.json`, is silently skipped\r\n/// (never panics). Order is unspecified.\r\n// [impl->REQ-BIND-HONEST-SELF-STAMP]\r\npub fn list_all_perch_dirs(owlery: &Path) -> Vec<PathBuf> {\r","truncated":true,"truncatedBy":"lines","totalLines":287,"totalBytes":2254,"outputLines":45,"outputBytes":2254,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"/// `<perch_path>/info.json` from an already-resolved path.\r\npub fn info_file_at(perch_path: &Path) -> PathBuf {\r\n    perch_path.join(\"info.json\")\r\n}\r\n\r\n/// Enumerate the **top-level `Self_` perch ids** in `owlery` — every immediate\r\n/// subdirectory that carries an `info.json` (a bound perch). Pure dir scan,\r\n/// tolerant: a missing/unreadable owlery, or an entry without `info.json`, is\r\n/// silently skipped (never panics, never hard-fails). Nested Psyche/Worker\r\n/// perches live under `<self>/nested/` and are deliberately excluded — the\r\n/// consent-target resolver wants the user's *agent* sessions, not their hosted\r\n/// children. Order is unspecified (the caller ranks by recency).\r\n// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]\r\npub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {\r\n    let Ok(entries) = std::fs::read_dir(owlery) else {\r\n        return Vec::new();\r\n    };\r\n    let mut ids = Vec::new();\r\n    for entry in entries.flatten() {\r\n        if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {\r\n            continue;\r\n        }\r\n        if !info_file_at(&entry.path()).is_file() {\r\n            continue; // a dir without info.json is not a bound perch\r\n        }\r\n        if let Some(name) = entry.file_name().to_str() {\r\n            ids.push(name.to_string());\r\n        }\r\n    }\r\n    ids\r\n}\r\n\r\n/// Enumerate **every bound perch dir** under `owlery` — the top-level `Self_`\r\n/// perches (`owlery/<id>/`) AND their nested Psyche/Worker children\r\n/// (`owlery/<parent>/nested/<child>/`), any dir that carries an `info.json`.\r\n/// Unlike [`list_self_perch_ids`] (which deliberately excludes children for the\r\n/// consent-target roster), this is the identity-truth enumerator: self-detection\r\n/// by session_id and the cross-perch bind-honesty guard MUST see the nested\r\n/// level, or a psyche-hosted session never resolves to its OWN perch and a\r\n/// foreign perch can be silently rebound to it (F028 C2 contamination,\r\n/// REQ-BIND-HONEST-SELF-STAMP). Pure dir scan, tolerant: a missing/unreadable\r\n/// owlery or nested dir, or a dir without `info.json`, is silently skipped\r\n/// (never panics). Order is unspecified.\r\n// [impl->REQ-BIND-HONEST-SELF-STAMP]\r\npub fn list_all_perch_dirs(owlery: &Path) -> Vec<PathBuf> {\r\n…\n}","startLine":409,"lineNumbers":[409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,null,480]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\perch.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":695,"totalBytes":2254,"outputLines":45,"outputBytes":2254,"shownRange":{"start":409,"end":453},"nextOffset":454}}},"isError":false,"timestamp":1784293524167}}
{"type":"message","id":"74ac5b3a","parentId":"6ad20186","timestamp":"2026-07-17T13:05:24.169Z","message":{"role":"toolResult","toolCallId":"call_bX1q9APRl9xe0DwFCPOvA2wG|fc_06d46b5d5adc7d27016a5a2893850881969299f3b4e0d79c2e","toolName":"grep","content":[{"type":"text","text":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## doyle/\n### sessions.log\n*1|{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n*2|{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n*3|{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n*4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n 5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n*6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n*7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n*8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n*9|{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10|{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11|{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12|{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13|{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14|{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15|{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16|{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17|{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18|{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19|{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20|{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n*21|{\"ts\":\"2026-07-10T04:18:14Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":316,\"adapter\":\"claude-spt:ccs\"}\n\n## mobile-gw/\n### sessions.log\n 8|{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n*9|{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n 10|{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n 11|{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n 12|{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n...\n 34|{\"ts\":\"2026-07-10T06:02:53Z\",\"session_id\":\"spt-mobile-host-75960\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"mobile\"}\n*35|{\"ts\":\"2026-07-10T22:21:56Z\",\"session_id\":\"spt-mobile-host-24328\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":34,\"adapter\":\"mobile\"}\n 36|{\"ts\":\"2026-07-11T05:13:10Z\",\"session_id\":\"spt-mobile-host-23720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":35,\"adapter\":\"mobile\"}\n 37|{\"ts\":\"2026-07-15T03:10:00Z\",\"session_id\":\"spt-mobile-host-14720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":36,\"adapter\":\"mobile\"}\n 38|{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}\n\n## wakep9/\n### sessions.log\n*1|{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}\n*2|{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}"}],"details":{"scopePath":"C:/Users/decid/AppData/Local/spt-core/owlery","searchPath":"C:/Users/decid/AppData/Local/spt-core/owlery","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":24,"fileCount":3,"files":["C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/sessions.log"],"fileMatches":[{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log","count":20},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log","count":2},{"path":"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/sessions.log","count":2}],"truncated":true,"perFileLimitReached":20,"displayContent":"# C:/Users/decid/AppData/Local/spt-core/owlery/\n\n## doyle/\n### sessions.log\n *1│{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}\n *2│{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}\n *3│{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}\n *4│{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}\n  5│{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}\n *6│{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}\n *7│{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}\n *8│{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}\n *9│{\"ts\":\"2026-07-10T03:31:53Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":304,\"adapter\":\"claude-spt:ccs\"}\n*10│{\"ts\":\"2026-07-10T03:32:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":305,\"adapter\":\"claude-spt:ccs\"}\n*11│{\"ts\":\"2026-07-10T03:33:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":306,\"adapter\":\"claude-spt:ccs\"}\n*12│{\"ts\":\"2026-07-10T03:34:13Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":307,\"adapter\":\"claude-spt:ccs\"}\n*13│{\"ts\":\"2026-07-10T03:34:34Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":308,\"adapter\":\"claude-spt:ccs\"}\n*14│{\"ts\":\"2026-07-10T03:34:48Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":309,\"adapter\":\"claude-spt:ccs\"}\n*15│{\"ts\":\"2026-07-10T03:48:24Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":310,\"adapter\":\"claude-spt:ccs\"}\n*16│{\"ts\":\"2026-07-10T03:48:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":311,\"adapter\":\"claude-spt:ccs\"}\n*17│{\"ts\":\"2026-07-10T03:49:39Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":312,\"adapter\":\"claude-spt:ccs\"}\n*18│{\"ts\":\"2026-07-10T03:50:09Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":313,\"adapter\":\"claude-spt:ccs\"}\n*19│{\"ts\":\"2026-07-10T03:56:26Z\",\"session_id\":\"ab40cae8-7e11-4cf6-947c-3edcbacf2855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":314,\"adapter\":\"claude-spt:ccs\"}\n*20│{\"ts\":\"2026-07-10T03:56:58Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":315,\"adapter\":\"claude-spt:ccs\"}\n*21│{\"ts\":\"2026-07-10T04:18:14Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":316,\"adapter\":\"claude-spt:ccs\"}\n\n## mobile-gw/\n### sessions.log\n  8│{\"ts\":\"2026-07-07T09:09:24Z\",\"session_id\":\"spt-mobile-host-199416\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":7,\"adapter\":\"mobile\"}\n *9│{\"ts\":\"2026-07-07T09:09:37Z\",\"session_id\":\"spt-mobile-host-196400\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":8,\"adapter\":\"mobile\"}\n 10│{\"ts\":\"2026-07-07T09:12:20Z\",\"session_id\":\"spt-mobile-host-281096\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":9,\"adapter\":\"mobile\"}\n 11│{\"ts\":\"2026-07-07T09:12:39Z\",\"session_id\":\"spt-mobile-host-31780\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":10,\"adapter\":\"mobile\"}\n 12│{\"ts\":\"2026-07-07T10:34:37Z\",\"session_id\":\"spt-mobile-host-24852\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":11,\"adapter\":\"mobile\"}\n   │...\n 34│{\"ts\":\"2026-07-10T06:02:53Z\",\"session_id\":\"spt-mobile-host-75960\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"mobile\"}\n*35│{\"ts\":\"2026-07-10T22:21:56Z\",\"session_id\":\"spt-mobile-host-24328\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Windows\\\\System32\",\"ordinal\":34,\"adapter\":\"mobile\"}\n 36│{\"ts\":\"2026-07-11T05:13:10Z\",\"session_id\":\"spt-mobile-host-23720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":35,\"adapter\":\"mobile\"}\n 37│{\"ts\":\"2026-07-15T03:10:00Z\",\"session_id\":\"spt-mobile-host-14720\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":36,\"adapter\":\"mobile\"}\n 38│{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}\n\n## wakep9/\n### sessions.log\n*1│{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}\n*2│{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}"},"isError":false,"timestamp":1784293524169}}
{"type":"message","id":"f1e99894","parentId":"74ac5b3a","timestamp":"2026-07-17T13:05:24.169Z","message":{"role":"toolResult","toolCallId":"call_5YMBJWUkT5pKMAhDeWUrZaWZ|fc_06d46b5d5adc7d27016a5a289384f88196bbf1767b4e5fd18d","toolName":"read","content":[{"type":"text","text":"Path 'C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json' not found"}],"details":{},"isError":true,"timestamp":1784293524169}}
{"type":"message","id":"b5e396a8","parentId":"f1e99894","timestamp":"2026-07-17T13:06:10.395Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Confirming 200 exact external ledger rows**\n\n**Analyzing registry loop CPU overhead**"},{"type":"thinking","thinking":"**Analyzing failure timing and registry impact**\n\n**Mapping failure intervals to registry and notif cycles**"},{"type":"thinking","thinking":"**Confirming scheduling semantics with failure timings**\n\n**Calculating precise pre-round durations and CPU bursts**"},{"type":"thinking","thinking":"**Analyzing startup reconcile timing**\n\n**Confirming second registry round timing**"},{"type":"toolCall","id":"call_BESqCe4xGbkGb6hxi5RrPxZ4|fc_0a2aec7d4fa39f5e016a5a28c1b5f0819781b4125424c53f4f","name":"grep","arguments":{"i":"Locating epoch increment cost","pattern":"pub fn next_epoch|fn next_epoch|struct EpochSource","path":"crates/spt-store/src/epoch.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_0EOjzfWlyw9KjWux44GPO7WA|fc_0a2aec7d4fa39f5e016a5a28c1b62c81978fdf25de72085f9b","name":"read","arguments":{"i":"Reading epoch persistence","path":"crates/spt-store/src/epoch.rs","selector":"1-160"}},{"type":"toolCall","id":"call_L93iZyugCf8ubSNoUFlQgYZ8|fc_0a2aec7d4fa39f5e016a5a28c1b6448197a54d072b213c6a85","name":"grep","arguments":{"i":"Locating pump mark timing","pattern":"mark_ran\\(|WorkerLasts|last: \\[Option|mark-after-round","path":"crates/spt-daemon/src/pump/mod.rs","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_ZU6gtSJv77VX4kuQJbWEQ1eM|fc_0a2aec7d4fa39f5e016a5a28c1b65c8197aba7e86ff858c1f8","name":"read","arguments":{"i":"Reading pump timing kernel","path":"crates/spt-daemon/src/pump/mod.rs","selector":"675-715"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8688,"output":2281,"cacheRead":214528,"cacheWrite":0,"totalTokens":225497,"reasoningTokens":2058,"cost":{"input":0.043440000000000006,"output":0.06843,"cacheRead":0.107264,"cacheWrite":0,"total":0.219134}},"stopReason":"toolUse","timestamp":1784293524215,"responseId":"resp_0a2aec7d4fa39f5e016a5a28951c7c819797c10bfe8f14d928","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0a2aec7d4fa39f5e016a5a2896ed0081978dda4f5606d0b1be","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiigypTfi08yWs1quKgO4N90DzBbtb2rv28C0Zy6EG9TPgNq7FfMG5ShTj127tsLHi6ZBlu79E3q2cV6XcQZ_PBsj-mFhZfSRjJcMe94Pg3lYeT2Bm4-FlWiiPiK32iWAKYDBOs9isZPf16hWXPHkj_hJi2mURrqryRhX2siAuo30dTKshoHFTS2iIXmJIifxiCsoUu4yjEZgog6u09ZHfvV71IAzKE9lZXU3owUYcmspHOM7eJbWBtP8zZUZgvl1azt42Du4F-pL6qM-vYoJEjV3lRK7nZ8-yF4S8quSFmsRxSfpjZLs8306sK_O88TeozdeioUXj1ifHqfiAeDB5PT_8q4gZdfmztIZ10NEkxoygwUvIf0sbxx0zuu8xex5XNiblnA4CjUkRAarTLNEw5ArN5eH9TtgctHddT4It6VTOM1pSFA73FedZYUoPRiu6ddpqdHZA2aZhEGD2ESC46lC_jGA8J-stNGo1o5Dt_6JNHqFiHu6gSTwfmvS489y7hiS_pLy6aShgk3uyOFVBurh_gmO7xzaUopolXSXy2BhyfmfgfmrVrcWPgH59ffl_sERVio-iYiLfsy5uVmsPnnU8VzaTRYBW4YCCqCBptJIxhT4whBJyX4hrk0DGVWCFx3GtQjZUMj6q_RhJVEz1MoyDYPdyQbC-ozoWxIFChferC8b6HqK0QE9KAu7tZYTBXIond6iv8iZvFWM1lvPmcyV44xnh4ZL_jBW5y5tIMv2iFPr6ken3s70reYhpQgeB_Kwp7pXOJ7kfTAtxpyzD5u2XE1S5UdSC2hkgwPCLz6js0crz8BYDNDzpfXDLY5OBTrgK_OVHQ5ItavlPYStAAp_7z55FM7cbtRcc-FkIGsaFuJft6dfrmQn9KzYbag0yVFmZepx6Y3YimFHfTtuAlw-LGxPehoFklqZTcbASCtvKkRPZYHQSUzDk2c7DdgC_hnjxZlo1mNOGAhJvV4aOUxpIbhlC3ALa2QEdymhaj4R2nvj3VQy_MLUYORTsBT-cEjuUpXzm4fnwKMKlLNSZskKd8MWfv3-KTWXX2Dp2kKoBqrMghXZt-i-BPGgIb3nE1y9wMJli6hke6obSdMPUi8mut8k33D-Ks7hCqMYIaSsNsOzJdu5RE-IGKGI23leeaMPX4syJQSiORpGNd7hVDcyO3JQLN-m-JpbhahEzxwcZs5pEMjG8WKleOs5q7mQ-1rpGqXPkQASssZS8gEmDnWZTVbjTJDx9UCfN72t2sF8DlxH0urDNYpG4kKzp-47Tpr4cDhcYNImR9UzDxorNRcysOQFhCDd3Of8bGd4Qv0d66_PQJP5gHqnKvgZkcj1HyTddAbbIdLH5dyk_u_zYHti9Ym6I9YjYVWNJlSmuiW7uIaTvl12Qtt8HEQPqh-8nIKu8uXeT3hhM9qoMFK8HbT636FQUW8Ks-S88y-goC7uhFp0nwOr56HzTa7PehwmzMYkYtb0pQtjIG-do4Ct4A5u-DVLMe5x-rsAvZSUtVkNmb7XEMerrRResvgoryIA8LVhBA_OYr9vFta9dmoJdiu2UJQkkM8p_t-khHI4FT7uWEdgORQxZOLrbZqFgn709u948fqQe6UkGDnmRJYmxK_zkYcLMtS4GvA2Cphkn4MXtG2DZrZ7tQu0thEIYstquGuofeBsgVJwrHryGKKikwRu6xe0GrrJal98q-_QKvtkt4xOV8-E8w4ydUIvD07tIoQUsriLslyCuatVpMvys7Q_xbqVvtNxbaGASi6HfkyyhlC038RX1p1sGcKVpTPz-_k2pNjCj6Oei3NwisTE2Cg5JzQziA0gE0aMb2-ogSDS7hyHMDhADeCAB3eHzcMFv2BheOrWrvxnhaDbxgk4HAWnDFJeDc_yrB9XaXrgYiXVUbzAiwhT9Faww7ONjMPheTHxS0XaED4BdB-79u_cPkUEZiB1sBU-1kZSknIaqJqbee9Q2kD3fuSSs3hl6yBfxDOhlpcyuwfZCM6t7klGMjYCL_RHtwytFGBQ7xSU9jICMGJCorBuTfZu7lqJCk3XFj0DwbvgusTKsMwNWnpOovzILzQ1y0Rjuwy2W8l68js5VA1iLSaeL5sib3kL9RaH_tx2phieJDMKZ39SkYKzDN2wEqYJ6WF4bMaszaQulQfrr67P4Whi2Z-lg92eS5yT7zbh9hpfImpTvzTE81aYsscOMTzQOga7V7hJfGaN67cFS7eMknLSsoKEmFYFpPaDLngjJCt8lJsidtVSf5GueTlOFR2uIaS09WtOm60kEWusk9atmLYNwwWq-0ko4CAa3nsW2ZxQoIRHSsepSHBh9_msNCu3pepZ8yRzv8wq-O6McE24f4lzZHpdmzaKlWrH01i_HIfoOiURbQ3kYoEYwW77OC4493NhWXsoyceUHxss3HVPbbYnH6devlKS4EfMil3lHN7ugRCtBSPlxpArKJtJT1bzRzRRjo1HfsXt_yG9Fi43lZU51EUu3mxfUTGsaG5gSSNKt4pGXjRSYdRoGiIcNynUCWNeOiO88rSMFIpMHr2IjICsu195v5z_qYZPzD9I5rMpo2oQD5gCAEEbK4Nn06BK1nwvNyKTmza1aMwefwKvZLGRHnPXeoq8zjXipZojYVvipoHUshLfULKXyHmRAB0x1WiMjhquZ4oC97ex6TaI2wNveUAChfaV_yPuNtAt9xVaYyT9iVJ2PX02tO53lAZ0vG1yAWDHignrmn89Us5IrMQpFum4chCp_JUO6_j7qBysC7-J_wZpzmaUzetiPYGp6U3ICdU34ekm6hynCCHSs0IgLqUhj20pTcogjnVEMdH_uTwV4vJIXypfE8pBfA4CtW6OgGYT1rpkCM3k3NXmBCVEDQ3py1JFbu2ncgYl97fOD_dSXgM0UWc0znHGu7wjLY89y0G6sylX2e-8-fqZNilIOT4MtdDVqaFda2HzF6h6sqQX_tKFlnWap5xcX8en8IwhGlylPZRUd_7x_rexvhcVIW-6y2RuUCBHi30aNZAEcXR6tiLanG3U4slWcssRQRWsc_KMVu1YMekbs7V4i_BALUCibiG8KJuaCzTD8lpPu_uRkB_QH9k9YTaOAiXqkHpdSo9sTDFNEh30ao0rH5T9l5Mwz98lTJqML0dNfKFTi6KkmYag1k2CpulaY6sKE-LB9cTnF626NhkrBaGOyFifpL-K0vMBTC7x3hhgXt7LEkO1i5UMcFRN0_k14vV77JF75PmojH-F8u23_QE1S_v4rL30KlsGhkKDVGcsowbfmsBesvR4Xc2JlugMBm6zXc1Rs6dDOlwASKT_cQxd7jvITfRale_hLnsnJHh697eVrLhqke9ROahFa_8g4_soaxWBOT8qkgx-p97Aswl8VMrTzkUfUBZ-9b92bUaSapilupbM51M7PXk6X4iTs05fam1NHxkPVNv7WEsPDd23mn20eGp8A4tOwCBTg2xcVVY2xaj5jh1VRVskzEq5xN0I9_aF14azc9lP5A0TowDNamnVo9PxlyIAzvxgnkMI2o-EoufgAI6zozsFUq4RbZd007M8_stfTCL7bX8ZWc=","summary":[{"type":"summary_text","text":"**Confirming 200 exact external ledger rows**"},{"type":"summary_text","text":"**Analyzing registry loop CPU overhead**"}]},{"id":"rs_0a2aec7d4fa39f5e016a5a28a075988197929269138b76c5b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWiiqg2r3IwuEdkoXmi5h_9ldOdUmHCsX1rap51CueeRk7lbhgjN-Ws5k6fn78J2Jz9vtTf1ZGhfwux6zkx3r_39YP9ZkIS_o_HEPp5d-6gyz0SnvR9t84W7htwc9xuMxhO2NuWhhR30XurN3g5ht3QZMs0wYysS6dut1DUsJ7VCPvyH660UyXr35w1Sa48-V-ltDuIh3xAy8NOqP71M4a2BqNiQ3OwnFALd8qeswf67xcwy777ds0dmvVZ9jLDoZ22I1oWG4g8EQpQoCdtdUhMj01KKmDg1VX_WJqEm2VDkMkuyo-xuKtNRZ4GILXzA_XNUGEduWNu2gOuGlE6hbjpPWRNltx_KuR_RmUZ0rM9Y7rlZ55wNnmqjXN4mCdBX9WouJ8J1Kz_kb7slQ9RRrfyl7mhNaV5kaNPHhloN1MBP6EP3gyrYxJkCCMcnDUwVWgj8TtcXv2TSeoR1wh9dUmBJ0iTz8EBAWMW3zewkG3x55j-O4lr7X59lgcWZ-E18684t9QJdey4lzkyCHwA99VkStTf5Enr9bSxRf4jsQzQ6ukfys1votjaN1Mkyo96OYc75JGdSWlpgTxc7zg4PbtRathxT5-pCjobknWPtqt9IDYUhiZM5Bl0X0a8ayhRyQNUAso5eAdsVp0uJFSE8FC8ThQ-MsdjvfqnDTRGbGAISmoDeN6WQRnAxXX2kRd9A1fArzF9ikZYCAPyG2hGt05wYdc9mCP-1ltZzbyXxgns4k_6JPtsU5tH6PKT932HjVvNQ7BItYbpUSIn4-5pFyCIh8Ud6S2EwAPANsrTEOFEBO15aMefV0GczPj2ZD-DRO_AMCH-Mw6yjA7XKJ2GiZeO4FtkEPsGrVmfdAEXBOvjb9rizhlqloB9YpzqJQ7w3LQV7A5Y_hYmV2B7fRZ28d_7_o4z-rlyXQAShjDHwxtmzP47RzNACGX51f4MC72pm-urzTgadBQE06UPQuiWxbnwI4CN8nGr1MJcZ8DgNr43aZ72KzTd_005Cb1dVbtXiOf6lzzs_YzFhyQR8meyP9Wr6RXcqX1iTa9LcY3dPT7t3jTmXqY6FbGSubun7Q057krlLWcZKaOWYV0WbMRDJFLmbgGnMFUH6fFvwi6NEiF_ClAw9oquA52vMcNSLD2KfPuhjJLLuSjYMt68v4IDLYgX04SBkmem1Qj1EWAE-BJHlaoAvThICynJWmqwaVROZEkIqzFuDDKnc_nq3Y6RNgUGs47-d1Fv56Mri9bno0HO_znISfj5JaYzEVUHGtwoNcFkgvFsJN_40mH0kp60r-HRwcAwCRe_UvtQXMqJtxvj5a2etrF6IG650ADZgipJJseB4XYSsApS7L2GWQaXkTAQ5xd9KH-RepNj8hwHpHDG6JqOeDGfEI8NlyxskDLBrHjzlEmHEq7LqF039xaBhBytuJvb9iGg5O4zSYYxQk1oNi5KaFI5LZ58L1TSYHfAqorzA4ToQDhdvdz2QdxDC62FrDZB74FAyUDxClkOssdlmD7LO_4b4e7W0FSVaFxP7tt0wvEQRsFT3w545SGxThJXq0nPzXR1yMq7VXQxKbgyhnA3fX-Znb6KnCJrltMsxXNNccv-TkoJGUGRc7xgohTbBdNzHx_dnr7MMp7Lg2-oG_HsaOrlcEigyPilUghX4mBUCc4hAGTWS58AlEa7a9_mqVj6RnMrIJ5WP4BdMVS1jB_ANZ3viZ1vu4NxKU9h8sAPDpSnxk1geUfgnK8FyxO_RA9XwtTr5uDxDGX-5ZK0b3wFP3t3kjRCZsh6TrqlDT8PyQmtM_c1TV2VFbieco80iXjIESn4yOCmVpuS9fmCPpjomjASKHO0_EiQB60ZQHSr5i4gjsLpIonKKcwpARHjjzRvS7pXDfHygyGgpgctItGU-CJDH-nKwHdFyicKce6vijtsnMd3Jl246-olhi_Fzt6oIiHx_KXQvfwxvsw41pj_0__P7YUaNdlxtjLXDP5jl1MYL1UliOX8dfwC942YtQ_bnAbJs5uoq7n4cS3JB4p4OJcXPIFXRW32bHgAGPPnivyXclKUaOEyOeSh4k7ly6EGvri3HKW73RxLw9K9ClDB0mrQf9abpm3XEKAt6W5hrWRu-ocZB8ANs32__OvItc3vNuUIYUT3HXQ_wiUGgYxjUbm_iO6vP4KDCKDxnQX_sRAd2hO7sjyoOzrRUM1y872fE-Hz9dhr7_TqYziDooz0S2q5lsu2x4bt27_UNxb4Ip5A1nfBvya-a3jhfGC8RP_AjFNb3TpZoG4_78oo3tL7xWXibjvNKOo_39GqIA1kwSXAz7Y14CgIQ3xCYfNtXMBKFiGnl4qPWQyFjONCyPrr0lFVWuMsBogiQG69LK__CZPzBzLWTH-B4h2kzQ9qHmbCW375mzk1U8gi6CmnO5uA49oxJfBsqzVWBXRU41GEQqA4E6k5Ede2Rfb16_d0IpVSRkGx98SRAwyKNROSnnZMh7B4G0g9EqOXqmlkgyG6mQuCZfboI49PBXI0-XpSKs8NVS71LUS77y9B0PzjJxgzu9POWrXGe1hFqxZYIYOHz9NidAMMTUt3iOKK0A4AKMo9LjTw9Y96f0V9jmaagQLfWe3zFE6vpAVUA-Yy-ZDVXt2_fioAdfFXum9FWihsEXHd1VNB0IdeMbKoBzSn4uS1TGP65UiOqL5Uri24wdccixqfxTn7Z5rUU8HZVeM80UGrdQdzPi8Sjct5j7Aw4JtNR6aY4zPaY0y-te5DHtA16V8GLpcXB_aWvrkk3e8Sx_adWvC3AnFAMhsbUKcAdb9-PDGNW6pmWj_aUSMXBNvg37vT_EdOML2DQpnDK0S1Dl-0-ZuTVl-kMfoAFmc1MQf2ab7lMAaUi6n9-UaXt5JvdbGVXaxP9ZnDabww6Vv2IhLAiLw2JEz6zQJxGE8hK3jE_BdwJcXNxTohiiuiaOtHc2vs1Dr0P4bzwqv6Q7kMlCNoalWxd2LvW7GtsgSQxnq9rad9nYQUO-8FPF6D9lPChneviZpy3TRjo9RZg4OAhOEtUWBg-OlBgBd_StePIZtnoBRClgX1_eEILnYGVV1_DJykCtN-vQQvVg8GeZ5plnLTHonpgunQfmczbV-dVOq9dgEfQEwM8P-qEHYnvg2KjDBGZdIWBwEaiseLjELj_7Z0UTwovM6jv_XDsYoY1QDENDDhw7BKXZpZpDHdwbruOxDfeZbogYrUbTGZAZl1HheEWHwJt8wjsN_3RYfi5Ljh37j_1vVl6wheNg0QX0yJuBys1umxXz_HJ4DqB7fCNBdKWm-XhsjkFO8GP9rzwU2xURRvuM0QLFdVa9uOIMxYTz0WHxojzHs19HTn2myRFAga0_GHsAs1a41MMUJrtpyixxem1x6bOkSD6hqoO4BZQq8qXy9-pFYPBfjP_cf9T2K2Ifq59Ao9a-BN2dFh6AkmVUW5vjbmWmqVPajvCBQy7b6e9zkLctQY757EyAWm4DqSdd701AU2QuMP6GKi7hMBs=","summary":[{"type":"summary_text","text":"**Analyzing failure timing and registry impact**"},{"type":"summary_text","text":"**Mapping failure intervals to registry and notif cycles**"}]},{"id":"rs_0a2aec7d4fa39f5e016a5a28aac8dc8197a39d23076f9c9789","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWii0rCC0WqWPiMaOApdbflvBrjkBpKVbUXDL-yIgQ84kjRoCGWTWUAMp3ZApszNNI73xesqGbJ2SYww9F_9cbOWxIXNA5tMtfi6g7ggmiLopAJh8Nu-h8JK-xFoszi7o22s1atHzBZTW1eoVT6oknDQHCox4vsFMEtCp6iIbsq4yIpCF1wWvJSc8PAWtwNOjrhsWby8xJQx-1l7v8NFzzk3uxdbGFVhP2NerPJ9z0hTk4xGm1KQs8fNje8R_wELbLv30B9PgPdlyQrOndf5-XXinirExGhHwWWzvKjNxqV0z-5nhIgfgV8x150-b73lqIw4XTf5A7jzDjGCM_dmlHCGDEI44kEW0HwLGfX1DhmSW3va3WNB-oUlR444M59QrWKXV2SFSlF0X-w-bFS9YqFIR013j3K-ZYPbQDgx7GpymN7nXLQnULowzSDug0tqbRHCZ8J1gjSG3FzsmlMhiuVneOxkvq5hlpTGNbY6gP81R1yc2VN2Y3CfwmbMHrLUl7BJdCMXcP99jtwFLr-sqZtsMSND8xg2QgEDlVCJnM9TbTRp5sgZNUjybmS9kQ82uK1ibZKmZnQVQZT5H3wWdukcGZcsTQl1t9z165vpLzAhjBrZL_IA0KDc9u9h5-R2ExJfNgPSc5BPVgUUEmQINl30h8V14-ncgLY7t-TDk6P-xZYF_NvdPJx9Zc3qAH7RjHXOJhklHYueRkjKUk9IfkzIksz6ZX-Oiidcw-SP_41xVpNGoUM6KiycpjlR9aPnT-3F0WPUfwUq1nv-aolrHvP-KwibKayA29sgVRtuP2qh19hyyosKV0QpIcJHMZF0zQUYnIsuVw2TD7duUCQK5FYzPn_AUK8XQDG7sfbkDortO-XwtDv_DPnPxVj_dCmnrBntSOs-NjAbu_7ZyNcj5DN4AW-FjwlyAlOS4POQ8_BIr7FEgfFIb9Xvv_XS4LArF8Hv6uNEk6a_Q2Ayd654AMKCZOo8pyxPdpKMqSs3Atjxt1ZhNcmGXMWnkfrRL6AxMDpwObpdArlROyTwk6TmnS3O_1q8JC1KfLgMwvU7WTzbIbtnDw7B-JLQCnWJ1DWg40s-yUPbEp_am7uy-dLjLaPyUo65pwQKGgmyCBXOw8jfnvH8IMnFUyaAUn980PZEtmnczjjSE4FAI2BXB5wlzei9tF7CxqJtlwM1HE8lfPWQyDOqaLYjhsjgSuoJcrn_9AtpJ9cd-qcjftrKN-vD2MR2zIB6pgXMbK1n0w3_Mk3aTRElnW5TAKxVxOnXf8dq4o-r4ja8b6OlcyEPJG-r3ZN6TfeJv2odSRqiALFj57gEMf9SQXJIZ619cp3nrnY24tNBCxoWos6Q7ycEzHVj70vXf6J07ym5Fetxlz_awVTaIxBwBZ5W8EjcljzS9fCE3gSyjOkbI2AZ9XLuuTDS6DgMPoilOFfmD36fcwXc-fPNdUXAWBqpcCssohNeDPGvjkHUPYe-wY2ni0XrAqwLp538ahnpILyORGpXqAJAXaJLhnfRGQ7SYSmnzy715GZIi2eLkyoLczC52un9HHOinpGCp0sDMOS8syhNm01lCR_KjtXLJ01b2UfQ6mUUDUW6fIyEBnMqA2jyt631emxvm4hPB9zXAgJl44BLPg7_4Tt_6NPOWlOr_DNFP-tVILuJOgiNNKq1pGlH-Ual1lStpgPtC_UK_CDxyF2jkdSkYznDmAiy8j56kffMXegV-xEf8tYwf--WRo0mj9WmdiQBWqQND8bvxYbeONd_mzMElhlG9tUZfG2iY-73ksF8821q4fkSnMaGHjPFvooafoOqfLsPypqU4DK3Qjy3LTka7jV1UWN1--BiymH4pVkv0dso2rOHSu5PbMG6zvX6tLOQ_i-K4VtBi5scfth6QcYvDZTGxKvRpH5IiHfGhk7dpTJK-bRJk6mTwaxtJupQ1AyC9J2LVAC5afW4LuWTTpven-cvsZ4ekyKD3zQezy2Cp5kEVbDcU85qotVT6s1ie7Rsf0cd8pC4_0s2jl-rJrDTI5VIhAqSLxeHDEKxpuHoGvGMRan-xCAegHOh6q0OamHj3d8WePMeU38gA2-QWcVnGWy5lH9Sg1Nw7YmKiAvLKEBQsM1UyjIiUrJGWuWhatXTjRTPVWElM0jmEo7ihswy7j8Hu6W4i3pfqkaAhMygvlVFY437ls6WlFOvFz6VwkKDU8andcUzlNBJBjMHHJrlaJf0qh6SS27V54BKtu6boDscCP4fFAoU9D66BFAws_h_oOa8a9UOSLJVIVhucodatzzheRADfcTfJy7aRzz2CF9UAeC2y9ZmExYU8ebr5bpdDCzwT2g7cBeBrwCIGKofHQujgoVxTqmDagzbM6PpPLvjc-QQLjZyYavkAJcCHWTMVH7MDdwZw0_tjC6H2l-erabCZdUKI9op-5rerSR5-w9LHtAzTQTXHmQZivIJj6nj8Ww7YCBbPSdcaCzWNsmX0UR5R2g9WPivwJ4Z3P3LDP_hz1NATV5HEmYAYmwUzAQf9wybkX2T3MWLNQ5YTjWO8sdZBSxOocpQeAN4lor0rOVsGvTNmGlXwyNdfmNgyrDwHM_IVFPLzigCz4tfHlpWwKjHaj6cRUioa57ZqNJsdU9mgAbwdscwH50vdHN-8kcZ43sXJlJEBZg32Hn39Vri8OZSSxmZO_oH_-rtVMqrbEUb3u_zeORfo1KE3iZMvRPPWuJ80vl0C7Yx04-p6e4TQCVVgxe6IUDR5cbpeLmxUmngRcilPJy8eP_q7SBDo2l_9lxaZ7pggWBd0dPWq0RDrvCD7_7ZXshm_bYDQO7F9H08n29dAmzez7-OToNbl1nnIaiP3z5FHGFbDeljOc21l_m7r0_nQErGlltWdiNS8uHbaA54ozlMQpFXuTnjz2cXBtGZCSuI5Lqb6jrjJvG_CHGj8CPa0DWq35IbR6qQpN8MuEf76INT9vBSaGdqn1tSoqw9mGoU75sVtTcqw55HvjC-27kJEB-w-x3U_ynXho4e4xbCHyOfO1sEHQoUuDjwLF1S1cYmXwZw4XwYVo7TS1CKJZ1IeoWKocuX_UFuBeWxH6OILUcrCk-vhf-3-wRLES-6DQuMwH_iqpGlUxrqVamC3kDtu1o35GJVIlqrD2XleazVvZRtEuYliaHD_CvbhrxfxUSDY-ST2CRCvHnYCq6aH1bHclqH7qo_-pT2gwW-Ornt20t6f4WgQhhLBCTDBT4LXRkjcQk0C9FrhMg3gmoh9a80VSKmuZ-ekolTgvL7xdSTmS1S7IZ0vqAXq2dnRCp3bvU7vyM9lN2AO2dce8NBm0Ymo-bH2vsid0Q3cXZT-Y4SZCfINOJaZsGPlNhff5dmwqe25J35l-bhDkxgf-wC5JYgxjbBngIKjEoFTi9-gjlLAWybRcAaSc4bWBP9y4uJonfby9WrXjdQqGfLuY5NTrgzvEtwyX-2JWanBM0BBVWHn","summary":[{"type":"summary_text","text":"**Confirming scheduling semantics with failure timings**"},{"type":"summary_text","text":"**Calculating precise pre-round durations and CPU bursts**"}]},{"id":"rs_0a2aec7d4fa39f5e016a5a28b4a7fc819783f6fe13b7ed46ee","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWijB6yFZnLj0qyoXTPO-qyP6RKSLuydsnGqlMTa0cr8BlKC3l_lyrb_PJGHkdtpXZ42WHs1PjDloaTq-rHTiRyBmgzNLX98HDNzrSuKJSiZHwPQir229ehwFppqQCIKHCoCd3ICZDifl6Vh-KQ2Z7ngcWRaK-jwpVPmBZFTmFxlrUMqa3o3WuwVEPQdcMzWYWBuDsykW2kwEBFMflR2Y8LWSJJUFAVZEKMUB0JysPa6NFz-r415kCdb8N7MpPGymj3NFjDDb-xMyObWUES6kHFJHL-jqRwsMZTFGb9BtDWvKndDjaoo1QxSxn1qy56omy_Anj3ZUvHQpgHg_BAuGF9iMCK-8HVXPvL9K18Bsk-tqHRjno1FC35P9DYE4zp4P-nr5CXSqAo2s2QBu8rrSDzs-9L2i0-p2YUxUW7aFNeJqqhk16gKoJvdM3KTSPzGYaPDknjwnJzb_Hvt-toIiWydorSaQyYpEZS7NprJEeJ7KLznYoOYlM1vtuo9I_ZXCc8gc_O96d2DNpW24zSo5sDp9x-2F5D7ciBDkSiHGT-w2LsV2obDwXMrFiBg9ZBvda2lh3JXVq_-5hn_5_2UOMW7chjXfiAuIPbKEel9ZdnX_OFcVoDafRZ9ESH5Lc57RsnNHQPqex5e2B4lhdlb2PcV9Jkr72DcqvGrhFou1bj6QR5CoO66vqXnWWqkThNGCX5mcymsRybRd5bTAaDl6jYktHBsMnt85Sj92cv-4SCm_CtkSJ3MOwldECd2SdPGtXkHZHdpy1EsnSjKGgvOExHfrEMGVVK8TH5UVTzv7zpZl46NF_pQHpH7sEQFzW7MrTBqNUXXyKJLyJx21ObTVb7my4bAmnizgapGP32rNYAEessUB4TNIJzeVY0l-BX78x1mrLlqGZA2ovVsXvaRCaIPIboWq_aXbZj2raE6yi1aefvLu0ugqeiVH8NyLerTSr3aZphBf12rFzqDr68parIv2Npje3g0iJZ8hAJrHQl_Pxbgfhr97VNdJpDfVvpxt6QDFYoCriu4vwMs5ovC7IFiWbocljHGjZ0m7wYbYWMzdx-5l_L6yt7qmTdfsPkLGS8ANGkV8aaouR-xv2b_kuR3scx3UK34NZmh26b-kcwTozHlwoQfMu8mx8TqnE9MUxjnDBxHQJwOW4064e8yW5XYiYHI-C1Hy2ty7kKz8EmxHN_NUNzFSmKDmZO2u8N_bHxdXcbe6WMp5eAEePWxF5rrXix25nNi84rJP3hRK9XER4uAYJdcfI47jMRl-Jc3BYFlLb-qTd9iat5_FnKEf663UVL8dzl9UD_FY-fMot38zTzmtbHEOexBVr9nUNgCsqfWRfAH4U_DELqT1ecLnG1fBZYouA-OQNADJNWQkzA1bVzrDOFlyXrx7YTle7U3-YnNz38DnLUPiCxUtcpXTeEyx2TVwG4iVM_CGKPmJZYczFRjFbAyoSCKQzUsH6iObi4NJujjx1zYAFwg44W8nb3c4ESpS46LnaztXK0QhYNDDT3C9JOAMHsPCPyjD4_XHhGA-5GaE-muyuzrQJaekfaQGrSDikiQIKTca-b0jtenhYXblwqffaYnTYgKxlPWdAJOOIBGIE-uZulXqU2wTgONbh0PPz2nQd1Cmlahag4dVVrvSPdqnPRjxmmeZ_Sr_vEiUsy05uFmIyrNHk8N07q-zhl6l5c9nw72bN-ZDtdUIaELJA38pTAcomMtKsn13cv-T8uGmifbqWB1H5AK1GUAzeBnt0_buwXXiuhOfXx3hc9Ti4VLvKKTKheP0UnvCxPzyV4ERlLZXdjLTDjdwTWOH63QbsL2W0TNGU7i2jTeBxNvHBJZdl4ghMT031rogxkF7jqBDm19FNj1LsasFrHdaySBFWxT_F0oeoNqZamNzuyx_rE0JaMY7t3anUHyC_azqm9QrKCqUoguPvpjERdapTrM3fPgjvZO3mnEVoFYHeiZWogmI5EkyNt_KEPn4-mLMGLxpJM3XEdm_Y3URcM43zmhPpJ6j4CGFEZ1jhkKescWJuhaeN5AQ0CVAEeTSNMkMGWtp0RJLwNLDHdFCBuJu4506Auc089mFsEhwfIX7UPDHpXvj_gTeXB7Siz37XPvtIaKgPWDo9CYJAKzbzyDt1KOPL476opMXwiP3cEJhg7FPjtpb3DOzbkk8_wevk99Aq6Y5318BrBAn_5nxXKOjJONlg0_8609b6DX7C3RWl8rQD47TByLnvcxH43FWtDAl-xScG_tNQMFpYCeKLFWXKlv8h-dg9v8jafSJT_yb1mF_83AlR2BRnT-mVlytGMxNvG8SsT32emcojjZeI2RO1_beCDjIbNlLj7ons4KkwMFFtJOiJl0UAU70OhcOQ3YVaPnMLsYM_j67zO_Xdgst3duid7wcFNCyzxK6ecs0npZ4kj0epikVQOCwH0Bq6_5t0eL83efESzWJlVBBnn80sEsSEhF4YTa_ecOTuRg_lr-gEa4zXFTMqWuWNDSoVo6VE_JQoukDPeh7y7fYP8gLoqfSRRAP8hxSNiqWbHVxdbvhIzgL9Cr5b5--SfKxzQpwzlvnsW2DKahxEbG99TJQSyeNrr4XkhCUuq8twCERY5Cy7Xni_89ql7WnGNZ_b6hcgb57NasWGMgLL6KVMBseFzh48Env-zfPzUcitK3rqtyFFLjmLjY5nb-WGwMZtBXwOvqgzeDnOqFnHBwpwefXcr2KU3o4gW0hko73Cwn_pv9PjF6YAQqBE7EDEumz5cUOuUh6gMr8oWzngYQHAJtO87NQgcs111ZOoo_FUbsgWjBO52pRCr13nynbPpJHYHWfgf25JiJbTny4y_96yR4MmMZPdw_6hJtGxcEwQgOg0WE2IIkSO5OSaZ1macLBUVq9NsubdeQvpQ3v_o694WkMSuyo_AQdCVWoV53G6gphZAZq6JURAuFoDTJQCZ_QUJgFdrr0cpWljHHaGd1oSu90wJQjCoDzFaMWIcDm1sGiyIkNCu2TthbvoCt69TKgy61w7j0hw0-KpwCcb7ysQGpaHUpqdG5MibzlzPGStH8aw-Pqk2CCkX51PSKnf0WyJrp0Ek1_fXX82Gn_3_5HtYJ9g1vYWTCYPhaTTTRBUl1BgSWqVVVdgj0bJAXEGTAicC37pdfP9uozASS2neXf3WjvjSfxTU8sYMSGPg6DmXi36NlBSNyv7YofLo6ertz-SY90GJwtw4qodjXQeDLxCaDHuc1BITTcitlms4OP2DVthK8AyO8JvdFh5MmEh1CVkxJDAmUHyM1bGd00P-YswD4c7Y22R6sqx064Y18oG4VsYMprI3nhqdxUFSluTy6gXvu1sWeTUlMxtk6g9-_UJFoOG1ZQ_I0XqTPtLjnq1RP8TotDpUB3urwI4mslv9JjqMLVo1KDU41JD6HCS3WcqJHWZyuf_2MsybRORo9goOOv4HCFQ2hmkujAwC2u-qCCefRu5SH7P88MBRFK2Bmj4Mab-QgsT6gMLLI-R5rxQNMiAjr-cMSQ_NLVyk-nXA5IMcDDiDgmJT51v-M3rCMfVPjKu2L-fxuYzMmfhj8JDDt8YjRg22OaslhH8Vd3gKvWvd4yPETx4OsJ5HX5Xzb06GS1qUwGDzI0RPEDD9jykxgmeZyExQawmn4Un4Nfqru768LBNTcRo5TrBxbvgCkdbI86YA==","summary":[{"type":"summary_text","text":"**Analyzing startup reconcile timing**"},{"type":"summary_text","text":"**Confirming second registry round timing**"}]},{"id":"fc_0a2aec7d4fa39f5e016a5a28c1b5f0819781b4125424c53f4f","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating epoch increment cost\",\"pattern\":\"pub fn next_epoch|fn next_epoch|struct EpochSource\",\"path\":\"crates/spt-store/src/epoch.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_BESqCe4xGbkGb6hxi5RrPxZ4","name":"grep"},{"id":"fc_0a2aec7d4fa39f5e016a5a28c1b62c81978fdf25de72085f9b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading epoch persistence\",\"path\":\"crates/spt-store/src/epoch.rs\",\"selector\":\"1-160\"}","call_id":"call_0EOjzfWlyw9KjWux44GPO7WA","name":"read"},{"id":"fc_0a2aec7d4fa39f5e016a5a28c1b6448197a54d072b213c6a85","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating pump mark timing\",\"pattern\":\"mark_ran\\\\(|WorkerLasts|last: \\\\[Option|mark-after-round\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_L93iZyugCf8ubSNoUFlQgYZ8","name":"grep"},{"id":"fc_0a2aec7d4fa39f5e016a5a28c1b65c8197aba7e86ff858c1f8","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading pump timing kernel\",\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"selector\":\"675-715\"}","call_id":"call_ZU6gtSJv77VX4kuQJbWEQ1eM","name":"read"}]},"duration":46178.52339999378,"ttft":2755.394500002265,"contextSnapshot":{"promptTokens":223216,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_BESqCe4xGbkGb6hxi5RrPxZ4|fc_0a2aec7d4fa39f5e016a5a28c1b5f0819781b4125424c53f4f","toolName":"grep","startedAt":"2026-07-17T13:06:10.395Z","args":{"path":"crates/spt-store/src/epoch.rs"},"intent":"Locating epoch increment cost"},"id":"25e0178d","parentId":"b5e396a8","timestamp":"2026-07-17T13:06:10.395Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_0EOjzfWlyw9KjWux44GPO7WA|fc_0a2aec7d4fa39f5e016a5a28c1b62c81978fdf25de72085f9b","toolName":"read","startedAt":"2026-07-17T13:06:10.395Z","args":{"path":"crates/spt-store/src/epoch.rs"},"intent":"Reading epoch persistence"},"id":"021001bb","parentId":"25e0178d","timestamp":"2026-07-17T13:06:10.395Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_L93iZyugCf8ubSNoUFlQgYZ8|fc_0a2aec7d4fa39f5e016a5a28c1b6448197a54d072b213c6a85","toolName":"grep","startedAt":"2026-07-17T13:06:10.395Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Locating pump mark timing"},"id":"622e4942","parentId":"021001bb","timestamp":"2026-07-17T13:06:10.395Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_ZU6gtSJv77VX4kuQJbWEQ1eM|fc_0a2aec7d4fa39f5e016a5a28c1b65c8197aba7e86ff858c1f8","toolName":"read","startedAt":"2026-07-17T13:06:10.395Z","args":{"path":"crates/spt-daemon/src/pump/mod.rs"},"intent":"Reading pump timing kernel"},"id":"247ab030","parentId":"622e4942","timestamp":"2026-07-17T13:06:10.395Z"}
{"type":"message","id":"d08da7ea","parentId":"247ab030","timestamp":"2026-07-17T13:06:10.398Z","message":{"role":"toolResult","toolCallId":"call_BESqCe4xGbkGb6hxi5RrPxZ4|fc_0a2aec7d4fa39f5e016a5a28c1b5f0819781b4125424c53f4f","toolName":"grep","content":[{"type":"text","text":" 27|/// A node's persisted monotonic epoch counter.\n*28|pub struct EpochSource {\n 29|    path: PathBuf,\n 30|    current: u64,\n 31|}\n...\n 62|    /// this source — the monotonic guarantee callers depend on.\n*63|    pub fn next_epoch(&mut self) -> std::io::Result<u64> {\n 64|        let n = self\n 65|            .current\n 66|            .checked_add(1)"}],"details":{"scopePath":"crates/spt-store/src/epoch.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\epoch.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":2,"fileCount":1,"files":["crates/spt-store/src/epoch.rs"],"fileMatches":[{"path":"crates/spt-store/src/epoch.rs","count":2}],"truncated":false,"displayContent":" 27│/// A node's persisted monotonic epoch counter.\n*28│pub struct EpochSource {\n 29│    path: PathBuf,\n 30│    current: u64,\n 31│}\n   │...\n 62│    /// this source — the monotonic guarantee callers depend on.\n*63│    pub fn next_epoch(&mut self) -> std::io::Result<u64> {\n 64│        let n = self\n 65│            .current\n 66│            .checked_add(1)"},"isError":false,"timestamp":1784293570398}}
{"type":"message","id":"34a3a197","parentId":"d08da7ea","timestamp":"2026-07-17T13:06:10.399Z","message":{"role":"toolResult","toolCallId":"call_L93iZyugCf8ubSNoUFlQgYZ8|fc_0a2aec7d4fa39f5e016a5a28c1b6448197a54d072b213c6a85","toolName":"grep","content":[{"type":"text","text":" 143|/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n*144|/// supervised restart like `WorkerLasts`.\n 145|#[derive(Clone, Copy, Debug)]\n 146|struct PeerSched {\n 147|    next_due: Instant,\n...\n 516|/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n*517|/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n 518|/// logic lives here — the shell owns only *when* and *toward whom*.\n 519|pub fn run_peer_pump(\n 520|    broker_name: &str,\n...\n 586|    ];\n*587|    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\n 588|    // `workers`. `None` = never run yet → due immediately, so the first tick\n 589|    // primes every leg. Never `Instant - Duration` — the underflow panic on a\n 590|    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\n*591|    let mut last: [Option<Instant>; 4] = [None; 4];\n 592|    let mut last_hb: Option<Instant> = None;\n 593|\n 594|    while !stop.load(Ordering::Relaxed) {\n...\n 728|        // from here, not from the round's start).\n*729|        mark_ran(&mut last, &due_flags, Instant::now());\n 730|    }\n 731|    Ok(())\n 732|}\n...\n 971|/// ATTEMPTED not succeeded). Non-due slots are untouched, so the stagger holds.\n*972|fn mark_ran(last: &mut [Option<Instant>], due_flags: &[bool], now: Instant) {\n 973|    for i in 0..last.len() {\n 974|        if due_flags[i] {\n 975|            last[i] = Some(now);\n...\n 1162|/// (`last == None`, so the first tick primes peers), OR `cadence` has elapsed\n*1163|/// since it last ran. **Prime-all-on-restart:** `WorkerLasts` is RAM-only and\n 1164|/// re-initializes to `[None; 4]` every daemon start, so after a restart EVERY leg\n 1165|/// is `last == None` → due on the first tick — a fresh daemon pulls/advertises\n 1166|/// immediately, never waiting out a full cadence (so \"silent since restart\" is\n...\n 1170|/// offset (a freshly-booted Windows host, KNOWN-HAZARDS 5.9). The shell owns\n*1171|/// the `last` instants (`WorkerLasts`, RAM only) and the `wake` (the worker's\n 1172|/// `poll_wake` marker take) — this kernel stays a pure fn for the unit table.\n 1173|/// [impl->REQ-HAZARD-INSTANT-UNDERFLOW]\n 1174|fn due(last: Option<Instant>, wake: bool, now: Instant, cadence: Duration) -> bool {\n...\n 1512|\n*1513|    // Fact 5 — mark-after-round stagger: every DUE worker is stamped with the\n 1514|    // POST-round instant; non-due slots are untouched (so each leg's next-due\n 1515|    // is measured from when IT last ran, not the round start).\n 1516|    #[test]\n...\n 1520|        let mut last = [Some(t0), None, Some(t0)];\n*1521|        mark_ran(&mut last, &[true, false, true], t1);\n 1522|        assert_eq!(last[0], Some(t1), \"due leg advances to the post-round now\");\n 1523|        assert_eq!(last[1], None, \"a not-due never-run leg stays unprimed\");\n 1524|        assert_eq!(last[2], Some(t1), \"due leg advances\");"}],"details":{"scopePath":"crates/spt-daemon/src/pump/mod.rs","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":10,"fileCount":1,"files":["crates/spt-daemon/src/pump/mod.rs"],"fileMatches":[{"path":"crates/spt-daemon/src/pump/mod.rs","count":10}],"truncated":false,"displayContent":"  143│/// `HashMap<peer_hex, PeerSched>` on the pump loop — RAM-only, re-primed on a\n *144│/// supervised restart like `WorkerLasts`.\n  145│#[derive(Clone, Copy, Debug)]\n  146│struct PeerSched {\n  147│    next_due: Instant,\n     │...\n  516│/// (`ensure_conn` → each due worker's `peer_step` in fan-out order,\n *517│/// abort-on-first-fail) → mark-after-round with a POST-round instant. No leg\n  518│/// logic lives here — the shell owns only *when* and *toward whom*.\n  519│pub fn run_peer_pump(\n  520│    broker_name: &str,\n     │...\n  586│    ];\n *587│    // WorkerLasts (ADR-0018 §V4): RAM-only last-ran instants, parallel to\n  588│    // `workers`. `None` = never run yet → due immediately, so the first tick\n  589│    // primes every leg. Never `Instant - Duration` — the underflow panic on a\n  590│    // sub-uptime monotonic clock (KH 5.9) lives nowhere in this path.\n *591│    let mut last: [Option<Instant>; 4] = [None; 4];\n  592│    let mut last_hb: Option<Instant> = None;\n  593│\n  594│    while !stop.load(Ordering::Relaxed) {\n     │...\n  728│        // from here, not from the round's start).\n *729│        mark_ran(&mut last, &due_flags, Instant::now());\n  730│    }\n  731│    Ok(())\n  732│}\n     │...\n  971│/// ATTEMPTED not succeeded). Non-due slots are untouched, so the stagger holds.\n *972│fn mark_ran(last: &mut [Option<Instant>], due_flags: &[bool], now: Instant) {\n  973│    for i in 0..last.len() {\n  974│        if due_flags[i] {\n  975│            last[i] = Some(now);\n     │...\n 1162│/// (`last == None`, so the first tick primes peers), OR `cadence` has elapsed\n*1163│/// since it last ran. **Prime-all-on-restart:** `WorkerLasts` is RAM-only and\n 1164│/// re-initializes to `[None; 4]` every daemon start, so after a restart EVERY leg\n 1165│/// is `last == None` → due on the first tick — a fresh daemon pulls/advertises\n 1166│/// immediately, never waiting out a full cadence (so \"silent since restart\" is\n     │...\n 1170│/// offset (a freshly-booted Windows host, KNOWN-HAZARDS 5.9). The shell owns\n*1171│/// the `last` instants (`WorkerLasts`, RAM only) and the `wake` (the worker's\n 1172│/// `poll_wake` marker take) — this kernel stays a pure fn for the unit table.\n 1173│/// [impl->REQ-HAZARD-INSTANT-UNDERFLOW]\n 1174│fn due(last: Option<Instant>, wake: bool, now: Instant, cadence: Duration) -> bool {\n     │...\n 1512│\n*1513│    // Fact 5 — mark-after-round stagger: every DUE worker is stamped with the\n 1514│    // POST-round instant; non-due slots are untouched (so each leg's next-due\n 1515│    // is measured from when IT last ran, not the round start).\n 1516│    #[test]\n     │...\n 1520│        let mut last = [Some(t0), None, Some(t0)];\n*1521│        mark_ran(&mut last, &[true, false, true], t1);\n 1522│        assert_eq!(last[0], Some(t1), \"due leg advances to the post-round now\");\n 1523│        assert_eq!(last[1], None, \"a not-due never-run leg stays unprimed\");\n 1524│        assert_eq!(last[2], Some(t1), \"due leg advances\");"},"isError":false,"timestamp":1784293570399}}
{"type":"message","id":"c63142e9","parentId":"34a3a197","timestamp":"2026-07-17T13:06:10.401Z","message":{"role":"toolResult","toolCallId":"call_0EOjzfWlyw9KjWux44GPO7WA|fc_0a2aec7d4fa39f5e016a5a28c1b62c81978fdf25de72085f9b","toolName":"read","content":[{"type":"text","text":"//! Per-node monotonic epoch counter (D3b) — the ordering authority behind the\n//! registry lease (#8) and, later, sync precedence (#7).\n//!\n//! A single strictly-increasing `u64` persisted at [`epoch_file`](crate::perch::epoch_file).\n//! Every state change this node advertises (an instance going Active/Dormant/Offline, a\n//! context snapshot) stamps the value [`next_epoch`](EpochSource::next_epoch) returns. Comparing two\n//! updates by this counter — NOT wall-clock — is what stops a lagging \"Active\" from\n//! overwriting a newer \"Offline\" after a partition or clock skew. Wall-clock is at most a\n//! human tiebreaker hint elsewhere; it is never the ordering authority (M4-PLAN D3b/#8).\n//!\n//! **Single-writer assumption:** the value is read-modify-written, so concurrent\n//! writers on one node could collide (a lost update — KH 4.8 class). Post broker/brain\n//! split (ADR-0018) the potential writers ARE two processes, so this is no longer one\n//! process by construction. The current rule that keeps it safe: **the brain owns the\n//! epoch while it is alive** (the registry pump + advertise loops run brain-side), and\n//! **the broker may touch it only in brain-dead windows** — today that is exactly the\n//! D6 auto-rollback notif (`brainproc::fire_rollback_notif`, fired only after the\n//! candidate is reaped). If a broker-side write ever needs to race a live brain,\n//! cross-process serialization (a file lock) is the forward fix; it is not modeled here.\n// [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\n\nuse std::path::{Path, PathBuf};\n\nuse crate::atomic::atomic_write_string;\nuse crate::perch::epoch_file;\n\n/// A node's persisted monotonic epoch counter.\npub struct EpochSource {\n    path: PathBuf,\n    current: u64,\n}\n\nimpl EpochSource {\n    /// Load (or initialize) the counter from the canonical [`epoch_file`].\n    pub fn load() -> EpochSource {\n        Self::load_from(&epoch_file())\n    }\n\n    /// Load from an explicit path (the testable core). An absent file starts at `0`\n    /// (first [`next_epoch`] yields `1`); a corrupt/unparsable file ALSO degrades to `0`\n    /// rather than panicking — a damaged counter must not brick the node. Restarting\n    /// from 0 is safe-by-construction: see [`next_epoch`]'s monotonicity note.\n    pub fn load_from(path: &Path) -> EpochSource {\n        let current = std::fs::read_to_string(path)\n            .ok()\n            .and_then(|s| s.trim().parse::<u64>().ok())\n            .unwrap_or(0);\n        EpochSource {\n            path: path.to_path_buf(),\n            current,\n        }\n    }\n\n    /// The last issued epoch without advancing (peek). `0` means none issued yet.\n    pub fn current(&self) -> u64 {\n        self.current\n    }\n\n    /// Advance and return the next epoch, persisting it **before** updating the\n    /// in-memory value so a failed write leaves the counter unmoved (the error is\n    /// returned, no epoch is consumed). Strictly greater than every prior return on\n    /// this source — the monotonic guarantee callers depend on.\n    pub fn next_epoch(&mut self) -> std::io::Result<u64> {\n        let n = self\n            .current\n            .checked_add(1)\n            .expect(\"epoch counter overflowed u64 — unreachable in any real lifetime\");\n        if let Some(parent) = self.path.parent() {\n            std::fs::create_dir_all(parent)?;\n        }\n        atomic_write_string(&self.path, &n.to_string())?;\n        self.current = n;\n        Ok(n)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use tempfile::tempdir;\n\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] next() is strictly increasing and starts\n    // at 1 (a small counter, NOT a wall-clock-derived value — proof the source is a\n    // monotonic counter, not a timestamp).\n    #[test]\n    fn next_is_strictly_increasing_from_one() {\n        let dir = tempdir().unwrap();\n        let mut src = EpochSource::load_from(&dir.path().join(\"epoch\"));\n        let a = src.next_epoch().unwrap();\n        let b = src.next_epoch().unwrap();\n        let c = src.next_epoch().unwrap();\n        assert_eq!((a, b, c), (1, 2, 3));\n        assert!(\n            a < 1_000_000,\n            \"epoch is a small counter, not a unix timestamp\"\n        );\n    }\n\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] the counter is persisted: a reload picks\n    // up where the prior source left off, never reissuing a consumed epoch.\n    #[test]\n    fn counter_persists_across_reload() {\n        let dir = tempdir().unwrap();\n        let path = dir.path().join(\"epoch\");\n        {\n            let mut src = EpochSource::load_from(&path);\n            assert_eq!(src.next_epoch().unwrap(), 1);\n            assert_eq!(src.next_epoch().unwrap(), 2);\n        }\n        let mut reloaded = EpochSource::load_from(&path);\n        assert_eq!(reloaded.current(), 2, \"peek sees the persisted value\");\n        assert_eq!(\n            reloaded.next_epoch().unwrap(),\n            3,\n            \"continues, never reissues 1/2\"\n        );\n    }\n\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] a corrupt/absent counter file degrades to\n    // a safe restart (0) rather than panicking.\n    #[test]\n    fn corrupt_or_absent_file_degrades_safely() {\n        let dir = tempdir().unwrap();\n        let absent = dir.path().join(\"nope\");\n        assert_eq!(EpochSource::load_from(&absent).current(), 0);\n\n        let corrupt = dir.path().join(\"epoch\");\n        std::fs::write(&corrupt, \"not-a-number\").unwrap();\n        let mut src = EpochSource::load_from(&corrupt);\n        assert_eq!(src.current(), 0);\n        assert_eq!(src.next_epoch().unwrap(), 1, \"recovers without panic\");\n    }\n}\n"}],"details":{"displayContent":{"text":"//! Per-node monotonic epoch counter (D3b) — the ordering authority behind the\r\n//! registry lease (#8) and, later, sync precedence (#7).\r\n//!\r\n//! A single strictly-increasing `u64` persisted at [`epoch_file`](crate::perch::epoch_file).\r\n//! Every state change this node advertises (an instance going Active/Dormant/Offline, a\r\n//! context snapshot) stamps the value [`next_epoch`](EpochSource::next_epoch) returns. Comparing two\r\n//! updates by this counter — NOT wall-clock — is what stops a lagging \"Active\" from\r\n//! overwriting a newer \"Offline\" after a partition or clock skew. Wall-clock is at most a\r\n//! human tiebreaker hint elsewhere; it is never the ordering authority (M4-PLAN D3b/#8).\r\n//!\r\n//! **Single-writer assumption:** the value is read-modify-written, so concurrent\r\n//! writers on one node could collide (a lost update — KH 4.8 class). Post broker/brain\r\n//! split (ADR-0018) the potential writers ARE two processes, so this is no longer one\r\n//! process by construction. The current rule that keeps it safe: **the brain owns the\r\n//! epoch while it is alive** (the registry pump + advertise loops run brain-side), and\r\n//! **the broker may touch it only in brain-dead windows** — today that is exactly the\r\n//! D6 auto-rollback notif (`brainproc::fire_rollback_notif`, fired only after the\r\n//! candidate is reaped). If a broker-side write ever needs to race a live brain,\r\n//! cross-process serialization (a file lock) is the forward fix; it is not modeled here.\r\n// [impl->REQ-HAZARD-REGISTRY-EPOCH-LEASE]\r\n\r\nuse std::path::{Path, PathBuf};\r\n\r\nuse crate::atomic::atomic_write_string;\r\nuse crate::perch::epoch_file;\r\n\r\n/// A node's persisted monotonic epoch counter.\r\npub struct EpochSource {\r\n    path: PathBuf,\r\n    current: u64,\r\n}\r\n\r\nimpl EpochSource {\r\n    /// Load (or initialize) the counter from the canonical [`epoch_file`].\r\n    pub fn load() -> EpochSource {\r\n        Self::load_from(&epoch_file())\r\n    }\r\n\r\n    /// Load from an explicit path (the testable core). An absent file starts at `0`\r\n    /// (first [`next_epoch`] yields `1`); a corrupt/unparsable file ALSO degrades to `0`\r\n    /// rather than panicking — a damaged counter must not brick the node. Restarting\r\n    /// from 0 is safe-by-construction: see [`next_epoch`]'s monotonicity note.\r\n    pub fn load_from(path: &Path) -> EpochSource {\r\n        let current = std::fs::read_to_string(path)\r\n            .ok()\r\n            .and_then(|s| s.trim().parse::<u64>().ok())\r\n            .unwrap_or(0);\r\n        EpochSource {\r\n            path: path.to_path_buf(),\r\n            current,\r\n        }\r\n    }\r\n\r\n    /// The last issued epoch without advancing (peek). `0` means none issued yet.\r\n    pub fn current(&self) -> u64 {\r\n        self.current\r\n    }\r\n\r\n    /// Advance and return the next epoch, persisting it **before** updating the\r\n    /// in-memory value so a failed write leaves the counter unmoved (the error is\r\n    /// returned, no epoch is consumed). Strictly greater than every prior return on\r\n    /// this source — the monotonic guarantee callers depend on.\r\n    pub fn next_epoch(&mut self) -> std::io::Result<u64> {\r\n        let n = self\r\n            .current\r\n            .checked_add(1)\r\n            .expect(\"epoch counter overflowed u64 — unreachable in any real lifetime\");\r\n        if let Some(parent) = self.path.parent() {\r\n            std::fs::create_dir_all(parent)?;\r\n        }\r\n        atomic_write_string(&self.path, &n.to_string())?;\r\n        self.current = n;\r\n        Ok(n)\r\n    }\r\n}\r\n\r\n#[cfg(test)]\r\nmod tests {\r\n    use super::*;\r\n    use tempfile::tempdir;\r\n\r\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] next() is strictly increasing and starts\r\n    // at 1 (a small counter, NOT a wall-clock-derived value — proof the source is a\r\n    // monotonic counter, not a timestamp).\r\n    #[test]\r\n    fn next_is_strictly_increasing_from_one() {\r\n        let dir = tempdir().unwrap();\r\n        let mut src = EpochSource::load_from(&dir.path().join(\"epoch\"));\r\n        let a = src.next_epoch().unwrap();\r\n        let b = src.next_epoch().unwrap();\r\n        let c = src.next_epoch().unwrap();\r\n        assert_eq!((a, b, c), (1, 2, 3));\r\n        assert!(\r\n            a < 1_000_000,\r\n            \"epoch is a small counter, not a unix timestamp\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] the counter is persisted: a reload picks\r\n    // up where the prior source left off, never reissuing a consumed epoch.\r\n    #[test]\r\n    fn counter_persists_across_reload() {\r\n        let dir = tempdir().unwrap();\r\n        let path = dir.path().join(\"epoch\");\r\n        {\r\n            let mut src = EpochSource::load_from(&path);\r\n            assert_eq!(src.next_epoch().unwrap(), 1);\r\n            assert_eq!(src.next_epoch().unwrap(), 2);\r\n        }\r\n        let mut reloaded = EpochSource::load_from(&path);\r\n        assert_eq!(reloaded.current(), 2, \"peek sees the persisted value\");\r\n        assert_eq!(\r\n            reloaded.next_epoch().unwrap(),\r\n            3,\r\n            \"continues, never reissues 1/2\"\r\n        );\r\n    }\r\n\r\n    // [unit->REQ-HAZARD-REGISTRY-EPOCH-LEASE] a corrupt/absent counter file degrades to\r\n    // a safe restart (0) rather than panicking.\r\n    #[test]\r\n    fn corrupt_or_absent_file_degrades_safely() {\r\n        let dir = tempdir().unwrap();\r\n        let absent = dir.path().join(\"nope\");\r\n        assert_eq!(EpochSource::load_from(&absent).current(), 0);\r\n\r\n        let corrupt = dir.path().join(\"epoch\");\r\n        std::fs::write(&corrupt, \"not-a-number\").unwrap();\r\n        let mut src = EpochSource::load_from(&corrupt);\r\n        assert_eq!(src.current(), 0);\r\n        assert_eq!(src.next_epoch().unwrap(), 1, \"recovers without panic\");\r\n    }\r\n}\r\n","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\epoch.rs"}}},"isError":false,"timestamp":1784293570401}}
{"type":"message","id":"58a3f1a4","parentId":"c63142e9","timestamp":"2026-07-17T13:06:10.414Z","message":{"role":"toolResult","toolCallId":"call_ZU6gtSJv77VX4kuQJbWEQ1eM|fc_0a2aec7d4fa39f5e016a5a28c1b65c8197aba7e86ff858c1f8","toolName":"read","content":[{"type":"text","text":"        for (peer_hex, subs) in &peer_subnets {\n            if let Some(&conn_id) = conns.get(peer_hex) {\n…\n            } else if peer_eligible(&sched, peer_hex, round_start) {\n                if let Some(addr) =\n…\n                } else {\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\n                    // `address-resolution`). Transition-logged: the first\n                    // unroutable round per peer is loud, repeats are quiet —\n                    // the peer retries on its own cadence like before.\n                    if health.note_failed(\n                        peer_hex,\n                        crate::seedproofx::STAGE_RESOLVE,\n                        conns.len(),\n                        now_ms(),\n                    ) {\n                        eprintln!(\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\n                            crate::seedproofx::STAGE_RESOLVE,\n                            now_ms(),\n                            mono_ms()\n                        );\n                    }\n                }\n            }\n        }\n\n        // Drain dial outcomes on the DEDICATED event carrier until the round\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\n        // restarts the pump; a dead PEER never does).\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\n        loop {\n            let read_deadline = if pending.is_empty() {\n                Instant::now() // no outstanding submits — sweep only what is queued\n            } else {\n                round_deadline\n            };\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\n                DrainStep::Apply(ev) => handle_presence_event(\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\n                )?,\n                DrainStep::Skip => continue, // the event carrier only carries presence\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\n            }\n        }\n\n[Showing lines 674-718 of 2054. Use :719 to continue]"}],"details":{"truncation":{"content":"                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\r\n                    // `address-resolution`). Transition-logged: the first\r\n                    // unroutable round per peer is loud, repeats are quiet —\r\n                    // the peer retries on its own cadence like before.\r\n                    if health.note_failed(\r\n                        peer_hex,\r\n                        crate::seedproofx::STAGE_RESOLVE,\r\n                        conns.len(),\r\n                        now_ms(),\r\n                    ) {\r\n                        eprintln!(\r\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\r\n                            crate::seedproofx::STAGE_RESOLVE,\r\n                            now_ms(),\r\n                            mono_ms()\r\n                        );\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Drain dial outcomes on the DEDICATED event carrier until the round\r\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\r\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\r\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\r\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\r\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\r\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\r\n        // restarts the pump; a dead PEER never does).\r\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\r\n        loop {\r\n            let read_deadline = if pending.is_empty() {\r\n                Instant::now() // no outstanding submits — sweep only what is queued\r\n            } else {\r\n                round_deadline\r\n            };\r\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\r\n                DrainStep::Apply(ev) => handle_presence_event(\r\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\r\n                )?,\r\n                DrainStep::Skip => continue, // the event carrier only carries presence\r\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\r\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\r","truncated":true,"truncatedBy":"lines","totalLines":1381,"totalBytes":2600,"outputLines":45,"outputBytes":2600,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"        for (peer_hex, subs) in &peer_subnets {\n            if let Some(&conn_id) = conns.get(peer_hex) {\n…\n            } else if peer_eligible(&sched, peer_hex, round_start) {\n                if let Some(addr) =\n…\n                } else {\n                    // No route on any chain leg (REQ-PUMP-STAGE-TRUTH stage\r\n                    // `address-resolution`). Transition-logged: the first\r\n                    // unroutable round per peer is loud, repeats are quiet —\r\n                    // the peer retries on its own cadence like before.\r\n                    if health.note_failed(\r\n                        peer_hex,\r\n                        crate::seedproofx::STAGE_RESOLVE,\r\n                        conns.len(),\r\n                        now_ms(),\r\n                    ) {\r\n                        eprintln!(\r\n                            \"PUMP_PEER_FAIL:{peer_hex}:stage={}: no route (cache/roster/discovery all empty) wall_ms={} mono_ms={}\",\r\n                            crate::seedproofx::STAGE_RESOLVE,\r\n                            now_ms(),\r\n                            mono_ms()\r\n                        );\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Drain dial outcomes on the DEDICATED event carrier until the round\r\n        // deadline (concurrent dials all land within ~one W1 bound). A CONNECTED\r\n        // runs that peer's legs in THIS round; a DIAL_FAILED backs the peer off; a\r\n        // peer unresolved at the deadline simply reschedules — NEVER a whole-round\r\n        // poison. `TimedOut` = quiet (drain done); any other read error = the\r\n        // broker stopped answering the stream (dead carrier) → bubble → supervised\r\n        // restart (the re-pointed REQ-HAZARD-PUMP-IPC-DEADLINE: a dead BROKER still\r\n        // restarts the pump; a dead PEER never does).\r\n        // [impl->REQ-HAZARD-PUMP-IPC-DEADLINE]\r\n        let round_deadline = round_start + PEER_REPLY_READ_BUDGET + ROUND_DRAIN_MARGIN;\r\n        loop {\r\n            let read_deadline = if pending.is_empty() {\r\n                Instant::now() // no outstanding submits — sweep only what is queued\r\n            } else {\r\n                round_deadline\r\n            };\r\n            match classify_drain_read(events.read_event_until(Some(read_deadline))) {\r\n                DrainStep::Apply(ev) => handle_presence_event(\r\n                    ev, &mut brain, &mut ops, &mut workers, &due_flags, &mut conns, &mut sched,\r\n                    &mut pending, &peer_subnets, &ctx, &paths.peer_addrs, &mut health, round_start,\r\n                )?,\r\n                DrainStep::Skip => continue, // the event carrier only carries presence\r\n                DrainStep::RoundDone => break, // quiet (TimedOut) — drain done\r\n                DrainStep::Restart(e) => return Err(e), // dead broker/carrier → restart\r\n            }\n        }","startLine":643,"lineNumbers":[643,644,null,649,650,null,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\mod.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2054,"totalBytes":2600,"outputLines":45,"outputBytes":2600,"shownRange":{"start":674,"end":718},"nextOffset":719}}},"isError":false,"timestamp":1784293570414}}
{"type":"message","id":"4a6009b1","parentId":"58a3f1a4","timestamp":"2026-07-17T13:06:15.806Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing epoch write across subnets**"},{"type":"toolCall","id":"call_SJ38fKVOtAtiwwxjSbEjb6xp|fc_05c94249c2c507b9016a5a28c6b49081979360a3614ec13cf0","name":"read","arguments":{"i":"Reading registry per-row persistence","path":"crates/spt-daemon/src/registryhost.rs","selector":"580-735"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":7907,"output":94,"cacheRead":220672,"cacheWrite":0,"totalTokens":228673,"reasoningTokens":51,"cost":{"input":0.039535,"output":0.00282,"cacheRead":0.11033599999999999,"cacheWrite":0,"total":0.152691}},"stopReason":"toolUse","timestamp":1784293570459,"responseId":"resp_05c94249c2c507b9016a5a28c2de0c8197b40a4ba398f86c8c","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_05c94249c2c507b9016a5a28c54394819785a4ae333993400f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWijGBDHBbQtBtAZFgGxk9yZ3nct1tabZhQvU-GMYdMlidgg6eRiT5sPiBh7cwOqwFJBR0923m19Zc86FvqaBjoIotIXWO7e-ClV58HBObMNjr-Nnq9ruQ_hLsfLRKzui416Bx4DAwt8hVHpChGQ90Tft0Fwe9CLDGkvh9DgKEUrZoi4iI4B03krukDMAujcfAs1ZOfh42QwM-f7JKrTggGVcM1c6l_ko6pcpsHitl8NnSUnGHDynbqinl4I59PHuRR1XTdQtyvH-cGjcbV7c2iGIsmnxZThtcV8cm3eIBRch00wYYl0z0ToxWoiOz3AhiHqpnnXrXoVamnfO0fLYnKqFxFkpWbtmEeRNkNKuM8nsgn8b7eVV6VwNRHk3LQqR2mbD7-MgcKoP7z7GC2gAMhgzbbaehH-xEsED5gpvm3eMKzeU25oeJp5wqrN_PqM4d8NHquUyl_8AmTUkfdhM2bjMnke9rTOzzAG015Akjf_bz1B1lyN5QnSC70hzDxTRj7tv6Svuy0MqR_O0blBZp6zJ7Fr-hCYm-cul2NwrNUqqDQg-JePGKmccr-JFlRMOS9n-jcJ4nr827-LYnyth_3zRxrMd1nC5H4sKWxvzX3JFoiOCoV3aler01bgiTND00Yy3Q9x_qfJcaX_lU-WFosPDKxO2vS-VejXQF6QidlT4lxJ4o6EpxFTI2QdxxLP8wXivMpscE6CfzmrqDgbR7uljkaexH434bnLsVXbFis9XV8ebG6fIs_72Y0jN2gTdWzDBz5rUJIosMxVedJLj1b5g-jOrbTXDd8jm34kkQIEiceP5S0qpj7UK7sWF8PpJVKDq_zmASanvgaALWBwsWQ51zlV9R_uL6yjRSjFRFNPptMy0GyPBK20qejULEvJWxaULWJpax1teTRrCjrEo7vOgbnO8_gvgAboFqYDGUad9MxZnvGyLOeKpGkkGMwaDaO-p2xHgWiA7WsdiYZtALXMudQJO6IvhsTryA-iNddMkW8OUFFKroVEsbZ6Qo4pwcGad_b-d5WeM4SlLpC3bBK9ZpqGKAv8BD1LMd0vRIlZqPpNB8jgIE1KgczU37PL2ZBOfSQsVlavdfHIgdKPZZXyB4wcnhZDXAZ-yQw9M_6AKhoCnTP0DY--eE79Do9Vld1gmsMzjx5NTNhm0AfbOehealAl5763KJsV0UapCp5X4vhA=","summary":[{"type":"summary_text","text":"**Assessing epoch write across subnets**"}]},{"id":"fc_05c94249c2c507b9016a5a28c6b49081979360a3614ec13cf0","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry per-row persistence\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"580-735\"}","call_id":"call_SJ38fKVOtAtiwwxjSbEjb6xp","name":"read"}]},"duration":5345.38560000062,"ttft":2847.2725999951363,"contextSnapshot":{"promptTokens":228579,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_SJ38fKVOtAtiwwxjSbEjb6xp|fc_05c94249c2c507b9016a5a28c6b49081979360a3614ec13cf0","toolName":"read","startedAt":"2026-07-17T13:06:15.806Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading registry per-row persistence"},"id":"bd657f85","parentId":"4a6009b1","timestamp":"2026-07-17T13:06:15.806Z"}
{"type":"message","id":"9d59abf6","parentId":"bd657f85","timestamp":"2026-07-17T13:06:15.826Z","message":{"role":"toolResult","toolCallId":"call_SJ38fKVOtAtiwwxjSbEjb6xp|fc_05c94249c2c507b9016a5a28c6b49081979360a3614ec13cf0","toolName":"read","content":[{"type":"text","text":"    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n…\n        for id in perch::list_self_perch_ids(owlery) {\n…\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n            let recent_projects = recent_projects_for(&perch_path, owlery);\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status,\n                    epoch: ep,\n                    resources: resources.clone(),\n                    last_active_ms,\n                    shell_adapters: shell_adapters.clone(),\n                    // The node label rides every row this node authors\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\n                    // startup, so a rename converges by re-advertisement.\n                    // [impl->REQ-SUBNET-3]\n                    node_label: self.node_label.clone(),\n                    // The hashed machine id rides beside it (M8 decision\n                    // 13/22) — the re-pair overwrite anchor.\n                    // [impl->REQ-SUBNET-7]\n                    machine_id: self.machine_id.clone(),\n                    // The endpoint's own type tag (REQ-MSG-6) — read by the\n                    // cross-node user-msg gate, keyed by the proven node.\n                    // [impl->REQ-MSG-6]\n                    endpoint_type: endpoint_type.clone(),\n                    // The unified subnet-display parity datums — gossiped so a\n                    // remote picker renders bound/controlled/harness-only with the\n                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound,\n                    controller_node: controller_node.clone(),\n                    harness_only,\n                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\n                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n                    adapter: adapter.clone(),\n                    recent_projects: recent_projects.clone(),\n                    controlled,\n                };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                match advertise_if_visible(\n                    reg,\n                    &vis,\n                    &sub.name,\n                    sub.hide_new_endpoints,\n                    &id,\n                    instance.clone(),\n                ) {\n                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                        subnet: sub.name.clone(),\n                        endpoint_id: id.clone(),\n                        instance,\n                    })),\n                    Ok(None) => {} // hidden in this subnet — not advertised\n                    Err(collision) => {\n                        // Bare-id collision (another node owns the name in\n                        // this subnet): loud skip — resolution is the user's\n                        // rename (D3f), never a silent overwrite.\n                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\n                    }\n                }\n            }\n        }\n        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\n        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\n        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\n        // this scan only refreshes perches that still exist, so the stale row is\n        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\n        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\n        // epoch: the lease orders it, so it stops showing Active locally\n        // (resource_projection skips non-routable) AND peers converge to gone. Only\n        // still-routable local rows are touched (idempotent — an already-Offline\n        // ghost is left alone).\n        // [impl->REQ-HAZARD-ROSTER-GHOST]\n        for sub in &subnets.subnets {\n            let reg = regs.entry(sub.name.clone()).or_default();\n            let ghosts: Vec<String> = reg\n                .endpoint_ids()\n                .filter(|id| !live_ids.contains(*id))\n                .filter(|id| {\n                    reg.instances(id)\n                        .iter()\n                        .any(|i| i.node == self.node_hex && i.status.routable())\n                })\n                .map(str::to_string)\n                .collect();\n            for id in ghosts {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let instance = Instance {\n                    node: self.node_hex.clone(),\n                    status: Status::Offline,\n                    epoch: ep,\n                    resources: None,\n                    last_active_ms: None,\n                    shell_adapters: Vec::new(),\n                    node_label: self.node_label.clone(),\n                    machine_id: self.machine_id.clone(),\n                    endpoint_type: None,\n                    // An erased ghost is gone — unbound, no controller, not a\n                    // harness seat (REQ-SUBNET-DISPLAY-PARITY); Offline is skipped\n                    // by the projection anyway, so these only round-trip the wire.\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\n                    bound: false,\n                    controller_node: None,\n                    harness_only: false,\n                    adapter: None,\n                    recent_projects: Vec::new(),\n                    controlled: false,\n                };\n                reg.merge_instance(&id, instance.clone());\n                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\n                    subnet: sub.name.clone(),\n                    endpoint_id: id,\n                    instance,\n                }));\n                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\n            }\n        }\n\n        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\n        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\n        // (zero Self perches, or all hidden) still names itself to peers rather\n        // than rendering a bare key-prefix. Rides the same epoch lease; merged\n        // into our own registry too so the snapshot carries it. Emitted every\n        // round regardless of endpoint count — redundant-but-robust when rows\n        // exist (the render prefers a trust/instance label anyway), the SOLE\n        // carrier when they don't.\n        // [impl->REQ-SUBNET-3]\n        if let Some(label) = self.node_label.clone() {\n            for sub in &subnets.subnets {\n                let Ok(ep) = epoch.next_epoch() else { continue };\n                let reg = regs.entry(sub.name.clone()).or_default();\n                reg.merge_node_label(&self.node_hex, label.clone(), ep);\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\n                    subnet: sub.name.clone(),\n                    node: self.node_hex.clone(),\n                    label: label.clone(),\n                    epoch: ep,\n                }));\n            }\n        }\n        drop(epoch);\n        drop(regs);\n        self.write_snapshots();\n        out\n    }\n\n    /// Evict every registry row authored by a **silent** peer node\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\n    /// within `ttl` has its rows removed from every subnet registry and the\n    /// snapshots rewritten, so a dead node identity can no longer poison\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\n    /// node authors them fresh each pump tick and is never in its own heard\n    /// map). A row whose author has NO heard stamp is treated as silent —\n    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\n    /// (own rows, excluded), so an unstamped foreign row is already an\n    /// anomaly and fails toward eviction. A merely-offline peer reconverges\n\n[Showing lines 579-738 of 2429. Use :739 to continue]"}],"details":{"truncation":{"content":"            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\r\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\r\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\r\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\r\n            let recent_projects = recent_projects_for(&perch_path, owlery);\r\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status,\r\n                    epoch: ep,\r\n                    resources: resources.clone(),\r\n                    last_active_ms,\r\n                    shell_adapters: shell_adapters.clone(),\r\n                    // The node label rides every row this node authors\r\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\r\n                    // startup, so a rename converges by re-advertisement.\r\n                    // [impl->REQ-SUBNET-3]\r\n                    node_label: self.node_label.clone(),\r\n                    // The hashed machine id rides beside it (M8 decision\r\n                    // 13/22) — the re-pair overwrite anchor.\r\n                    // [impl->REQ-SUBNET-7]\r\n                    machine_id: self.machine_id.clone(),\r\n                    // The endpoint's own type tag (REQ-MSG-6) — read by the\r\n                    // cross-node user-msg gate, keyed by the proven node.\r\n                    // [impl->REQ-MSG-6]\r\n                    endpoint_type: endpoint_type.clone(),\r\n                    // The unified subnet-display parity datums — gossiped so a\r\n                    // remote picker renders bound/controlled/harness-only with the\r\n                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\r\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n                    bound,\r\n                    controller_node: controller_node.clone(),\r\n                    harness_only,\r\n                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\r\n                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n                    adapter: adapter.clone(),\r\n                    recent_projects: recent_projects.clone(),\r\n                    controlled,\r\n                };\r\n                let reg = regs.entry(sub.name.clone()).or_default();\r\n                match advertise_if_visible(\r\n                    reg,\r\n                    &vis,\r\n                    &sub.name,\r\n                    sub.hide_new_endpoints,\r\n                    &id,\r\n                    instance.clone(),\r\n                ) {\r\n                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\r\n                        subnet: sub.name.clone(),\r\n                        endpoint_id: id.clone(),\r\n                        instance,\r\n                    })),\r\n                    Ok(None) => {} // hidden in this subnet — not advertised\r\n                    Err(collision) => {\r\n                        // Bare-id collision (another node owns the name in\r\n                        // this subnet): loud skip — resolution is the user's\r\n                        // rename (D3f), never a silent overwrite.\r\n                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\r\n        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\r\n        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\r\n        // this scan only refreshes perches that still exist, so the stale row is\r\n        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\r\n        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\r\n        // epoch: the lease orders it, so it stops showing Active locally\r\n        // (resource_projection skips non-routable) AND peers converge to gone. Only\r\n        // still-routable local rows are touched (idempotent — an already-Offline\r\n        // ghost is left alone).\r\n        // [impl->REQ-HAZARD-ROSTER-GHOST]\r\n        for sub in &subnets.subnets {\r\n            let reg = regs.entry(sub.name.clone()).or_default();\r\n            let ghosts: Vec<String> = reg\r\n                .endpoint_ids()\r\n                .filter(|id| !live_ids.contains(*id))\r\n                .filter(|id| {\r\n                    reg.instances(id)\r\n                        .iter()\r\n                        .any(|i| i.node == self.node_hex && i.status.routable())\r\n                })\r\n                .map(str::to_string)\r\n                .collect();\r\n            for id in ghosts {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status: Status::Offline,\r\n                    epoch: ep,\r\n                    resources: None,\r\n                    last_active_ms: None,\r\n                    shell_adapters: Vec::new(),\r\n                    node_label: self.node_label.clone(),\r\n                    machine_id: self.machine_id.clone(),\r\n                    endpoint_type: None,\r\n                    // An erased ghost is gone — unbound, no controller, not a\r\n                    // harness seat (REQ-SUBNET-DISPLAY-PARITY); Offline is skipped\r\n                    // by the projection anyway, so these only round-trip the wire.\r\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n                    bound: false,\r\n                    controller_node: None,\r\n                    harness_only: false,\r\n                    adapter: None,\r\n                    recent_projects: Vec::new(),\r\n                    controlled: false,\r\n                };\r\n                reg.merge_instance(&id, instance.clone());\r\n                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\r\n                    subnet: sub.name.clone(),\r\n                    endpoint_id: id,\r\n                    instance,\r\n                }));\r\n                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\r\n            }\r\n        }\r\n\r\n        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\r\n        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\r\n        // (zero Self perches, or all hidden) still names itself to peers rather\r\n        // than rendering a bare key-prefix. Rides the same epoch lease; merged\r\n        // into our own registry too so the snapshot carries it. Emitted every\r\n        // round regardless of endpoint count — redundant-but-robust when rows\r\n        // exist (the render prefers a trust/instance label anyway), the SOLE\r\n        // carrier when they don't.\r\n        // [impl->REQ-SUBNET-3]\r\n        if let Some(label) = self.node_label.clone() {\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let reg = regs.entry(sub.name.clone()).or_default();\r\n                reg.merge_node_label(&self.node_hex, label.clone(), ep);\r\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\r\n                    subnet: sub.name.clone(),\r\n                    node: self.node_hex.clone(),\r\n                    label: label.clone(),\r\n                    epoch: ep,\r\n                }));\r\n            }\r\n        }\r\n        drop(epoch);\r\n        drop(regs);\r\n        self.write_snapshots();\r\n        out\r\n    }\r\n\r\n    /// Evict every registry row authored by a **silent** peer node\r\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\r\n    /// within `ttl` has its rows removed from every subnet registry and the\r\n    /// snapshots rewritten, so a dead node identity can no longer poison\r\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\r\n    /// node authors them fresh each pump tick and is never in its own heard\r\n    /// map). A row whose author has NO heard stamp is treated as silent —\r\n    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\r\n    /// (own rows, excluded), so an unstamped foreign row is already an\r\n    /// anomaly and fails toward eviction. A merely-offline peer reconverges\r","truncated":true,"truncatedBy":"lines","totalLines":1851,"totalBytes":8569,"outputLines":160,"outputBytes":8569,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {\n…\n        for id in perch::list_self_perch_ids(owlery) {\n…\n            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\r\n            //    a local controller has driven_by=None so that WHO datum undercounts it).\r\n            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\r\n            let controlled = info.as_ref().is_some_and(|i| i.controlled);\r\n            let recent_projects = recent_projects_for(&perch_path, owlery);\r\n            let last_active_ms = info.and_then(|i| i.last_active_ms);\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status,\r\n                    epoch: ep,\r\n                    resources: resources.clone(),\r\n                    last_active_ms,\r\n                    shell_adapters: shell_adapters.clone(),\r\n                    // The node label rides every row this node authors\r\n                    // (REQ-SUBNET-3) — set from the OS hostname at daemon\r\n                    // startup, so a rename converges by re-advertisement.\r\n                    // [impl->REQ-SUBNET-3]\r\n                    node_label: self.node_label.clone(),\r\n                    // The hashed machine id rides beside it (M8 decision\r\n                    // 13/22) — the re-pair overwrite anchor.\r\n                    // [impl->REQ-SUBNET-7]\r\n                    machine_id: self.machine_id.clone(),\r\n                    // The endpoint's own type tag (REQ-MSG-6) — read by the\r\n                    // cross-node user-msg gate, keyed by the proven node.\r\n                    // [impl->REQ-MSG-6]\r\n                    endpoint_type: endpoint_type.clone(),\r\n                    // The unified subnet-display parity datums — gossiped so a\r\n                    // remote picker renders bound/controlled/harness-only with the\r\n                    // same fidelity as the home node (REQ-SUBNET-DISPLAY-PARITY).\r\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n                    bound,\r\n                    controller_node: controller_node.clone(),\r\n                    harness_only,\r\n                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\r\n                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\n                    adapter: adapter.clone(),\r\n                    recent_projects: recent_projects.clone(),\r\n                    controlled,\r\n                };\r\n                let reg = regs.entry(sub.name.clone()).or_default();\r\n                match advertise_if_visible(\r\n                    reg,\r\n                    &vis,\r\n                    &sub.name,\r\n                    sub.hide_new_endpoints,\r\n                    &id,\r\n                    instance.clone(),\r\n                ) {\r\n                    Ok(Some(_)) => out.push(RegistryFeedRecord::Instance(RegistryUpdate {\r\n                        subnet: sub.name.clone(),\r\n                        endpoint_id: id.clone(),\r\n                        instance,\r\n                    })),\r\n                    Ok(None) => {} // hidden in this subnet — not advertised\r\n                    Err(collision) => {\r\n                        // Bare-id collision (another node owns the name in\r\n                        // this subnet): loud skip — resolution is the user's\r\n                        // rename (D3f), never a silent overwrite.\r\n                        eprintln!(\"REGISTRY_COLLISION:{}:{}\", sub.name, collision);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // Ghost-heal (REQ-HAZARD-ROSTER-GHOST): a LOCAL perch that was ERASED\r\n        // (`api session-end <id> --erase` removes the owlery dir) is no longer in\r\n        // `live_ids`, but its last-advertised row lingers ACTIVE in the registry —\r\n        // this scan only refreshes perches that still exist, so the stale row is\r\n        // otherwise immortal (no re-advertise to bump it, and own rows are excluded\r\n        // from silent-peer eviction). Advertise such a row OFFLINE with a fresh\r\n        // epoch: the lease orders it, so it stops showing Active locally\r\n        // (resource_projection skips non-routable) AND peers converge to gone. Only\r\n        // still-routable local rows are touched (idempotent — an already-Offline\r\n        // ghost is left alone).\r\n        // [impl->REQ-HAZARD-ROSTER-GHOST]\r\n        for sub in &subnets.subnets {\r\n            let reg = regs.entry(sub.name.clone()).or_default();\r\n            let ghosts: Vec<String> = reg\r\n                .endpoint_ids()\r\n                .filter(|id| !live_ids.contains(*id))\r\n                .filter(|id| {\r\n                    reg.instances(id)\r\n                        .iter()\r\n                        .any(|i| i.node == self.node_hex && i.status.routable())\r\n                })\r\n                .map(str::to_string)\r\n                .collect();\r\n            for id in ghosts {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let instance = Instance {\r\n                    node: self.node_hex.clone(),\r\n                    status: Status::Offline,\r\n                    epoch: ep,\r\n                    resources: None,\r\n                    last_active_ms: None,\r\n                    shell_adapters: Vec::new(),\r\n                    node_label: self.node_label.clone(),\r\n                    machine_id: self.machine_id.clone(),\r\n                    endpoint_type: None,\r\n                    // An erased ghost is gone — unbound, no controller, not a\r\n                    // harness seat (REQ-SUBNET-DISPLAY-PARITY); Offline is skipped\r\n                    // by the projection anyway, so these only round-trip the wire.\r\n                    // [impl->REQ-SUBNET-DISPLAY-PARITY]\r\n                    bound: false,\r\n                    controller_node: None,\r\n                    harness_only: false,\r\n                    adapter: None,\r\n                    recent_projects: Vec::new(),\r\n                    controlled: false,\r\n                };\r\n                reg.merge_instance(&id, instance.clone());\r\n                out.push(RegistryFeedRecord::Instance(RegistryUpdate {\r\n                    subnet: sub.name.clone(),\r\n                    endpoint_id: id,\r\n                    instance,\r\n                }));\r\n                eprintln!(\"ROSTER_GHOST_HEAL:{}: erased perch advertised offline\", sub.name);\r\n            }\r\n        }\r\n\r\n        // Node-level label (REQ-SUBNET-3): advertise this node's hostname per\r\n        // served subnet INDEPENDENT of endpoint rows, so an endpoint-less node\r\n        // (zero Self perches, or all hidden) still names itself to peers rather\r\n        // than rendering a bare key-prefix. Rides the same epoch lease; merged\r\n        // into our own registry too so the snapshot carries it. Emitted every\r\n        // round regardless of endpoint count — redundant-but-robust when rows\r\n        // exist (the render prefers a trust/instance label anyway), the SOLE\r\n        // carrier when they don't.\r\n        // [impl->REQ-SUBNET-3]\r\n        if let Some(label) = self.node_label.clone() {\r\n            for sub in &subnets.subnets {\r\n                let Ok(ep) = epoch.next_epoch() else { continue };\r\n                let reg = regs.entry(sub.name.clone()).or_default();\r\n                reg.merge_node_label(&self.node_hex, label.clone(), ep);\r\n                out.push(RegistryFeedRecord::NodeLabel(NodeLabelUpdate {\r\n                    subnet: sub.name.clone(),\r\n                    node: self.node_hex.clone(),\r\n                    label: label.clone(),\r\n                    epoch: ep,\r\n                }));\r\n            }\r\n        }\r\n        drop(epoch);\r\n        drop(regs);\r\n        self.write_snapshots();\r\n        out\r\n    }\r\n\r\n    /// Evict every registry row authored by a **silent** peer node\r\n    /// (KNOWN-HAZARDS 4.10): a node not heard — no admitted inbound feed —\r\n    /// within `ttl` has its rows removed from every subnet registry and the\r\n    /// snapshots rewritten, so a dead node identity can no longer poison\r\n    /// bare-id resolution with phantom ambiguity. Own rows never decay (this\r\n    /// node authors them fresh each pump tick and is never in its own heard\r\n    /// map). A row whose author has NO heard stamp is treated as silent —\r\n    /// rows only enter via admitted feeds (which stamp) or `advertise_local`\r\n    /// (own rows, excluded), so an unstamped foreign row is already an\r\n    /// anomaly and fails toward eviction. A merely-offline peer reconverges\r","startLine":466,"lineNumbers":[466,null,508,null,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":8569,"outputLines":160,"outputBytes":8569,"shownRange":{"start":579,"end":738},"nextOffset":739}}},"isError":false,"timestamp":1784293575825}}
{"type":"message","id":"97010bcf","parentId":"9d59abf6","timestamp":"2026-07-17T13:06:35.719Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing registry and git process overhead**\n\n**Assessing registry feed performance and logs**\n\n**Planning notification for log timing update**"},{"type":"toolCall","id":"call_E9f3AQmqNPE5pK06wADaCWFe|fc_03d0392e39927ecb016a5a28dae4988193be1a9fcc4a8771f8","name":"irc","arguments":{"i":"Sending cadence proof","op":"send","to":"Main","message":"Stronger field timing proof: pump born log line 1017 at wall 1784292560815; all workers `last=None` so due immediately (`pump/mod.rs:587-591`). First paired 10s dial timeouts line1254-55 at 1784292586908. After round completes/mark-ran, notif due 15s + 10s timeout predicts 1784292611908; observed line1424-25 1784292611960 (only ~52ms local work). Registry due 30s from first completion predicts start ~1784292616908; next 10s timeout line1610-11 is 1784292643383, so pre-dial registry local phase consumed ~16.475s. Source explains it: exact current bound-perch ledgers yield 200 non-owlery cwd rows processed per registry round; each row invokes >=1 git subprocess before dedup, plus 26 epoch atomic writes for 12 perches×2 subnets +2 labels. This nearly exactly explains dense ~16s CPU clusters and 27/90 hot seconds. High confidence, falsifiable with git.exe process-start capture.","replyTo":null,"await":false,"from":null,"timeoutMs":null,"peek":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":4631,"output":747,"cacheRead":225792,"cacheWrite":0,"totalTokens":231170,"reasoningTokens":452,"cost":{"input":0.023155000000000002,"output":0.02241,"cacheRead":0.112896,"cacheWrite":0,"total":0.158461}},"stopReason":"toolUse","timestamp":1784293575875,"responseId":"resp_03d0392e39927ecb016a5a28c84a688193b6c1b914b8bdb86d","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_03d0392e39927ecb016a5a28cb3ea88193a23ccbd778a2bf5f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWijacovn3pESUifOwqjo6ExRQPvoDiaV3qanI9ngX3nNfg7uP4OpiJmbBA76bC7drA2LsVXuzz9zgTOELv-zyoe4r6FR9JJ0-ms2Xkf-ebcaeEj41beWbxQj8gEDGPpB7Y0WfZ3El3tTBWdakyrx3POFLQsGG1jYghRmHUP5-wRC_afA2Bek8GFngOtp2d0pZCCFekUEoIAHcJWN9cAweyODsQ-EJczaBDmXlyo4bEk7iGo185y4Bj1fgex-UCW2Sv-OIYw0nfQ9lwODLaMrbx1tghmkUC9lOoWGEelMvPjPPY-JLr2iVgUWBIKeB5spCc7S2yWUGpzliLzgGz1rFPuZyYKkfLloXk560pdzSQXeK7U6ppQI6TRbfJSJ_CNrsof4d-o9NWYzJ3RorPswIBrhO8GSM-uqOrcYS_I8DvaHzr4Mz74B28Vt-lHpUelrunekEZRV9eFNn7icVrwlonHrnqEjdnU043DrL1UtH3N7CaHiQRY84mVHgdXLVE_79iMO_KUBbW7c7_OPor12UjLsz94XXd3PoQbjnbIwO6oc5jg2SlNn_7Vc0ZmDlN3luRo1vRQMbnY0BGM4S9AVh_WK_0wxU96tnyGZKrqI-hlgMYEWuGvxiw9ZI915XyrntgV69rHQVzzEMDbldiDCfFhhXnzIfusFaWgzN7b9lur0rOztBVXaQ2Po-kEBQrX7EHHUNH33WEdUs8XxXJiKIQxyBnJJ-Ek2TAGXcmizJ84W8T7nFv52FZuxSWQS0GxSCvXqeWQiV2_di1lfQ7A4yASJ7Ax4OfmyCTEIEbrsQVQoNsFgRlSgS07WRBzp6hH526NJVD6pC5zbf950Z_tR5nuDUHgdUmV7i49e5B68BHKrUk2VRfqhlUwU3OuWKCi0ugUQg8DiW-Np-ZDGWVj_p3Di0wGnb9j0_BkPtUMCmhZHlEGaaZXq4srL4JXgaDqvSTUpUw_kG03yZhDC55aSi91N6pb3dF7dfoPwtorY1yOrLIIJw13v50DxwRiK-OSyCrgz4nXBus02uB2ujdgNT6oLICysHlq8MnRmOaPLQxXO3YfO19JWcp2yencmwOI6T-gQwC2Lvded1jcs4F-DlCi-ixypqUe9vw35C1G7pRm3g_Wa3KXHAXGhZj7dbvtrny1-eQQ0c8xT0oQuHTq36HJB1F_v4d1MFSiySx1Ff71kTRLuQ4Kn6GkxRljRuwaiYOFQ9DAdDpU3FbY5-eeGE6K29KYD7_sKWeVPJ9OCd4i2PtArTvIK5MZLTIVRPUF0ItUvcVwsprsElrGW3-WoAY_d2HlgMmFN1ytZTp9Lyd5m93tgrtGt_Mlrx0weLYcd4SMoqRVRV4OjQvybvdLgwuGRCWS1M24R82aatabA-U8RRaQ0J00voGGeBZQEEdYekFyNXvajP_iJLD5WYFAFDXdn-NZ2aQZBfshFo8TgpZ8XmXkw9QOied5J8KNjaYRw-M1sYCdwg-OlEv2XCd2wpD1lHlc34UqYsxXerHY7JNU8hacyrfB6QILAhfTt_aLb38FXtvIDnAbNVRRWgOXfILK553MfQRmyMc1c1VR2VDniHr0026aPiK8kb1wULYHp6n27LeTUM-B9iSdWUOm5tbwLyV_1p9mXgImCfMMn9wnpXKE13wPXktvmdbDo7d4aroURyg6sx4Uh9iMVzn15q2LdXP-k0R8OWNZ6KnIF9Bmfo1W0R9-OxGVRVRL-jeQ6259dwQzpUhD8s7Sn98cDfl9fN3D4X7FGG5Xv17TD9joJr_FfVUj7pVXwt6swbUf5y0E8oqOKuQp3n-M43hZ2lv9p5Rl8Et7lvOnrL8caJqp1ojHGIgsF-wwPcogdmEAlSB2OnXlrnem57DOeXMyVRVxX-35biEj4PHC3OIOssKnYWFnGELwffOEg4dNUKNCJaOkp2ft7DahkEWOLZkd6K8mPy_upUX4Yf7jtBXOe2cOOq9N6lCIJYR9lDJXWIlvypvhue1XpeGcYXrCODTvJbSQCZah0y-dsvhkAMchyCXOjfLNCFPA6gnF1VpPX4cClycfBuYLMybVyB7PNYeSy4AfT-i7UKVq0zTygtnp04f6d_FD2SoUI8aK_ZndTytjwkqdFEKn6N05dFc_c_81f2Fl-wyqqunQYdK4Zx4h4OteT2_XIMzbfLuaxx7nL4XJfN982BQm503Y1JVPOOwPr37MLvCPZCmrA4ZAi6oeiko2mx-ddwgNw9hQbzpaW6HX3Ooz-NEAy2cFsxR6UGOgpd706Pu8cRc96FVN4Tjgl9NZy6JxsIe3uRD9Wn39PfapV86pSiacc5Y3yuiuQxltHQVZh51GCArOPuOMa96pBZWi3Y-ZZOTHwQZBsuP4IDxIMha0Smwul7kBCaBXlVG_e6qwAKA6xftwzw8J4msHkf2qYQEeRRhpy7TMvQ3dcsNktAxYwf3N5zWUbA_FrMhl6nOtM42MZWPKr6jOn5agyzcJlVS2mAbTTJeWSvyI9TIITcrODVOxSJ6goq5kqgSvnYIeLrP0s4sjUVi8g4XVZLcJ8vBNshB0VuUPZ44aormF3Xoi93SuEvdUKzzV-KRyw7_x8N8fOO_h6-vsz1KdBzpONl3_jIlAkVpLkTwUsgK2ktVGJAGQTfL5ECgUD7cuMsH2-unUgbhjQlE85m-t34IzxB9QIRiS7L1uXddrUdEWyt0E2lNrcg0OiG_w2I7mnoCHAooJfFSB0Czqsdv4H99i4udLQh1iKdOKyJoc1gmYQ6ZsMYwqhK-iD4_8p2HdsAIo6XGZq-BfFyTMHSwYCHKxfI6L17PGTwrRuSav1DUwBDBbONV9N1BjGz6YJnuG64VqEyLo755fVY7lMWckWb7Q3jW2oM49Z_WChEZ0fBahzbxUdGEFeUPj46B3kukWpiOdWiTl20JBSZiD3M5et_oXix08j_a-aBsw0r4BT7sCw4dQroGPdEq-jxDzoKB3Pr0OADrBXVQUf8btnLKwK6uZ6CLEfUWwLNlNQwiTxF7ZzIvEIUNSe_SNwa5yrjJQSeYDJbV_6vBxidIYw3h5akxME8RTw2FyTooa05j2pbYilz1MFX1vJ0IsCJ8LW7Pv1mbrFaDwSeqJ1fIgf8DVYq6hguus7xCjcK2vqtuRdRjesGzqXcWt_HRXA8xGbbKU5bEYnQSlAOy5bSah5-zREwp0JBvCFgPCuJUyOqTT9jXcGd0yRt-D8vbiddi_Icy-G4zJXdamm5APJdeYVXWcvpNF67zdaQk7_6TT_UbEcbloQC1er8PKAO1fcS1Dqx6cU5ALer4fnVB-t7vdbAdk-1tuREcahmucZLxUnRWs335h8LJ7Nb2tgMQuDtyY_zM55e2hgpdKSyXpuxRwLwzgsKrTi1pNtPSShusyOKZwkAQj9rDORAfYong_X3DXtqZPT3EU2oXxnFM-RndNB4tguwEmGdnVjtfZiZUDIUV8ueFD8eLc4B9LVPobX3kDy0PiBv70MMnleGpb7JUysw7m-PuGckhTBqwgtgVjPtXNlkbvB9q1sML0odUjPMk1bAUXAkCwioR-Pxp8LvM5xak351tBwGiI=","summary":[{"type":"summary_text","text":"**Analyzing registry and git process overhead**"},{"type":"summary_text","text":"**Assessing registry feed performance and logs**"},{"type":"summary_text","text":"**Planning notification for log timing update**"}]},{"id":"fc_03d0392e39927ecb016a5a28dae4988193be1a9fcc4a8771f8","type":"function_call","status":"completed","arguments":"{\"i\":\"Sending cadence proof\",\"op\":\"send\",\"to\":\"Main\",\"message\":\"Stronger field timing proof: pump born log line 1017 at wall 1784292560815; all workers `last=None` so due immediately (`pump/mod.rs:587-591`). First paired 10s dial timeouts line1254-55 at 1784292586908. After round completes/mark-ran, notif due 15s + 10s timeout predicts 1784292611908; observed line1424-25 1784292611960 (only ~52ms local work). Registry due 30s from first completion predicts start ~1784292616908; next 10s timeout line1610-11 is 1784292643383, so pre-dial registry local phase consumed ~16.475s. Source explains it: exact current bound-perch ledgers yield 200 non-owlery cwd rows processed per registry round; each row invokes >=1 git subprocess before dedup, plus 26 epoch atomic writes for 12 perches×2 subnets +2 labels. This nearly exactly explains dense ~16s CPU clusters and 27/90 hot seconds. High confidence, falsifiable with git.exe process-start capture.\",\"replyTo\":null,\"await\":false,\"from\":null,\"timeoutMs\":null,\"peek\":null}","call_id":"call_E9f3AQmqNPE5pK06wADaCWFe","name":"irc"}]},"duration":19814.75609999895,"ttft":3384.042599990964,"contextSnapshot":{"promptTokens":230423,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_E9f3AQmqNPE5pK06wADaCWFe|fc_03d0392e39927ecb016a5a28dae4988193be1a9fcc4a8771f8","toolName":"irc","startedAt":"2026-07-17T13:06:35.719Z","intent":"Sending cadence proof"},"id":"c8dc69cd","parentId":"97010bcf","timestamp":"2026-07-17T13:06:35.719Z"}
{"type":"message","id":"b503ac7f","parentId":"c8dc69cd","timestamp":"2026-07-17T13:06:35.720Z","message":{"role":"toolResult","toolCallId":"call_E9f3AQmqNPE5pK06wADaCWFe|fc_03d0392e39927ecb016a5a28dae4988193be1a9fcc4a8771f8","toolName":"irc","content":[{"type":"text","text":"Delivered to 1 peer(s):\n- Main: injected"}],"details":{"op":"send","from":"ResidualBrainCpu","to":"Main","receipts":[{"to":"Main","outcome":"injected"}]},"isError":false,"timestamp":1784293595719}}
{"type":"message","id":"03e0fca2","parentId":"b503ac7f","timestamp":"2026-07-17T13:06:43.705Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Verifying subnet identity registries**"},{"type":"toolCall","id":"call_C5eVLIgjHvehdPjJ7OQLD5rH|fc_0cc90384ae2f5246016a5a28e316508197b1108310cb600d40","name":"read","arguments":{"i":"Reading current subnet set","path":"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json","selector":"raw"}},{"type":"toolCall","id":"call_rXvZMwE1u68fP70P6eSt7Hh5|fc_0cc90384ae2f5246016a5a28e316608197a1719a1391d71416","name":"read","arguments":{"i":"Reading registry snapshot directory","path":"C:/Users/decid/AppData/Local/spt-core/identity/registry","selector":null}},{"type":"toolCall","id":"call_dTUPIqc1MsRFZENvabrQnViC|fc_0cc90384ae2f5246016a5a28e3166481978adc86809fdfc7f5","name":"read","arguments":{"i":"Reading current roster set","path":"C:/Users/decid/AppData/Local/spt-core/identity/roster.json","selector":"raw"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":3352,"output":239,"cacheRead":227840,"cacheWrite":0,"totalTokens":231431,"reasoningTokens":94,"cost":{"input":0.01676,"output":0.00717,"cacheRead":0.11392,"cacheWrite":0,"total":0.13785}},"stopReason":"toolUse","timestamp":1784293595736,"responseId":"resp_0cc90384ae2f5246016a5a28dc1188819790dcd2eac437531e","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_0cc90384ae2f5246016a5a28dea06c819796f2b300d59e5ad8","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWijjouQLpkXH4vWc7_bkh-xitXyH7p9QZuCutrFTV4TDzIftRlGTXR5G4hYzm6INS-xxeTKNLVs2Ij0toUHYwXcrAPFgFTm5_M8Bjl6ra_llbpQKhniKsYd2EeBtXO3ETFVFKBn3fU81u80bR1yuOv-xofdWYg6ZwuH71bybmqBjU55S7Jv7Ov8u59eph8pTWrTM6ZATr8nk7oDZevNS32_rtTE2bXkjLwFgZAkRMkEFVj-FiJKdaCVVACRBDyY2SGbZyczhiGpRa3O69Tur_u8PsqUVCIWjZzaP_ybOPYEo7hvII3Cv7go_GqmFwgBU0ZCRSwjvi9wmNUDbrjn_NNc3Imy0lH4yiy1dt5uH8j2zx4nJ1PPwX-cCqO1sYpi8q4JaAAQEkkM29n0oCtojjHfwQ-rlI-PbL-FaD8tnOFK80ApbUKpSzVVg6p4yRCMZm2vOTNV5K_dUo7LJtdZOfp0XOMzbFXwTzfrv__ognjgm6c3cSR_QqGJEYZ6C5CgyvC5ICjzC6LgEszpJ7PUO45jyqqwf9nfb6IpKVQUlp_DFuLzHjju9yb9PpHFBp6zZqVY12fmI7xFfFc2MWu7PuO5mcyc74X4qTwvI63dwofZfaPUtwcHvCAZ7INi15qjyp_wAbRgPZ0s6WVuNIscCI2wLglNY697xVDuGAUSD9R2HgGFVIjPy24mzzyBbZgexsZKLuoja0FNACzUywfx254IAAprHv-1EchTBSLRY2Kcv63r4YqIDPblZvXC-EM38vmxU_Y3Isvbs3qPwfhW7W4rU57x7Ig98IN4KENLWmN83bWq0y0CiTHQyj9LjvQLvTndxO80vqkXUUhrWK8UbYK441iQPbzoazewQsEVOCHkHKGdG1FOa9Cvpq9xKus1Wcpq-PikjfoD4wKSvNOXpIXzj7uZfIEcWIwFwaMyvUAFrC5S6opFP7UnXFjB6d-nIBON3h3f06bTgph6Whroj1rtWGatWoscWFWEg3hPiNWAgjTn9V-psOSbf5-vCAQol5fM2zwlO69K34aFd1X627lEUl0eh1nDCMpgtsKA1e6RqCbW0KARe6aG2JOpizF4HcWpB7xzoORKeeakPH1N19chejzVh7PgAkO2fUWh2qdiNK9c8ghxHGZ4QV8jKMdEgN47bgc_2fhnwQz7IfGSKox12TzccTRo_dRLdTzF-AVWTS7Fwd_e12egizGeegNNBIGDxOd0yCBy-VQRy50JOXnlIio3xz8aOzVmzd1mi7mlLJ3OWCw9G8my49zhLakN08lYLSci65WpgEILupKpe4axCsdb8ZuRpTU1rKmcxo8fiDNEjTid9alBKb46b5sobZ0pnhKq22woEkjxHNOicFwdl0OarpCa3UoAyg1ahs-PtY4DamY9FXlBFmWfLb39P_tzE9Un9FRvxf5A5XyUkfcb1mQ==","summary":[{"type":"summary_text","text":"**Verifying subnet identity registries**"}]},{"id":"fc_0cc90384ae2f5246016a5a28e316508197b1108310cb600d40","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading current subnet set\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json\",\"selector\":\"raw\"}","call_id":"call_C5eVLIgjHvehdPjJ7OQLD5rH","name":"read"},{"id":"fc_0cc90384ae2f5246016a5a28e316608197a1719a1391d71416","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry snapshot directory\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/registry\",\"selector\":null}","call_id":"call_rXvZMwE1u68fP70P6eSt7Hh5","name":"read"},{"id":"fc_0cc90384ae2f5246016a5a28e3166481978adc86809fdfc7f5","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading current roster set\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/roster.json\",\"selector\":\"raw\"}","call_id":"call_dTUPIqc1MsRFZENvabrQnViC","name":"read"}]},"duration":7967.5764999985695,"ttft":2906.9421999901533,"contextSnapshot":{"promptTokens":231192,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_C5eVLIgjHvehdPjJ7OQLD5rH|fc_0cc90384ae2f5246016a5a28e316508197b1108310cb600d40","toolName":"read","startedAt":"2026-07-17T13:06:43.706Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json"},"intent":"Reading current subnet set"},"id":"ad9532a4","parentId":"03e0fca2","timestamp":"2026-07-17T13:06:43.706Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_rXvZMwE1u68fP70P6eSt7Hh5|fc_0cc90384ae2f5246016a5a28e316608197a1719a1391d71416","toolName":"read","startedAt":"2026-07-17T13:06:43.706Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/registry"},"intent":"Reading registry snapshot directory"},"id":"9c8402e2","parentId":"ad9532a4","timestamp":"2026-07-17T13:06:43.706Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_dTUPIqc1MsRFZENvabrQnViC|fc_0cc90384ae2f5246016a5a28e3166481978adc86809fdfc7f5","toolName":"read","startedAt":"2026-07-17T13:06:43.706Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/identity/roster.json"},"intent":"Reading current roster set"},"id":"7bfceb18","parentId":"9c8402e2","timestamp":"2026-07-17T13:06:43.706Z"}
{"type":"message","id":"f1394c1c","parentId":"7bfceb18","timestamp":"2026-07-17T13:06:43.707Z","message":{"role":"toolResult","toolCallId":"call_rXvZMwE1u68fP70P6eSt7Hh5|fc_0cc90384ae2f5246016a5a28e316608197a1719a1391d71416","toolName":"read","content":[{"type":"text","text":".\n  - heard.meta         342B      just now\n  - BIGNET.json        9.1KB     just now\n  - SPT_DEV.json       9.2KB     just now\n  - BS-Resources.json  7.6KB     2d ago"}],"details":{"isDirectory":true,"resolvedPath":"C:\\Users\\decid\\AppData\\Local\\spt-core\\identity\\registry","meta":{"source":{"type":"path","value":"C:\\Users\\decid\\AppData\\Local\\spt-core\\identity\\registry"}}},"isError":false,"timestamp":1784293603707}}
{"type":"message","id":"62cd730a","parentId":"f1394c1c","timestamp":"2026-07-17T13:06:43.709Z","message":{"role":"toolResult","toolCallId":"call_C5eVLIgjHvehdPjJ7OQLD5rH|fc_0cc90384ae2f5246016a5a28e316508197b1108310cb600d40","toolName":"read","content":[{"type":"text","text":"{\n  \"subnets\": [\n    {\n      \"name\": \"SPT_DEV\",\n      \"seed_hex\": \"04d75fcecd5d307974bb15dd90fbd9c8ad49579e\",\n      \"epoch\": 1,\n      \"created\": \"1784111377\",\n      \"hide_new_endpoints\": false\n    },\n    {\n      \"name\": \"BIGNET\",\n      \"seed_hex\": \"f66208577423b34a670cc4beb7c3acb534200001\",\n      \"epoch\": 1,\n      \"created\": \"1784163111\",\n      \"hide_new_endpoints\": false\n    }\n  ]\n}"}],"details":{"displayContent":{"text":"{\n  \"subnets\": [\n    {\n      \"name\": \"SPT_DEV\",\n      \"seed_hex\": \"04d75fcecd5d307974bb15dd90fbd9c8ad49579e\",\n      \"epoch\": 1,\n      \"created\": \"1784111377\",\n      \"hide_new_endpoints\": false\n    },\n    {\n      \"name\": \"BIGNET\",\n      \"seed_hex\": \"f66208577423b34a670cc4beb7c3acb534200001\",\n      \"epoch\": 1,\n      \"created\": \"1784163111\",\n      \"hide_new_endpoints\": false\n    }\n  ]\n}","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json"}}},"isError":false,"timestamp":1784293603709}}
{"type":"message","id":"9b7cc843","parentId":"62cd730a","timestamp":"2026-07-17T13:06:43.709Z","message":{"role":"toolResult","toolCallId":"call_dTUPIqc1MsRFZENvabrQnViC|fc_0cc90384ae2f5246016a5a28e3166481978adc86809fdfc7f5","toolName":"read","content":[{"type":"text","text":"{\n  \"members\": [\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"KITSUBITO\",\n      \"machine_id\": \"67ceedba5b6c5c686d19ba6701663b0f4170a9b0eabc6f58799819751353422e\",\n      \"address\": {\n        \"id\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.98.197.12:51330\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:51330\"\n          },\n          {\n            \"Ip\": \"192.168.1.154:51330\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784292576\",\n      \"lease_epoch\": 36363\n    },\n    {\n      \"pubkey_hex\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"SCELTOUIN\",\n      \"machine_id\": \"4d89a3fef59046c584f9974d658b99c55717980390b9d0c2cbac7f48e453cb39\",\n      \"address\": {\n        \"id\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.105.1.5:61419\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:61419\"\n          },\n          {\n            \"Ip\": \"172.29.112.1:61419\"\n          },\n          {\n            \"Ip\": \"192.168.1.156:61419\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783206905\",\n      \"lease_epoch\": 399\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"GRAVITY-RUNNER\",\n      \"machine_id\": \"c507fc3b0804c21897e392d056d41694a6b2122e2ed3ad9b79f6b88bbf04d144\",\n      \"address\": {\n        \"id\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.65.194.82:55908\"\n          },\n          {\n            \"Ip\": \"192.168.1.8:55908\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784007760\",\n      \"lease_epoch\": 1130\n    },\n    {\n      \"pubkey_hex\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"Athenaeum-Library\",\n      \"machine_id\": \"ee3dd395538c2412eedc540abfe786dcd67f198fcfaeb0efe2ff0a73d690998a\",\n      \"address\": {\n        \"id\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"10.48.0.7:32945\"\n          },\n          {\n            \"Ip\": \"10.124.0.11:32945\"\n          },\n          {\n            \"Ip\": \"64.227.107.3:32945\"\n\n[Showing lines 1-300 of 354. Use :301 to continue]"}],"details":{"truncation":{"content":"{\n  \"members\": [\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"KITSUBITO\",\n      \"machine_id\": \"67ceedba5b6c5c686d19ba6701663b0f4170a9b0eabc6f58799819751353422e\",\n      \"address\": {\n        \"id\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.98.197.12:51330\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:51330\"\n          },\n          {\n            \"Ip\": \"192.168.1.154:51330\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784292576\",\n      \"lease_epoch\": 36363\n    },\n    {\n      \"pubkey_hex\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"SCELTOUIN\",\n      \"machine_id\": \"4d89a3fef59046c584f9974d658b99c55717980390b9d0c2cbac7f48e453cb39\",\n      \"address\": {\n        \"id\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.105.1.5:61419\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:61419\"\n          },\n          {\n            \"Ip\": \"172.29.112.1:61419\"\n          },\n          {\n            \"Ip\": \"192.168.1.156:61419\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783206905\",\n      \"lease_epoch\": 399\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"GRAVITY-RUNNER\",\n      \"machine_id\": \"c507fc3b0804c21897e392d056d41694a6b2122e2ed3ad9b79f6b88bbf04d144\",\n      \"address\": {\n        \"id\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.65.194.82:55908\"\n          },\n          {\n            \"Ip\": \"192.168.1.8:55908\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784007760\",\n      \"lease_epoch\": 1130\n    },\n    {\n      \"pubkey_hex\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"Athenaeum-Library\",\n      \"machine_id\": \"ee3dd395538c2412eedc540abfe786dcd67f198fcfaeb0efe2ff0a73d690998a\",\n      \"address\": {\n        \"id\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"10.48.0.7:32945\"\n          },\n          {\n            \"Ip\": \"10.124.0.11:32945\"\n          },\n          {\n            \"Ip\": \"64.227.107.3:32945\"","truncated":true,"truncatedBy":"lines","totalLines":354,"totalBytes":8675,"outputLines":300,"outputBytes":8675,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"{\n  \"members\": [\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"KITSUBITO\",\n      \"machine_id\": \"67ceedba5b6c5c686d19ba6701663b0f4170a9b0eabc6f58799819751353422e\",\n      \"address\": {\n        \"id\": \"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.98.197.12:51330\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:51330\"\n          },\n          {\n            \"Ip\": \"192.168.1.154:51330\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784292576\",\n      \"lease_epoch\": 36363\n    },\n    {\n      \"pubkey_hex\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"SCELTOUIN\",\n      \"machine_id\": \"4d89a3fef59046c584f9974d658b99c55717980390b9d0c2cbac7f48e453cb39\",\n      \"address\": {\n        \"id\": \"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.105.1.5:61419\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:61419\"\n          },\n          {\n            \"Ip\": \"172.29.112.1:61419\"\n          },\n          {\n            \"Ip\": \"192.168.1.156:61419\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783206905\",\n      \"lease_epoch\": 399\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"SPT_DEV\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"HFENDULEAM\",\n      \"machine_id\": \"fd8aed2a77898d1676a8185b557b289535fec881081a7058a2e4b4287efd8200\",\n      \"address\": {\n        \"id\": \"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.68.35.65:50289\"\n          },\n          {\n            \"Ip\": \"107.131.129.74:50289\"\n          },\n          {\n            \"Ip\": \"192.168.1.81:50289\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 698820\n    },\n    {\n      \"pubkey_hex\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:51096\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:51096\"\n          },\n          {\n            \"Ip\": \"104.174.122.7:49847\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:51096\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:51096\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:a5fc:5632:2d02:ea4d]:51098\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:51098\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784293312\",\n      \"lease_epoch\": 479457\n    },\n    {\n      \"pubkey_hex\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"ENLYZEAM\",\n      \"machine_id\": \"7db2d2d30778850d1fbe740d68d1f31d6fec69a11c1c19d47e26742bbce11574\",\n      \"address\": {\n        \"id\": \"39c018a4c8c92c99aaa2b069e7daa8d0188d0db58b1fc57cf34569f88eabeab1\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"76.80.65.5:57900\"\n          },\n          {\n            \"Ip\": \"100.125.242.88:57900\"\n          },\n          {\n            \"Ip\": \"172.28.240.1:57900\"\n          },\n          {\n            \"Ip\": \"192.168.1.12:57900\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857::6df]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:21fa:537d:863e:9b16]:57902\"\n          },\n          {\n            \"Ip\": \"[2603:8000:a800:7857:f862:2f27:bac2:2337]:57902\"\n          }\n        ]\n      },\n      \"last_seen\": \"1783572729\",\n      \"lease_epoch\": 371215\n    },\n    {\n      \"pubkey_hex\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"GRAVITY-RUNNER\",\n      \"machine_id\": \"c507fc3b0804c21897e392d056d41694a6b2122e2ed3ad9b79f6b88bbf04d144\",\n      \"address\": {\n        \"id\": \"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"100.65.194.82:55908\"\n          },\n          {\n            \"Ip\": \"192.168.1.8:55908\"\n          }\n        ]\n      },\n      \"last_seen\": \"1784007760\",\n      \"lease_epoch\": 1130\n    },\n    {\n      \"pubkey_hex\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n      \"subnet\": \"BIGNET\",\n      \"label\": \"Athenaeum-Library\",\n      \"machine_id\": \"ee3dd395538c2412eedc540abfe786dcd67f198fcfaeb0efe2ff0a73d690998a\",\n      \"address\": {\n        \"id\": \"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\",\n        \"addrs\": [\n          {\n            \"Relay\": \"https://usw1-1.relay.n0.iroh-canary.iroh.link./\"\n          },\n          {\n            \"Ip\": \"10.48.0.7:32945\"\n          },\n          {\n            \"Ip\": \"10.124.0.11:32945\"\n          },\n          {\n            \"Ip\": \"64.227.107.3:32945\"","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/identity/roster.json"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":354,"totalBytes":8675,"outputLines":300,"outputBytes":8675,"shownRange":{"start":1,"end":300},"nextOffset":301}}},"isError":false,"timestamp":1784293603709}}
{"type":"compaction","id":"336cf0d4","parentId":"9b7cc843","timestamp":"2026-07-17T13:06:43.853Z","summary":"You are resuming a prior conversation. Its earlier turns were archived to reclaim context and are reproduced under HISTORY below, oldest to newest. Read HISTORY in full, then continue from the live conversation that follows it.\n\nThe archived transcript is compact: each turn opens with a heading — `# User ¶`, `# Assistant ¶`, or `# Tool call ¶` — assistant reasoning is wrapped in _italics_, and tool output sits inside `<out>…</out>`.\n\nReading HISTORY:\n- Plain-text sections are the verbatim transcript — rely on them exactly.\n- Some middle sections are attached as images instead of text. Each image is a page of that same transcript and belongs at its place in the reading order, between marked delimiters. Within an image, a solid black cell marks a newline and runs of spaces collapse to one.\n  - A frame is one grid 196 characters wide and up to 71 rows tall: read left to right, top to bottom — there is no word wrap, so a word may break across rows.\n  - Text inside `<out>` is dim gray — that gray is archived tool output, not conversation.\n- When an exact earlier detail matters and a section reads unclearly, re-derive it from the workspace (re-read files, re-run commands) rather than guessing.\n\nFILES\n===================\n. (Read)\n# C:/Users/decid/AppData/Local/\nspt-core (Read)\n## spt-core/\ndaemon.json (Read)\ndeadline-5106270b-52d7-4a87-b78c-4edc06911b25.json (Read)\n### identity/\npump-health.json (Read)\nregistry (Read)\n### index/\nproject-index-stats.json (Read)\n### logs/\ndaemon.stderr.log (Read)\n### owlery/\n#### lia/\ninfo.json (Read)\n#### mobile-gw/\ninfo.json (Read)\n#### perri/\ninfo.json (Read)\n#### todlando/\ninfo.json (Read)\n#### wakep9/\ninfo.json (Read)\n#### webbie/\ninfo.json (Read)\n# crates/spt-daemon/src/\nbrain.rs (Read)\nbrainproc.rs (Read)\nbroker.rs (Read)\nconfig.rs (Read)\ndispatch.rs (Read)\nlifecycle.rs (Read)\n[…14 files elided…]\n\nHISTORY\n===================","shortSummary":"Archived 230,406 chars of history onto 15 snapcompact frames (+27,833 chars as text)","firstKeptEntryId":"b5e396a8","tokensBefore":231431,"details":{"readFiles":[".","C:/Users/decid/AppData/Local/spt-core","C:/Users/decid/AppData/Local/spt-core/daemon.json","C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json","C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json","C:/Users/decid/AppData/Local/spt-core/identity/registry","C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json","C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json","crates/spt-daemon/src/brain.rs","crates/spt-daemon/src/brainproc.rs","crates/spt-daemon/src/broker.rs","crates/spt-daemon/src/config.rs","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/lifecycle.rs","crates/spt-daemon/src/livehost.rs","crates/spt-daemon/src/nethost.rs","crates/spt-daemon/src/projwriter.rs","crates/spt-daemon/src/pump/mod.rs","crates/spt-daemon/src/pump/notif.rs","crates/spt-daemon/src/pump/registry.rs","crates/spt-daemon/src/pump/sync.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/shellwake.rs","crates/spt-daemon/src/stderrlog.rs","crates/spt-live/src/ingest.rs","crates/spt-store/src/perch.rs","crates/spt-store/src/project.rs","crates/spt-store/src/sessions.rs"],"modifiedFiles":[]},"fromExtension":false,"preserveData":{"snapcompact":{"frames":[{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"iVBORw0KGgoAAAANSUhEUgAABiAAAAYaAgMAAAAgkEnVAAAACVBMVEX///8AAACAgIBJX6m2AAEYc0lEQVR42uxdTY7bOrNlE26A0MgXSOaER4JX0Q/IAnqQ7IfokZehoXFX+VR1qsgiRcl2p5N07icFaVsSf4o8Iimrjk4591Pbjx/9739q69nQHrsnzWdpzw7En2jP4ajfnpvjz69PL08vzn39/vSKz2fzeTgeyNgDUh+z4XH+76f1+uZzEd8Gmy40ycJyh7IlfA3npgYu8gobqnLZrkHTxLDsYHNsaI75aWjSem3FdqfGfptCU29VZwHiCfv5+PEwdzadPRyQ6kBH9PNwfCJjj8hzqIBAjX7NmqSNMZblHAGfwZ4oJQkQsS0bqWBDVS46VC1LfgmEOeabYyH4ugWpB0SnnanfJg/rqrL8PUDQP7rcj04+D+VTgHhBnqcaiLVLG/tpUCA6yeQLGz1UQNDfGG0jQtUZBgj3QUC4e4Bwm0C0bXJ9IJ5f9XOebvjv1/n/P69fv+PK545/ESBenO7L548flOd4/PpK3507TTGeJqqK/g7z32E6z//pk/7NxyZqXEy0px3G5y+cZs5x5pzDZZgbQ+nO81lpGB2JyOmbsjlF+vGjlMvHL8MEIOh4pHGUaJ+sTOHEucsxyqnl41jgnGTRVdJ6KdfnGnrt9CttIisHd871UtuRFh1MF/nctU/89zD/PeAoX/lfX59mYASII+27l+dXBYJSH2nnSIaPIcZx7oXzRH897dMsEeiT/tHEeKbmJtrzDjN9pPPjyEfGgBEQR77+E+XHZHbmtSXGyGW2ZdO5Yb6KS7mBjs+pAQTXn0qnjyEFKnoM5RhdsShfj5GtmOfeJK2Xcnmk8LdeO/1Km6gddJnMqQOA0LR5gX6mJXn+f3QMBKYqvfIPX/jziY/Qpx0RAgSPCDTdcVVo/jB/H67zcXe+DtzpfJXRdXHVEXG+RtMAMTpgIaP8wZUREdKc2vlF2XlE5HIDlRsHl4FwZ1c6PYa3gNxmRFwJCLKzGhFXAIG0Xsr1uYZeO/1amwSI85UnPQJCLhLnZGpyr0fqYKdA0NR00A6XKeqJjxQgsEYACKwR4wIINwVcjXTJTgDCpXhxU8xzeeQUYwcIShdkppZlL0WZ6+uy8xqRy6VBMk9vUwEiJp37FQi+FnU9SBEjguw0a0SUEaFpUa4vNfTamfpt0sU68sXFY16BoA59fqmmpoOOiKPDXROW5ueXAx8BQPSJuyYG4oC7JlojxgoIGoRxjGZqYiBkAgjcED43znlhdDBTU6T9YO5LQsJE1Jatd01aLiYA6o4fP7xOTREdjAnocplTjKdJj80ljzo15WNsCRX+FjQtyhUggo7Opp1prU06uQEIL1PTnIMW62dZrGmZnpfs+T+AmCcr/h3BR1+e3YGPEBD4PYHfEfPZb0+v+B0xXyEXLNaRV4p5yE7zvfiFPsti7SItorS8Bb4vGijdJfKyOBs2UU4s1pTO85jQ+zEsu/Q7oi47yu+IXO58n4s652PpzN9iwO+DIVEuGrpUqx6bS75wvVS+HAtsCVmUAtLyxYPlXL5R6Yt2xn6byK4zpeReoD0s8vKT4uju2Xqp2l/W8UYZ/177v3zqb0jl3eNbscfn30x0Zddp/KL+Nk17DBYZW0P5tmVnXLS8Tv2eNt5o+H1AuLuM/hh7cGN86xFH7ObrH4tVue23X9WmdwHxp7f9od8OxA7EDsQOxA7EPfbsQHwSe3YgPok9OxCfxJ4diE9iz18LRL9iOvpZro3PeI3+ApseAcK7D3xO8icb/als4meSlslQcxnOdCbAP5O5E8mr+9LpE5VY7WWXOj0pbrZhaYHZYpUHX+j55Pla7Lhri23JZS82B2M5Fvq2DpXVOX+4z6bzdWlaDwh+Ml4c6PnpP9wjqVRWnjoqTwJuDjhJvKkkO3OST/VI6oylBoiSJyjIjM2y0aFTXj6dlAsS1AVVAxGLTQDCd4AoZAFvr9xVIPyyiEXHh58AIvI/C0RTbGhGhAJxvp4Xj75vAVHyFCBGACF2dDMugHCu9H+o+iM21qyPiDuAaGx6JxDCSEjw0SpDAu4VeG4BBv9jnzQ5frSy2V3imGXBfwd+KAwmA/MWJoyIQfgNSAGnCvYL10K4HOA35BHBpU5U7wlAiB1XKfGcS3XC0zjJMQfP+IW+z0fYSeVSqWMuXL8ltYbZGBeeCCPtw8uovAy4b+ncWVszpy42SUsceCeUlo4kuQJKiThfWo9P6tqxAAFHo7j+1IU+wdnouWPgCtXVIrFbEs7RMcDUMbsu2XsNVxh7byUFu1KY9xCI7RHZxShXPafCGsFMDE7Hdl3OqdjxJv5geJ1RL5yhYwjZNUnOSS5PHKfe1EHmybcEa0bmW8RRKRAhFHevk16ZbeLmwHqyvNik7A7wTrjt818AcU6lRDqP/LYXmG1ggHAAgpgSCgSNCJ0GTw7kAB0Rb8GLWxQNHWQ+H/j8kAfmcM2MBkdcCabVXIPO/oGmIuE9mOkPpdI5BsvY8RbUU62lCgWBmutQsnTdNWYgQl1HHNDJyUk65VMQN4PKyECwzTIirjEGuVApT7FJ2R3gnWifvOURoSXCam29frL5ZY1QIGLmGWCN0Gkwpm0gwNMAp8HxntMuykBEHRGuAIGOHLtARLNYqx3bQKBkMD2iy0CMsa4jukk4TJJOgYjMFaEcmf+BXpHRokCAmqA2ZXYH+9gprQWilChWs42lF/haUyB8PTWFAoRMgzQeKiAuF2+GoZkieOBpl8bMb/A6FRLfI2QgZGo6Tcr1KPdmyv0AEGpHBiKXqlMTjmUgRqQiK4dLMnV4mZryZZGt465iYhutF8L/YP4F7c8lxlAugrHYpJwO8E4oLR25XLwCIUfV6lD1Ai/W+jtiSFhmwXnwU/kdkYEgZoIBghYuj0WN7vRlYZXc2Z87CL8BKYgrwdPVBBPKYh3dUBgNuFdhfkT5HaF2JC6NmRO5Xl5UL8SYQMkugpNBR8jKuS9MHUMCuVI7BOVQ+5QGycPcoS/IZlofmFdygVXoOwvEILcPXvIGLPvJMelNSxwmzW97wdw/9ZgMv+4RR7zzWGvLT9RY3cF6pTPfzLG+v7TJsjvaG+Buifc3878DBMZnqYOu1HtyrO8vbbrF7miPfgIg3rPtD/12IHYgfnGjdyA+SaN3ID5Jo3cgPkmjdyA+SaN3ID5Jo3cgPkmj/5M2fVom0Oey6zdY8zNV+AeOvt8u/w4bfl8vheaz6wqOixyJHECTfRmrONKtFka8z760rDnK0VjbldMIs6JjrdQfWrtsLXHZwrTa4lsQTqt9Z+qiZ7/naUmB0NyqGLEBROFo1EDoG2TgLpQqQrA5H9hCryssENZOcVKGtghocXhNv2R/rAHRtHgbiNDUtw6E4aLAAWessbnvGBGhMyKmUV9z1YOF0RDc+4Hwm0C4Bog2j+Fs2BFRMy0MEP4DgHBdTZEOEE6AMNbk3Nktw96jk3AT4DRhPY0eR4NzXC4KxFX0JgqjIXC661R4GAPvW7YFXvfVGkrJQ821cIPhTIhKx2T4Jg55XLaOOBvwmEt6Y5e1/yQOoro2lFzspjfHr9ITOKepz019/b4jGzIXRYEwvA/kFlep6GOM5DIEN0EUL4RbseBosGvzjdcIcCqgN2HZHlTOW7A8DBfeitszhuwURT2l5JprQV6zUVgg4kMetRSfmRo6MkZhn1An+exzLnZZ+zltbJgdTnzu2W7SUnjjc1pr5po4cFC0vmXfsdWj6QMBQq0pucUNTjwJbxgG7Pt1hWXRcjSQ4y0oNeZNZA4so0Ed58rDmK/M65t8Ewe8EBHFw7zK56D0xAKho6p7UWgOXsonfoXLNKAiI+FZKqVMyqUW+kv8qZY9MmQyhPBHIi4grZXqBzekrm/Zd+CumLIECLWm5I6qH6Fmj6awwrJoORrIkTpAFEaDBYKnw4n29RuA0CXMdlF0Cz7HJNeh0feogdBy+kAQLyua2nItNLGmDntkisbuMiK0Vqo/uiUQ/b6zZSkQmRNTgBidDlQM5NMkk1UsJLEOR4NzlLsmASJYR3oGovAwxmpqwrWVGiBkarJ8jqJqsT01CdkFnA1XT015iahYIzo1ldpUGaTYTWvEWzhNzjBULE+l1NfpuxE2mz5gIAoVQ3PPK4kuXWdeViK4CBcoUgTc+y45GpwjBaVPpgC9iRoI0A0LD2O4pFDYFqJj4USdw5WSafm0fI6iaoGFryzWZzBOdLG+oAzPWhzaojOrcVgg1H7wSurahrxYq92kLpL4es43GtD+YH0NW1+n7y5ghZQ+OF/PU8WJ0dxh81760e3xX9a9+nz3+LZly5vL5ofm6vm6trV64zvbcm8vxT8NxP2Nir/Qrnjz3K8GYlvR4w8C4f7Ddn3yh347EP/ZBu9A7EDsQOxAfMIG70DsQOxA7EB8wgb/DwPxd3bM57ZqB+L3b1X0k/LwKdrnLEN1Nt4ss1XbCPZMI5uwXVrnbFhEbNnkn9jCxIXE6WJTyw1VjXCzB0Pbm7f7qa7BetpLdUnVKag4XyWJG+SSvtqGt98qIEIjotISAeKypIol4jtArIYRSSrmXgMRNoDwvULdksORdT86/JU7VVyCWwfCrQBxc5TdAiK7zLZLCysjYqVX7gDCNUB4C8RCVWOlUNflcITWlIeBOGVWApwaULLgiCMu61pMxYVk1S8KM6NV26jYGkleyaU3841+RdGlIFUPkXGXnJZLYWqSN5iVJQL9jFz7JbekUubAY2bWPcDLuxf43iAFj1osu0KZG8pPEQbJBodD2SU9/spZcrG9WYdD/w4ShUYYF2Nx7omSRRKVi1E9xeJiLIwOy8xYqm1UbI0krlVyTRr9iqJLkfJ7/z6/ut7jgMABWlgi0M+IUrtqb7TKHFFIdOckgQJGiXUhATkod8WuED+18lP0RXjL4VhyRhAhYMlfEW2O+Sg4KVFYIaNREHHqXzY6ABKL4S1LNgh34gr+RGF0FGZGT22jYmskUQuI8CEXHoPqUrxxmeCTEJUy8sK65IB44VioT9wLDwX/VXujVebQ4FKRdUay9z1GnR75dXrDrhDmhtIiwCDZ4nAou6THXwms00EtcNlal+Um9KJbAcKlFgjwFyyjozAzemoblq2hijIKROExqC7FG5cp69E0f+M+WnJA+kAwE0MjmjRAMKNiKot1dAUIvGuNWopV9YhQ1Y1tDoeyS3r8FT4mRwsfRUZEB4iQpyY2mph81XQxytRkGR2FmbFQ27BsDdpnZqBMTcV9rroUpFnRmZoWHBAvciMVEGNmYoyWX1GUOeTSABB2aioCP4brUZgbyk8pU9Mah0Onph5/Jcjk9mYUR/DNmbYK4wKshMJAYP2ToNE+sFxhOfJW/aIwMxZqG5atAXkknLH6FUWXglQ9lOxYbgyWHBBwMwpLBPoZYGLIN7SkUuYAz4NUH85YYHmxVv4HajGXR2ZuKD+lLNZrHA5ll/T4K150O1JQxRGR4HLFTvcntt8lKbF1Qy25TDyUYlW8q0S7LSPF3GPpIzX8Z4Dob5Y98TNAvM/SX1XDHwXiv2rVDsQOxG7VDsQOxG7V3uRPbtUOxA7EbtUOxG7E32DRb7HrPrWK3xlD5fMD8Uvi8C7UKvqbPcfPF2s2BT/13K7obh5Iz5Uf89+hObZ66Ux1vWv2tLwQ3TNqH5u6Hl72/r3Ge8HpanbcopL0Wst626EK7BGCv3VlLIAIK/atAREsmaFLLuhqZGwCUatp2D2j9hFW7JJ3wTV9NCBsA+Fr0zIQKwyGrS5t7QnOfSQQC4seBcKUvnmJ1Woadq+ofWzpenh3WgDh7h4R8gUsh1qtoqhPCP+h0qqQF10vgzhBCgeEfMPeSrNPhatgVTCYH5LdQOWlX8u6KBbRedXFACMCrBK4hU7TLY0MVcRACVqzsksqPYwmX6X2cUFJPV0PDlYgXZ8tdat15tgrJfbMaUKAi1atgj22yjhwJfaIk0gq7FQl9gKlKRyQcw4Aw3r4oXhmXaXikYQLAddiCst4KJZTkYLyMMCaUFZJqpgS6/wKVcSADUFq1kAFlR5Gla9+pR6u0rGr6+ENOW6U1+UhAh87dYLnQf1XwhcE8AtCq1YRi0YAz34ae0RHxBW+Lc2trIbgEI1FF7rCVVCdjKLiATaEY9qAZTMo68JGT0Ed6qxXv/ZbrXKxyq9QRQzYwHwK6G84xDgxehi1tkal9qFn+7oeBQjsB1Hjh3pJXafEXuH+Q+SarCVkVTRqPZaRmQkaeyRPrKEAEYWhUIDIs+RkSCPBqmC8BWVD9IAA66KKniJrQR+I6Lb5FTEUG3jEOaRD+ZUexioQ0RUgeroeFogoPcFe8mlZp5MeQ+C4AkSAnEkRSbDqE8Q4KLFHMhAjpqYgkXuU1SBAVHI78ne0KhjM59CpKVwuscO6KBbR+ZAlikoIpsulibiywq/IE0vRGsn/Uq2HUefrTE19XQ+f75F8FpGRcDthWadcPqN3tuccWA5V8UZ9glUqcuyRPDXRMnQ5T1isCwckOERjqRdrnhYulQpGBBdCeBpxGQ+l4lREHMEi5zOrhIa+YXms8itUEcNojeTUqdHDqPLVah8IixZ6uh5DYtZKEpqZ9MQgNyltnRJ7hftPY8/krrW/Y2Pz957YIx+//Zpf1lsNuY/S0rOrz4CPd/94XSk+Lv7ejj3yXwDiPj2M++3S8uKfb/bnA+LT27UDsQPx11i0A7EDsQOxA7EDsQOxA/HJLdqB2O3a4fpdFt9sh/+Fzf4I3sN/GIhY7yb4lDSe9CbFQLgPyygnXYZEQHiD9v2c9nO9tugqV36H73EX1MHG3Ubc6fyMTetXt3K6yVKpylVDBnOIulz7g06SOrm7doEABUDbld8U5RdgWyBCbrA4/Ky7XVL0GBK+0FAqIMLdQCz0MypWxBIIv1aUEZSgl9LFryh5agYHXTp+49rwbsEJSLlHuO2IGm7VT8jf4N0qEJoNXjoDRMOs6HEfAIRfHG/2PgqIItC/CYS7D4h4qoBwDwHhukA4AwS6PBjg4OaidsRTeXU1DhdRsiDHRoJxJwtE1tAAJ0FUJlxmcUzgcUDjonAi+tFOnEiv9LQ3qigqWdND1SuW+hnEilCbrN5F4UzAWrxYeyq6GJcKCJKIGDWvZXAUIDLvgv3P1sYhnxOH0eRzj3APpSH9+KHxV6T1TFVjIMhHjWFJr1aPQacmHRFRXkU/J6uhAU5CYP4B9CqYuxHExzsuIoZ0op0oEAxzqrU3KIqKedFcND1CqCOeGItGr7kkRkoQP3XIigeiiUGH2ONdIp7oGuFZMEVVMqybtAARhSciFz6XDhvLOX313mspYJckxFNB/BUMXGj0MxBSELEdItz3zRoxlhGR1SqENcHO0qvP5AH67kW5wrriB9cLsmGAcGenOh8adWW4Gg2MGPgYRlOJUmL1M3zOFUXfw0mZcymkiiM+duJzEGXBRjwpa4TnaZvdsVfL4ChAaKQZnYGodCd12AAexNzwzPTyyi5JskZo/npESDgN0aboADEbdwq1WoWyJoIocygQgr9rgdBYLC0QXstyManOB8/PkzA2XAGCjgU5t9TPgD7ImHPJWocyHVPAYO0IgstbsBFPekDEisFhRkTuSJFtQfgPF1INRKTa51Zpj5jFOq8N1RqRA72MHJRFRIJC8Pau6YJm21ggmCqCTArgItD3Wo0DnAi982qjnWQgltobgbRzzNTkljFerCsfVsxrwKh0Lm1ukEgmsJYpBKMAoRFPXKbNZM5KPTXJBKhTU7AjIpeeyjmdmuj2X0umtg/JAlHdNUFDw+VYIGBBnOfZEot11teYaCIoGhrgJLDKxOWcWRz0XXQ7kuVEMBdkEe1kSPz9qqVZVgYxL4LLGhhG08NGPDEWXfjXzvzppTSklVsItsoLV4NKY10M5XdQFBf6h3RJtTIKgwPn6XfEWXgXBQhmaCRamMs5XaxdlFK4h0Cck/grofM7oqaO2bvi+q7skd+xfmPfRjP5ua21KK6k67fQWudvvBmydd4qemzrcsTtX9aFv7DNZPj8z5riSrp7W/i+7ZEy3/ms6aeS/wEgPv+2A7EDsQOxA7EDsQOxA7EDsQOxA7EDsQPxR4D49SZuGbR1fj3f7SY+2gk9O27Z/tddKzsQvJEbxfNT3PmJ4RVPLP+9nvFq+TUF7M+J+LFWlFxnfFzzNznJj7untnyzBU0Ht9n8XLJtTKgbewZZINdQEtnj5UTLmrDlUir75HNYprKNkS9rdmbb2Et13njsFzQgvfBHSM/E9Atc4vJuZAoR7hDR0eZXy6NLsq9PTaOWlrQEI5qSpMzqaa6vezdouhDhMmFPlVuLYiLnjZOm2G6PFyBa1oQtt2VQ2FS94NLQS1+zM9sWMsiuTzLwySdzOZCPpFUwWQCRleXhSoUrsDwQLkD4dSBqIzaA8KaBznRYeYN5HQi/CkTNmmjLzd6xpvu3gOjbKcfEXRhXyuH545rHi8aWQBuJX3ASHgYpSWRygAEiJAvE7PJJ4FWAMyGvdqcTx1GhYzR2EEXFRD6xbIbMc9B04DdQIwsbAk4hr1wJPX8BQ8MXbQ9wI+rj4GcY1kRbrvUXg2/BOxxF5twwSZQb4lftxDFllFBfWUbHadJ+wYgY8gvDCsQAvkQQHobnWCnUnfMawRL/8DvxkVRGBEJ0jMLjcAhk46BSQI5KTGJkUokvUrEZjIoF0oHfwHoDmQ0BNyarabBdcn4MErklqIOV85bjzAMhBshoWRNtuZZBARcppUrZtatMkjHzVXhaXrETx3S2kL4qqiCiv8HqIexOZwf1eGbvJxRMhF/gnf5FUSdCleKiEHFAPMtwjmMKGuDrZq6E1ykhSOCkgOgoGBEaTaFiM2Seg6ZTfsO86GU2BNgTPq+SOK9KB6JkEQfJW44zf4JVNixroi23GhHM2IDuB+gNhUkSwyDe8kG81j07ccxwXAyjA6wP7Qeeha4ULyaaqYlukWQsFCDYxCRxUahhqQWCY59AFsIs1lHYrFxhwjgpQFg2g+E5SLqyCBY2hMZygRxKPi+8JXI6M39iQt5yXKOqxFCxJhblmjViiq4Ggmf5STR5hFFCnIw1O/WYclwKo2MMqrZRgCDejKp7FCACaUWAf+AL24b4HKPcNUUDRJEJiaNSvpJvgLhcyvgIrp6aap6DpgO/QTo62SgmxXQ5z9yOedZNwem93VAdzwyQsWZN1OXauyYdYd5dLmDnFiaJRGqBBkhasxPHSiCQwug4TYVqdBHG4NzyzE/JQBDzITjwMM4igYIBBV6E3rLS4MX+fBUS7+JyEh7HGYs1hVtyYDUQimBRlPgils1gdDlyukHuzwsbwlAdOZCSnGc+ByZ4KFwgbzmOsgNzNQproi3X/o4Ae2NOnWjJYQbLpEwSidSCY3HNThxTIHJfTSCUhtIvmJouQyZqBlEwcfdJFFhmwpLN8BFvOsQbv07r89H+wjLciNjNtb31dSu1xfEuO9dt7/dul0sS3efYHnnEoTYrf2INiJ9/xBHvsvNRIH4Fl+SPANE79+iZ+1P8DBB/4bYDsQOxA7EDsQPxQIodiB2IHYgdiB2IHYj/FBCf+7r4H4oj9N8Cwt/Yf6yUu3LH/M3wDO5I3Wlq9o+AC8KPwNP8RDKR34+9fw1DRDWC6UHbmV2K3WcxMZo3oqszVSyMvqWxsS5utm7QL6nhWaRwVy/E2rbENq9FqwmdrEyBKTyDGxWFCvNFbJZUxM3JOxJifjW8ZYgEjQ6P7ym/dFtdQykq/SA2Ty8NS6NtY3RWFOI2EEirXsclz8JXZa/FGWqAcJki0BsVa0AYnsHdQDjXic2SrMp8EXrvMkQCXpLNQLjO9X0HEP42EA3T4g4gcicugbhzRLi6jC4Qon1x0ege81DkEVEigIiTJA5ZyaIwOJZKF4XLUMv9i+csrDBEOkCw2obDS8eIonIC44Ocp0Fk3YWvIbalIRX9jRJxJds5FeuKtoflWcy+ZOGC8CvEzvIsJLpM0igxYl8um3gq6CUpK6jWB0/HE4AoOa6iQCKRV0T7Qh2fDqIXWCpCMJ0XNWRAxeBYKF0ULoMHF4R4Cldx6gtroWaIzEfZAY99SvMmivOIS4KaEa0EQBCS5ymWOCWjy65Ml4MxaMQVp9oZlXUafwXfRo1zwnPiKE5jAKE8C4kukzRKTHCaLuSpVW0drW3N1KQ53oSFApepRiSJqq2hy9LAsT7o2ODAgUD8EWY3ZAbHUumicBk8uCBBmQznKyR4OgwRaGIE4Y+Qjzuo8YQDasrUG3JFJlbQucpYCoW1gcgpwQT6GEQ7Y7jaOC1kU4mTkhUKyBnKl43GSSleZfQUgND0vqh9sINUbYWCR4m6YYHQHAACNswl4/IfkmprcAQVTBHg90ysozG7w6MoWVQMjoXShYk4kogLctKmOlWg6TBEQgGC0lgg6I1/uVtK+mK5tG7SiCgylsdCvbFAGOGIyWp3RBddDwi5tps1QmOlqL0KhKp9YLoNKatxQDyiA4TmICCCsjlyxBNnuApozqhMIbnvYbkUiTpSGBwLpQsT6CIxF+RigIi8NC8ZIqO5a4pRYqwEEHwyBcelMYBVyCu8jVIyEmtjuKhgUOFMgGMhvJHRaneMdtq1QMzpRstnsUCECghhUSnczARJhVY2IG4Mpqag2ibeXCjo1Tw1ZcaCcBJkaroMk/IkRERKlSwMg2OpdGGAiMwFmWA4huo59Rgi0ANhSiPbAxEtKu88KVODTp0mnTqZADblOCUXYmzQWsCL9aVwJlix4yK8kYvV7jhNGiWGawwa58RPEA/jfoiWZ6GxUjRKjBeVkqzHAfrpFPQWKMA27n5WIcGyrTlSEGGti/lddF80kbV0Vuli8dv1zpLXa4xh5cawY8Wt366/83d/fE/L72UV9NNZpYuPbuow/Zxtfw6IP8zU2B/67U39663bgdiB2K3bgdiB2K3bm7oDsVu3N/Uvsu4TG/g/J8Py6xvs35XqZ+1qI0j4hy36/UDkEB3R9eOGRLtTPdAa+ilNGnmt3W3l4o3VhotLvA4dMvSr39pS9T00+0stDNvKaPeiWPBjGVWmY8yy3LZ/hn7+GgifnRhWFmEJRGE2+OrUEggbuiJUeUKv61IPCN914TtXBRDZ3haVLbUwYkmY7F6UOtaBsPSArsZGVYdfBSI71myybSDWumUdiBaUO4AwMVy2gbhjix0gGn7FHUA0UWV6rKpluTeBAO+gsBugRgEWQ1GlIHaDZTvwq7nCSEDkEThzaMtRUS5Ddr7UahhdZY6psCSKzkYVw0Vy8IPxpDwTZWkQk0RtGHKYe37POZ7EXmVgqLtrydEobBb2Lps9fLOKGxr7ZXZrRbRkyI60Rblqt5MeFp5I6Ut2TY6G3ZDCKK+mY2pCBBLy5WqUEtXRyFEgkJ4JEAhwI8wQCPdnspiNOdJR5lA3bXLCmIBrs8Rw0Rwg5yDaQ2GTcNmxxK3QK22E+zMWN2dgmzRlzdEobBZuXd47T6N41YtFgeOROYR7COLYze7Xply1W3pYWS2lLx14BIXd8BbQZLAY4Jok7YjaDQ9Gg5ezAEJpaZkZQu5R5kS4Rg1jqcxBjApxgyaXG2QjppQcxJeQ2ERXEykiFhsGiZsioDC7DUE3HMdDIT7H+WpHhF+wWZxcXLoHhQ+ruCGKHVdwMXQEUByVTrlB7JYeVp5I6UsHHkFhNygQURfrqRdIIzMaJr1WQ9ZJ0qgoypNQwQWrUFErc4ycUhgkvEZoHYYTknNEYeJZBodjJkm2QXzReUQQS0XmZuWmRNcCwfcyhc3CkkBlT4mixaKgbJAA7kaARon0SV2u0CecBSJWfcm8A8tuIAaFmZp0ktFgS87oaEgqxBsJKdrwR3lqiqPGtapjjlhljpMGsgkVEBXrouQwLNkxlhBQYgMCiKB+XSNUCCVJ18uk6ZYcjcJmYSvMHizyRuhBxISIQZJAr7NTU1Ou2E3WXS4x8z9KX/ICWDU4Yn5DiDGvy+7F5yglWUdDl/LLWfgLckejUVFUcUJiH9qYI40yh0RL4TJhRNDFusRw0Rwmsgo3qZSIYGN5sb7gDkWjsTgpJ4hlzi05GoXNQlntHiw6TxaI3Ddcjp/OhqLaL3eQHh6kh0tfltvXX7Yt2Qx1zJF/r3E17/12ZT5W9471fSyVXq6f66l4K8GvBOI2m+EjgFirJd5pQ6+UXq7/uXjWn9WuHYgdiB2IHYgdiB2IHYgdiB2IHYgdiM/b4P9RIH7OnFtSJr+vKz6qtr+G/7QD8Zu3EmUktIYe5n+8HcXsp5dl/ufvdO5wPBy/vj43547N57NDiqdXt5KSytFO+vEdeWxerm226ytKOCztOW609bkHxEGzHLn+KsOh8618P2zXXcoy9ZZ4Ku0WQq1BEYqhR1RFePz4QcWi6KdsA/39eqQmPb08vRwPT5L3yRh2MAY+yZlDtwkHh3Kc1PZUlYW8XNuB8EJBT26tJOSpK3oyRw0QLwUP7byD+TjcAKL0x7E+fXRNf3Sv+OXRBRAvKPkwF4SuOR5qWwoQX79//X5cdMsqEKvdR+XcBOLojseD2xgR/Qu5lHU3EMcuEO1AvxcIExnEWU0KfA/CQ1DexFnYFj9+zNlfnl+P85TjXn78oA46Hp5f53/u+XWehl7/eaUJoh4RdPSfOcX8/5ujv5JyHp7zJ3Xm8yuZqsf+eS3/KaWOCKrtSfKUvFLbi3sRS75pTW1Js+kHsoPKRP7v8xkqcc45Hz0efvyglFTGk9g5t+e7lvSVz1H70cq5Ji6D7X5BGvfyj9iA3McDSqT0fB7TEtvOpRVuhXdFm0I1JcjrFQxvIggfYb4q56bPUzZdfEcdEfSPjs7HDl94hnk+ljXiiY9+mVN8mfO5+S/NQsf5CI+mwxOX6LgjDnyMUsxp+T+l1DUCIwK1lbyojb5RCXOlX7SmtiQC4nCgSYjNn4/9H9tFNeDoXMehlEF2fuFLmS1jW9BSauVc2xfHZRy1FD7L5h7RHwepG7UfdPLM5cz7hVtR/KuqvIGVI4CZQCNC3rEn4iEMZiBkRHz9TkvmjC9d099R5dNRB/mRznzPFXP3PH+nIc+dMZ/jEYFpACByCrpG0YDnPC1iRGQgJC9qozXrH7Lle6mpLcm5/zsceDXgkezQiTOA3+cxp0CYMthOAMFt43P0TSylFF+//99B7TxwOkpFQDzzd1ymzzw1HcxNxlwnpbPcCuPozpoSOb4IRG4miVpCxK+XowBh1ohXR9f96yE3uAaijJnnFydpFIgjrurXAoR7PfJ1hM8DnwMQzYjQvFzbkfZhW65pUVIG4ugUCL6WnQDxhYBAGe5FxyNAg3VHKnP+/0WAoKEKII5oP1K65xf0B5XJpb0CCG0LlfLEqQ23wjIOVFNCgMi8CZqmRJXp+AIgDge3mJoOVC3Z2ADxJY8IR1PT8QsPX0wPX3RqOuTrjI7+84pyy3BeTk3Ii9pe6C7iSMfoKGpqS3Lu2zcG4lCmJlojZGo6PH9jILgMmuthp0xNTq2m9v/zypPoF2rZ/+WjlPcFo8ChP+Yx8E1r1ylRL0aZmgq34my0KXyOA3IWRQ6JSkJpoC8wV8WL2av+jsASyYvqK1VLvwcsEF9fYQzN4M9YsubctEDyovXt6ysWT1qseWqidN+O+KQy84jAvYYufZrXAHHgZfKb1tSW5PjG6quUSeW8HNi+V7JuPs9TE8qYkzpu5QGL68HB6jkPlce/eigdlUH5X5Dm9YXbof1x4IXyGX3zcuCbkmdZrGXpf3yL7rFf1vjp1dxGHu6trf0J9uP7Y7+sS03Hu+uhNWLdgi3rNmo/tLfJt/J+OBC9o/dfAcc7S1w7V2q6H4jn148CotT+rmv+9rY/a/ok2w7EDsQOxA7EDsQOxA7EDsQOxA7EDsQOxG1zPts10rNHj91v618SG2gH4g9shyM/G3yhpyLkIKEns+yK5+1Yxcct3I58yPELuFNzqL+Frf2Q8yd8Dee6NpR9hT1DZctNIILazi8Sz4+aEYdaRR1uBzCx6hq+Z5fbkKKIvVIKABkIfloOBw8/cH8CV8MpU6OUFuquTGpAOR6bHl72tapyeHOyxFAJBYjoO2V5scdXttwDRJDa6SVT6AgUIDSkj29s6UtPNL2Q29wq4ISmn1rWjO8BAUcJPa4XIF6Q5qkGorYgDS43rmPU0L/oy5dgU5UAMBIPPbVA+BoI9yAQrgOERlnpqoeEpmO7F9cKEG4DiGYTxsV3jAQB4oWfnr+QZ7owNVTXggpRtgeExmOCTgUKtxFX+K3nhGgrOHeaROHCQYeDY6bYVEmN5mgj/Jq7lGV0OKj7Sp1GuSMDQTZA9YJqlr8iPE9eeo5wkkjQoahrcHSLyjZEThnc1UjVn/ILvM7s2SgzRmUjR5rJCiMQp4+FNUO1zJ8HMBMcPzE/koeKqCAKxMEwNfAW/8jcjjFHLeFXt5OIGkyYekvEFY0IIWFNwAEZoUUxquLFWKVKrOgRVY4hiJ4FIp0gWhF0k0qdQXgnNRDjbF1gvQ6nr9mPop4RPa5cGg2T1fsAhwW2EVQcaWU+9yZOZFUDgdqGM3s2ykyOsmIizah8gEZeKawZqmX+zK56csG/YETAd4wRUZgaGuBG37lHDATWjGENijwiqogrfM1ngaMSZ0TlUURYpaTKIyIk0vLA2/sc68XocPCIyHUiqsvgaiDIuiBaIEXzg48YIKy6hqpj1LYBCD4nBAukUxUGVuSo2pyjrJhIMy7zYSwQqt8QFQhMTcrzARBYIwpTAyOiBcLNU0W8kAZFnq+riCuOQnlMId8NSeSdBRCaqqwRrBLCMzn0MFTPIq8RuU5EdXFTD4ioI8KVKDEAoqwRJcqKjoglEHxeRSicBSIu2zwtI83g7iOyTsgSCBoRhzIijg53TQcHngTdNRWmBtaIsQKCY58kGMFaNqmOuKIxUkLI5+ap6TRJY4OZmrLUji5wUAlxUTU7svKGAKF1Cs/EFVEh+kRkFuqC05S7bRQljsh3WxmIovcBXRBjWwD/105NRW3DORsMazS6HctIMwJEmZqCBWK2kRgJAAK/H8BUoE/8jrBMjchSUgUIiX0SoW1xlngnNuIKIpwg2grOccgXXsKgw3GesFhrqvI7wkNBI5y1LIm7or8jcp1JI5rMxxL948+LhG66RJeX1osocVxIZaT8jrBA1LYhcspZYkUOWQ2kLNa6Z6PMlCgrJdIMitfIK6RtoqwZjh/mNrf2l/WN5G6ZwnfPlW9Q5XiP3mSxrYR4siPC1ota/r32S6lvdqP7uM1Gmnms334aiDsN/IAy2t8KdBX2f0fEG6X8OiBspJkPBeIzbftDv09o2w7EJ7FtB+KT2LYD8Uls24H4JLbtQHwS23YgPoltOxCfxLb/FBB/3pxfa8FnvPa79uxAPLr5n87fjXSMg9GtshPk4xZXozw9rZ6v8DNKTX8/L0MZD7H33MweidaeYHI6eVhc8zXS5kO4eF9XJ9e6nkOnO4ItseoxQ1sQKoCvgOixE8LdXI3iT1CnCpJKQHntF2dd6Ou8jPxsNZMIbENMuJFk7fF1N4YlXyMFfxOIdT6GCUUSNGUwJ0zaYC+RBhUbnSX1gHB9IO7jahgWRrAMhuhaIIrl67yMDwdCnHHT6B4EwnWAcK70f2gu+KyQndZLNNFZEvMJKPGPHzVHY5AIKoNwE+7maiQdtuR3Uq4CBxzI6UWavDAcklvhZah7iHxqYHYUbgaOUCrIsxseRbKMCxJRb/kalwu4E8rxgPYIR524g49xVol3rh2tZCdSWqRNS8ucxI9xxh4vcwYDUXM02I/K3mXlY9zJ1UiZhcHxUjRuyjCV9OyTsgyHuMbLyEE9kgJRuBl6RHVEDI8iWcYFu2IbvsYbOVn59X0JSRA1oss9fIwyuZLzFa0MXGObVty4pcSIaRqe9GJPBUTN0SC2ATEgBqeklju5GmZE5C6iTgsl/allOOiIWPAyBAh3dqXblZuhR6hEX9uTLOMCKWu+BgPBdWusF8on7b7JxzBABESF8VJWm7Zn2exaFm91sUeAwBpRczTcJLhJkI17uRp2jRgzEBQDrqSfR0/FcFjnZSgQMWFFqLgZfGSAakiy9iDeijIuYljyNVIFhGqPMNfiDj6GBSK6DMQYF2ljx7I5yaRA5HgxSfgEXtaIwtEofAvhJtzJ1bB3TacpcxWiTc8lGYbDOi8jR1GJ1JkNNyPl8DiBY7AYe7xhXMxdt+BrNECI9ghxLe7hY0hYKpmaUGMIwyUt0iZXtzzIta9AqD3zH+ITUNcSOpajUfgWwk24k6thf0dEl7kKwaYHG6MwHPR3xJKXMaSzhlDjSEEVNwNHJrHOlI/jOf7KZcnXSMzgC5mLIdoj4T4+hpfFmhkozPhgVkhIi7TJNS2nERw1KJwBovx0ISDWbuRuHfWbt4Er5xYMhx4vw6/WE51ODr3Slxbd88t6nWtxDx8jx3TZTOuVXO1WH3HcD8S921buJcOhx8u4Xfa9sVLuAWK9rHv4GHrmVlqaPzaBcH942x/6/YZueLdZOxCfxKwdiE9i1g7EJzFrB+KTmLUD8UnM2oH4JGbtQHwSs/73gNjN+ew27UB87g2RpJO+5Jdml878pPScOCb1Vd8xaxkhvSPGhY7NPCrj6NY5Z5vX6GrU4Y/vaoHJvchhbVotLSwqrKzoKW7Ux2K/tNZxXxz7XSD4qboCQV6PENXHFx1clTUjRBgb4REg8KRSc4ZQn8abn74LRNhok7j7c+6wAUTIpYW2N0IuPbWW27Shc+wGEHXnb79/F9PIQIziRFJ3R3QVEIuyQ28ayI6qBRDB5tRPv7R2FQi3DkTO3QVCbKqBWHbWhwFxnq7MKGBuhPAT2AXJ7o0rszDAZDhhf0K+kzsxECcFIhUgWHeDPdHBFZ4EWBHgaKgqBV7KVS6DHL2owoXqcWhOlAbWSHbZgOdxWfJO6jZdmalxlracTW7qg5OkgVaItemcS+Nv/HKwskNoqjlPRmUjW86uIaeWlFeDM7NkQq/CBcd9FGZHOilOJDj8HOgiGLnkH/aZyUCsDrz4TefH2UtN5+NlXhmucEye5a3jEY7ghHeIlScB9sacehqDqlLEUF5TFxckv9iuzshzipn3cZ5QWshjgHQ1xJk6LnknBERp0xuYGs6pskfOTUVBUeMtO3KNTdQaCeHAjt+ojA+q08t13loeXH5tPqjrObAOjzBLgqocONFiYCBghEZPkRFxzUA4YTKE4QpNCowIqvZNuoAYCufriaqUUewTRkR+Qz+Kd9hpiJzIyhSD4TKwVsVVFDNkjaA0YFqEzJTgZe/K1/SVuut87fFO6jYREINTtQDUhtywEmmYyzHXaW2iUgUIeM0jWhuDAaKxHEBA+QP1D1LfmVMNnEpUC/CJEVGMjk45GDUQSP6W35EHy+ktY8rnUwEi5CYugRgFiEgsialwGbQWZlBgaqL6JmFaVECU6w4EArfknVRtIiCkpAxEDAUIScPUiOgqm3J6Jsck8Eaii2axbi2XESEWc59NegxtolQykgWIuTNpFiduhM/8BNKtCMFMTcLqeCvneXFmLY4CRJS7Jq5wAURWsDipxIlMTepC56OjKGZkbohObhkInAGtZbRTU8M7qdr0lgNY6VnN7TScFaYmB1WPbBOXyulBDgJvxOWpScTWrOVOyGVQ/lDiWmCqW2k3XZDCG6E9T78FHPhN58nnxZjYHfQ7AUtNEFYHNCnkWg3DpB0PotX8N4kyRdJgUcqToPJ0sY4uszR4sS5A8IIn8la0JJ+VpZEXa7IYrBFOTyuULpwt76Rq02z5RY7KWc1NvyiwtlHrYFmxic+x7cTLOIvNQW4QzvhtE2vLwfM4I93Fq+jWRPUJs0QWa+GNTDEsb6M+ZNsmtMf2VvHBMm4zuX9mA9Fl/ewtXY1H6/pQ4x+s/i4gPqLs92xW1aN39l7eyL11fZptf9a0N/qvsmkHYgdit2kHYgdit2lv9Ce3aQdiB+J/2Kb3GvCYDMnf15nvb987aTw7EJ8ACChyLFkWZYvNl4GfSLpVHY24Yqimilpx0HAd2ZDNjZ/QNKkQZkBLQFuG9RIeVPywVq91ju0J295znRuvQU7d7scnXvItLAu/JgZR6XI08g032RSUMqhGcwEiDcWe4Fas9LbNwR5p3rgLaItfRfVRxQ8qq5fDWJdsTwR74aWSW1vXcllCB4gOSEsgii7Hlo5GdEs2BQPhlkCcjEm+CiZTd6fXFxiDWxyzQPhbQLj7gfDZ6vW5pA9E1gApHBa2LeSW5RLOwipQRQ4ocVj+Q8uOaGKoJNfoaGyxKRD1JDiNkOLEoaJGQcCcpdanyJob+F4YJeyqDCdlTLiTpGd3j8sv9LJUu3eFtwFlD1DfHlX8YNn3JgfYLQNzYFjUPfeE6I1Af0MUDwbpGW1dcNqy3PtMM8gKFvOMxkoclv/QsiOaGCqp1dHYYlMg6gmzMSSyA3MfRp9f6TXuT4kz4StGiZfXycGY4GgrkQkE6AzQ3OQVd40DUZQ9UMejih8oa5nDsVWjOnalJwJ6af5DuVUDBD2jrYO10pIgczUrWzgFQsknhf/QsiOaGCo6IrKOxhabYpBBzmwJvFh/jdrdDlwHjbCSg2Q0jBIlNkCDg1UJ6Frl+gcifl6h7sHNv9bKHij5ccUPnuWbHPT3fH3LF6f2hLQO7+g7jAjtmZApc3p7AP6HAFF0IloguI0tO6KKobLU0dhkU8jUVHgQ4jrXuXnKak4TyyuYjm+BgM0z4ImPJUgv+BSFeMAjolH2YDLQOxQ/ChAlB/MwnIyIsawR0roMhCzWVesyS0X6QbgJOsx9BsLyH1p2RB1DRasv+1tsClC3ggzJiABMI5oBhQ9wHbiDLzpWLKNEBrRER/GifQGVDk4ZIQyE2TnzNUJ09dT0iOLHkAwQJgemJlIcoVXJAME0NWZEJQtEaV2wLQFLxCPGyKSKHLIuGP5Dy46oY6jo3XPR0dhiUyDqSQCnAYRD4j5cHIcDU64DljHHPBH+bhglOBckOoqIcMlifdaoK5fAs/V5ynyNqfia36H4wWUpK6XkoLKIA0M6HOV3hLTuwkDI74izan4sFuuQGS7VTdzyN6DGIYlua2t1NJZRU0pK3ym9zlGCkdU3eb1952LwHV5HbAN0hOUt7OL3R9WCYlNdVskB62NVehsWZPnL2mcpJX9Phy4bdh8Qt9Lf/3P/XobDWrq6prVU9yl+2LLaHLE6tj9r+qU17Q/9diB+l6E7EDsQOxA7EDsQOxC/ont2ID7Q0B2IHYjPDMTHm/xxhvxZCHHsL+I77UD8zJYfWfFrp1G/r3AyGiEGPb3FYsglxaqkpQG9LZecXTsU0zqu5H3kxapos2TOx7UPxNltM0P6ZW/34qIf9DmgFx8Vvq9wMoS50Ty13GQx5JJSMaZWAVm+GZcd/LlkJQOwwyhpm3wPiLiNTGjYKLac8gzaBt5gLYIuIaHVLPELpst6L+KAX9oKIJaxU+oiOs2/wWIokVXWgeh11yYQbgMI056fAcJV7fAbQCyO3NWLZmP3BscXgVg5+43SFidDUqfCZDjl+CZrLAbV5GjiizjlRaA0SmF5EmcTOcUZVgaCZeTIJKmwM06SV8+R8wUuHKh6qA7IWZgXpvbJ64uKwklBpJQTa3gIJ8TYQBtqtZolha9yZy/CUvoGd6UMoKBAbHEyJHUqTIaA0AVpncWgmhxN5BOnvAiUNoaaJwGnYynZl9fnky+RSZIuJcrucPmcuiX11XlWPQj68rw3tWuYg8JJQfQLRNVAOywzpFz+VrOk8FXu7EW2lFtOqMKH60Sboo6dsuRkSOpUmAwSwEOu2x6LQRUI/CISC3gRBVbLk0BJdkQg15yb4zAMGiRElkVERWGCQI5akuNhxLlcB+KB6np4UztzQEAuQMCPEg8m0lFMSsWGPKNUDJPCV7mzFwUIhPfJB8XpWMdOWXAyLGkATAaEtNliMSgQdXwR6SbEIMlAFJ4ESrJrRNQ1IvFiPUnYnMzOUFWNErVEgaCYKXSGORdOYqOkUjtLVtDdmIRwsEDEarGOeXrHRdwDIt7ZixYInZpkuDAQcYuTgdTeFSbDAogFi6EAYeOLEG9DY5AYIDJPIgjxzQCRRYcQDEaByFOTs1NTKYWB4E/ogNBGa0OpvUxNyknBtIiJEu2wzJC8+FaaJYb9cmcvZiCwWAvLANoUNnZKh5OB1HROmQwMxCaLQTU56sgnENSBtgX4fzVPwuNMLvmcdTlYMU0ik4R826HsDl2aqQPn630qpErVAWF9wCAaGlOmQ2KxFk4KIqVE1vBAOywzJE9NlWaJYb/c1YuIr4KWZyZFzbaobw1jPlJS+W6u2yyG+lYO13JzPKzFRKlSRbey/XuN0dyOV22MVS292vtUCDpm2Ry93uod2+5Fv9GKzS67vb3nEUfLi+gzKxYRV9JGiel2S5YRUNaB+JhHHPEhS39y2581fZJtB2IHYgdiB2IHYgdiB2IHYgdiB2IHYgfiv7XpZfFZAt38zwL7mYGI9lmih0M4v5JE29lkDDFUzlZ9TnO+yttyOMpJXfbLUlyUR9gPcJTCrpirNgnk4GM8E2hqnM1/DdZhHwU2JeW9nhJHrL5K22cfxHmqKt3wyAMI5EzBhJ8gb0SI3lQjb1JHBcK8+RVt5AoNWo+KfR37Ijn3CPtBHKWhBwScLjnHDZ6J7S942Fwy/wUI73pAFHEM3gtrQBSZdj4m/o01IFrJDQuEuwMI1wIxNJdpiaViYpzcAcTiSBpEsR/Opz4Q9/NMBgO0b4GIkMS/Cwh3JxDunUB4iVNyZSeGdHOyXAs+oowJl2PDJ8jza1fPnrEcPYX9tRfImBcg7mc/RAf2A7l1TsrHuGgslNN0P88EdirbQzkl+l+jpoDN0StJa7SxYTStZaP4HJVFgbAxVmSyFWZIrX1y4nKcE10ICl7gQhBHylBzLSa54qGdUYAwU5MXv9soQQs8uyxJ2L8AcT/7gb1jDpfFCK0KLguxTcZwP88EdirbQzkl+l+jpvgc26QtSWu0sWFyHBTDRvE5KosCYWOsOFcip7TaJyOX4zJpZXZ7D1cFgqeHzLXgI4UVIUCAmmmWFzIKgXGu8GYj5kgB4n72gwvKfnBcDtI6iW1CANzLM4Gdhe1RjwiNmuKF+9ErSes2kTA0rWGj+ByVJQNhYqxggoxSaq19UuRakgIB1oLM55ZrgcV6Ute6rCCXFgiVWRBJBiO6ICPifvZDyOwHKQedoeo49/NMxM7M9qjXCFkixNpeSbnGCghJa9koSfkjBYjozPnJAmG1T8YOECM0fQoNTBgHmcylQLBqRgQQmc2RU9ipyWc27fvYD8p/YPILse7GRxgSaqcyOoZUA5GDdWi0n0VJucYaiDw1aTqaW/PxEi5HYqw4I//Sap/QGjHi/hAMi8RxQzyW8KvlWpyFazAIywISN8OF3N6iKJH4U9U1mNCIxRpn6XfEO9kPKWtrUBAYzkWg38kzETuV7TE0vyMsED3VEVOjiQ2jaUsPUS/6fPx8zcHVJMZKWayJGVJrn1ANp8ndt7VcA7lRi3pTuBX7pD37GPuh1u2I3TTWpro0ayf27/llHVe+f/wGKttDW49r8Mv4B6tbfNc5a+fnAsI9DsR/Zdsf+u1ArNqzA7EDsQNh7dmB2IHYgbD27EDsQOxAWHt2IP6Xgfg4Ys0eEGcHYvXZ2k/Z1LITYrsXrbsWzs64khpb0WDQ1PT0leu5ssO+qfBxFkmfgxFrAza7L+bG0fYY88KpFz+0fVFsGjqZ9Lu0V44OmrZlJ0TXuM1TUepw+QXcGog6WIfP3zQ1Pf8M8r7mQoPiHSySPgejD4TvfJMWvJN5UR+OZtfaZPLJy/s5pEqwJ/MT5tWoKQYINWxYBQJnLRDeAhH0TGdEvINF0udg3D8iFkA8wLzwq0CwXdmmGghngXArQBRuQo+/4IUTwd4ukUKHI8PyGHBWziUdvpo6Zm/gjx+tBsV7WCR9Doble1wl9ZXrOE2FS1F4Ge9jXuChelEMOYk7DK0rNg3KKJnTXZmhcobuh77AfKErYZAWXyeHCCrr/AUvnAi+whOFYAGroeYx4GwERyHx6hD5L6c+zx4+RMWan783GhTvYZH0ORiF73Ge3rg15Aun2kIoXIrCy3gf8wLXLztJx+xHR1ujtUkpd1QeWyHOU8ixgOEyD0kRmH8LIpCwzl/wRayAUjllNbiFqsbAEUPyVJJcTm1HRCt98B4WSZ+DYfkeb9waASL7mwdneRnvZV7IRRhKrT7piCg2DVeJK3SFZz5A90PURs5XtbIBYoO/kAoQ8VIYFa7lMRBfYgp5QfPSjCAhMnSNWGhQvINF0udgWL7Hm4yfGggaW4WX8V7mRQFCawUQouGRbXKTkg2yFWXVzFY2QGzwF1JWjaCrVNgXiH5SeAwaECaEYO+aJLWOCK9Tk9WgeAeLZIuDAb7HG7emBSJWvIz3Mi8yEKOmAL8m1HQEneBGmZoQQ2aUWvjb5aJhrsrUtM5fiKoawYwIOYroJ0ZVg8+Cm1B+R2jqcyIeBn5HLDQo3sEi6XMwLN8jcWvoU/gcmUtReBnvZV4ACF2s6VsM+jtCbQKLBYyS4UJWeESUqRbrGEX9xN461rdiS8aEX0nZO7u+6W/PxzQo2tT3/bKODxx9xJbbrfvpLX6gwbdMfYwDUqf+k0Dc17pPv+0P/XYgdiB2IHYgdiB2IHYgdiB2IHYgdiB2ID64dY8W8Wu64bFSPx8cP2mN34H4HEDgNVNhH0w4BKfI/GTwqu+WzV622QVCr0XNPrVU3pjfVMzo8D8e5XiEuCwbbI5behrbW8wXYXUkJn4e6zpBl1l/fKVP4Eoq1nCOf4fiRrUlTQtjqrgnAY7t4tYpcdGjhBKIShIwQGwqZnT4Hw9zPOKybJAIbulp1PyN0H1+vCQUJPgqMoFAUwxKFuj2idOXhw0QxYfS9HrYBiJWSgLOmXelo/huxcVeA+G2gNCyhgaIBzget4BY1dNYa+s2ENMYQ29EnHTIdPvEKbtEXXQAwomffdMSOYTJSPgH/ErsFVFMoGxfKo2nrGqPuCnQkAglDspCMaPL/0g6Hd7H8ViyM8457skal0PyCD+FolFwLpeZHRPipPSYHbPXLMDJNXCOIceCEUmJbp+QDYNhcbCFDMQpaMwZfflZXhKOypkRFxP6APwDDOC3AG6Fi/N8SLPgJPPh5ZygkEGdoBoSYIGsKGb0+B/pMY5HXTY823wFrXA5yCHJNgWUhDA4GgsCfmwuLfWZHW/w9o14RR7/cQZze79PqPu9K9Zg7qU08cKzUQAPhMkGU3Ezw1nLTtdBpqYguj5eXNrU1JNMHA7z4WhHhGpIqM+7p5jR5X+UEXEXx6NlZ9CyOFzLiGi5HBojZhClDoqYAvkJ9W2DL3J2hqthmB1v2l3XyPFfSlQJGLbeJ85YwxZGJ77p4So8EIm2oQwYbgtzO8hmmZqizPg6IhxiDbmTVhpiNTWNDRBdxYwO/+NRjseCneG0y/pcjiBxU3KUGBdSCwSXlgpXwzI7UqYTIMZKC8Ran/jci1HWPwEihzoBKMon4RFBRU4Rlmuj4PQGEJibA1gbl/YOoawRowWip5jR4X88yvGwZeN6xSS1xuUImauh4XoYCI2OAiDGAM6JWzI7BIhqaooSpgraHr0+CcIuUWu4y4s6yYhQOkwYUEWPeJryhThqRJWkQNCiNZsCHSRMChO4DLhn9jJLFg2JPB11FTOW/I9HOR627CElcEYubpXLETJXQ6LETF50QM6yXBLDg6O9dJkd+B2hWh9DzsWESZ0oF32CCDPFGrLQqJNc+PzFmcUanBlldMjvN7+Ig7J9t7UlXXCL/7G13eJ4+EXqe2Qcbm/x0XShb92tX9Yx3Kx1Awj3GBA/w5N4jOPx+4G43/7+Vsduie8p4mfT/4pS/3vPmnYgdiB2IHYgdiB2IHYgdiB2IHYgdiB2IP63zfjtttR1bdX8m6zagfg5IIL9jNWp2M0QV8poXOfV2djNu/04MC6+n+Xp6fmaAp4TrzeZn3xWx6w+BodWmOTtOWZnIE42x9ueuMZQ0s4p4lpNzGg5zP94O0pnP70sUz5/p3OH4+GIs8/3AhEqeYNWc7jKdicQYQMI71rNi7iwREMcRPo//0srfngnceZjVYuVb8Ab5dzdqs2AvUl5FwUITjO12ia5LALiCCAIjx8/DkfqboaDjzn5+/VIQDy9PL2Us/r3biCWV2oXCMtheBCIRZldIMgVNc3uyWmEY2YTiI3aZqe+AiHJRGU/tkBAgN7HhciMBeLFHdHdTwLE8aCnWyC+fv/6HWefasOVd2GVJTA8ValCGRH8X1MbvQ6NnGI5DOAnxHiVsydxrmiJdMZyKIi9IZwOOGGY54CSSj7PTsrL7FIhrgX53pC7OHPEgTMBCDkndpMHGrZD0R+OS7VYhgW5N0cZM4ickvhd8IiSizrH4MAEISDmLn15fj0ev766lx8/vn4nIJ5f53/u+fXr/PnP/NeOiOPhn/no05zq6/dnN3//5uDUa5Ul1OmoGhdgRDBPIkrqSp2AyjgbRoUwfubUb+I+H5sS6cwoHAq4S8G00BAB7KBMztWWzEcvpLNxTm/M1VD9DHFvZh96DATEMI18Tu3W+CwgtXj24VFH8lvlzK2AHxSXVXnBntIwCa5S50CpBNI8Bhx16pEu9KOOCPpHR+djhy/01z0fdY04zkccn3XHJ/dlPuDs+/VFWWJ2BmJCCJYR4YX/SGkHp/IGqjBhOQxR0lB3n69agy0REKm0EJgWg9PX77kuFszKxDTO51VVgH3Xp8xHfOMX8Fsg4LpHhAoFgh2dmIQwZeZP9prPHe6TMvoGIVny6ClASKtR6pyCR8RBgZARQVf68wzP83zm+TvD4Z6OetdEk9PzdwbiBRBWQESnyhLRYXHCsdGEzBj0Kp0KEDFzozKHQdJwd2sNY1WijAipZ54AiDEBF7sCQSPCTblzl4t1KkA4nURWgCC7Nc6Lm9aACKDY6Bohd10cy+jaByLKGnEUIMwa8ermyce9MkQNEHm8fHnisfT8IlNTqywRM1XLMiKM+EiW3YlZYcJZDoNSTczUxA7/UmIkrkimXTIXApoXSGdHX8nXABEVCLDzYpnogtw1BTrnM4ze2agvICbohIORzJd+9NXUxOeiiAjl1gsQAXdNLwDicHCLqelw/MInWiBmEJ6/yaSmi3WrLIFlSpUqlBFxnozmBfQ6wKnIi3XmMOiSf0lBF2uo2ZUSef1zyrvAok9aF0h3zgRFa0n9OwLUnABS5VTSYrFWG4hFqLnPuW0q9gUehS7W9HthnrrSIDccWKz5XETJRZ2Dy7oME35HvMzL8vO3p1f9HYHFmhbqp/n4DMlrC8Tzt3kBnxfrr6+U1t2zxeq2bz3d9u9GmzNulLtVww07w7otj5XqV77f0+7tX9Y/vtt9vcktN7t3A1HzEB4BwuaMG+Vu1bC92ZytLe8v9fb2/kccOhLuHBHvM+jPbvtDvx2IHYgdiD/Q+B2IT9L4HYhP0vgdiE/S+B2IT9L4HYhP0vgdiJ/shJ8z5X82Is8OxCfanl7X99rtwE900V14vKVMhWf+xjyGg3jWfw6I47Lup9f72/N0Zzpr6rHZd+qQrr+V74tHeU3mvNvwOQ5NDnF7V8UdFoU/mfzkj3XyRL7mKDzxN/baGiAOnQ7pW7EA4gXnDvYiONzfnqc705XOOlRAHMzH4QYQhctxrE8fl33YBfDQObr1vPbADIWbQMzOrONGaYeN/RtAuPvb83RnuhtAHLtAHJvP+4AgPsFzZhr880r77lXdGpSNziHdP6/Y+87fn/n8s/su37++6oggOJ7IVULOQvnMQLyQY/FZaxAOw5YVzum5Hz+ev8GOJ87xVTgSc67vZKnaebs9T3e3W/voq9SCln9F6180//M32ke/4Cid5Tq+gcvxzyu4G89SX3kETr0z7x0OcOuBafCFXHsz+PCz0kVGHiQ69YWOHLD3fwdiJhz5Inxy/8ecBEqvawRGBJyF7PY4AAjiMbCXls/R6FcOw5YVTlJ/Ofz4Qe5ISkX5KP+BnZFf+CL7+kqf97Xn6e52Oz5LdaEWPno4OHWFUv457Rdq/P+Jbewg1TqO4HLAbm3R4VCcQiiHJ5Qj8wrQZDbjSMcOvIgcnJ75+l0aPnc9MRMoF4AgTsIxDzkdERkIR4wF+kbOQi6D/bTP35WG4jatoFF3ZC4EA8Gp2OX+HdYfxMOFz/va83R3u9FZz7kWPv/9wDwNSqn5n+dp+f+ko5+5jdK3R3A5DuLHfuYWHcxtzNe5d+Ye427hrpErgw06gkX4Wgya0XQFCC6U5zyMiOPBAtGMCHc8FCC0tqN0CDgMm1bMdmAMzVPTC6Wcr82XLxiDnIIukgLEPe15urvdGBEAiqljcubIVrnXL3nMHnO/MHcDKd3zC7gc8/cvPLJfAYTTe7y5FJojMlIYiP+8ikEHDK9iEM1xBogvRzM1zee+lIG8nJpAGwEQL8xPBI/hcFAOw5YVynrgEcEp/+H5l/If8lRigLijPU93t5suE9R11KnJYe94eGFb2MIvZN//5aOU+wV1OExV8xj4pvU9ia1UtpmasGiBacAD7/V4fAb/QBatAyaY14PsvRyoUCzWX1+JU0uLld7HCx/amaX221f+pkDMw/oVrAflMGxZIYv1Nx4RfLtAfBWq84ltbIG4pz1Pd7f7GW0nhsYBi+uB9yjlC9vyhMV67oG5X16PzOig3C9SB7gcB76xk/JfDg43Os6V2wN7e/gdd1T5/tIV1sHWj7BjVcajv6yPKz98jsdlbp2nt+25pz2PtPvetnfPH5bfnm7nxSlmnj1Q4fFmZ2+dW3IY1qygEfEIEFvteSTdzwBRWvfBXI07rsP9WdPn2HYgdiD2bQdiB2LfdiB2IPZtB2IHwu1AfBgsn6Uj/yeJPzsQ77LleaEQ8dh2bMqil/tqnQrSEYZ68NDJP+CoedGqjT/ip433sAJeRPQbJSPySYisZxzX7HjvJtbGciR2vg3ZXLIFPeJqv/fTgldRPxp9WjAvDg0QT1VZ9LqrutgZFLz7GbS7gulDbkgR/dcUTa9LxPf+u218zrv6fF0yxNTpFWZ6gXdpR3MdROf6wsf9NGJtWgLRKpvoJ78UDdWQR4C4tX9symIgXpDuqQAR7wOi1wn0WqlfHxEdkFogPF+FkZU3bgLh7gDC7MvRNNwJhC9AZLWI77Mf6qhAPAvHgV4//YcdJnz02+xhJYUJ4VIsztM3V5X1QnSBolMhqhzSXVD0UHUL0snwfJReCKbBSnoXwZVXdylFkFgNQz5+ldduSXHDS8wHDP9uyRz5xCfWqo/WDoluwjloj/U/piHHcCGLbqUJbAcFfNB4KRpvBhFbyCYSpRigOsK20Lf5HNx6wtPIQBxByWCP1+wWPIpD5oip6Xj8YlyK5vzh+ML8ilLWC9EFik4Fv/o++UljGKl+wSg6HPJS+qhXzBjwbrUz0VIAhM+aCW8SnmkM9GK+nZq6JXPkE4pcQO9gWzskugnnIDv5BfcYS2yJO9KQtfwyfNJ4KWMVsYVsSgEv9+OCpEgcpBqSneHcjQUI9/z92cElT67cr99rIMBWaM/POdhDa8riEVF0KqRLZY1ATBMVVUCYD5+1PbSL+MX3q6p26IjwuOZZAIJHzzVKdxsgeiUnuVPJ2gVqB2uCcBqJO8GTKB0LZnndThMkiM7gEC8lVjFmAMRbQI3ZFu6RDAQRSywQxDc4OqHQHNWDBSCeX4T/05yfc/CIKGVhjSg6FTUQ0fWAgPEigpIlGlS1Q9cIj1gwE48IlyUb0hYQUSK6qB24e1M7gshNqfIOOjnirExNt9IACJfiBfFSYh1jJgPB50YNmQYghAlRrmLhFnyRqenAHc2kF7onYuaFK0Ss6jyXQPy4Cohj0anQDstTglG3yN1lpiYNhwOlEG2mF10NOzVxDJTRAuG7JXsOuCEqH9HaEbKGSGC9EOlkmWLykruZJgNh4qWUiC2QlIE6CKmOwBa5hJ6FCcEkKWZbCLfgG1gaT8xaeJajX1+feHEnPgKYCPX5I3EBTVn4HWF1KrDYITILFD1U3SLwolmEuGTGpfMJSiEBmhkUByYVGSuVzSJtDOras5aeeiUHju4ly3+0dkh0E86BGJJQ+YDeiAKxnUYtLPFSINeCiC24gSB1EE4VYIuqfiy2vjsc3et0Kd/ItU4leO8vWtzu/XtdP2LPtTeJ7RbvsEPjwvQju6ylsVbERbqFdGW4z5bOdp92xMcD8dHbPXZE/rsd2WUrTVz5XrYcivH3N3p/1vQHbdmB2IH4843fgfgkjd+B+CSN34H4JI3fgfgkjd+B+CSN34H4JI3//LZ8TPW/uxFa33+I1rMDsdgsj+E+PoPhVdiYExV/Yqukwl0QT10pb/FUZnP/qgyIqg2k6B2zcRtl5aPyjDvbfO2lO1dAsHP06hHIOqvKsvw7KS7niNdwopJb1adzmv9P/17PV9rH02D/L6X9l9Jb93mJvo5P34UtVB7/7BSvXDJbJRXuQljwNKJrAm64ukvtvjrea04IO+KTc8unr7G+fspRISNYbkXH7mSBiOreCi6UdKpVHq30PSLVO4SD5z1zlp1KSLEFxPoV3QeibUy/JMtd8MtuqcbUXUDEXweE2ZJvgYgs9B5LOnUzxaKr76JxYQksLRDsI3SWx+CdxkoRXoKD/Pk1sxgsrwJxSs7CVaj5E5slZe6CAjFIdBXya6EOinmP/VNmSLT7TkqpOSHwRHOJSWyeTsK80Igx58keFVbI5IUrUmLCmLgpTj17AsQo9bIqPTl4riiJvHM/A4QEsmBPLoK8SIwEDo7xFoo7v/AqRokJMTJXoXbbb5aUuQsn8aVll2kcg0YSign7xd/b7g9SigKROSGJvo9BaV4S3UX4FFH8nuUogMAEocFFFnFTHJHRzBpxQb1eLiXv3rikGeLZ/3ZOBHbUuAKi0x+Fg3JO5wn/mHiQIqK2WB6DZ7YEfRuYl0DdR9cUIpY4V/MqbJSUuABio6SkLvMx6KzKKQUsL92MfbAhhny+7HPkBmFuGE5IOBu+Bi+zV4QpAZgUMSZURwEELb0SQyV14qa4TDpwaj3VG4R24PkSw4g46TV/RUwvvt65PmJ70N6Jp8STKyPC6RoRZY0wsVL4XKDoKg4RS1peRQGCK24W6/WSCnchVkBQBJYCRLxgH/mFsVHte1cDEXWNmKeL6AAyB9JBZCG12gEIczSB8UG8EL1ZWMRNaRZrrRcRZMqIYDvm2k8azicDoVFrNFZM5DG/BIInB7AlgnAiiCgVUjs1WV4FT01hSWTxmyVZ7oIFokxNGrqJ9pUh4V29L4t10HsvwwmJNE/LjM3lnqZy/8JTU7BHBYg8NZV4KiZuihOGoNxqEHOD6kXgEgCBGgMiRl2EVyKrgpNyBAi+w0YLq7sm5TGcOa4KMyv48yzxC8GTcK7mVTBrQqKd4B6i8Ce2SrLcBV2seWqa85wmjZtC+Wg/R21J9T5+RwxKwjScELKFfk0E88tC4qsk2Crp5Ch+R0ggNy53GTeFfkew1WlgQBBnxecIMhQlkn5BYCzJ74iL/o4AEOcEICT8FVaQxL+n1uJb1JyILYbEv90fP/5GSe/hLvQ4GVulxM732q74oAVkdR4RN2p0744L85u3X/+II658v3X0nvruAOJv2fZnTTsQOxA7EDsQOxA7EDsQOxA7EDsQOxA7EH9hc/4e6z5RKJodiN+2UTzmEPVZaKt80d9axYn8JX87T/XxmtWhZ0POk+TF/UWM36t9TvuRqhmonBU6uu0A14RrTnfVHUpbe2nlnVJ9zrpsqeP38PXJ+UL5okndV5yIOXU01fZED+qzhWIgQMTssnVKZ7CeC0s1CG75RDa0Nq/UX5J5eWt72Q7hmoSiT7BFqwjmoM/2+w4QaPuypQyEuA0JCLcKxLKpqw0YVoGozxb2hLwQmKKp0d8Ewm0C4bt0IH83EPfVnbsy+Nwe36TSl5Fd9ugtW6ojYlQglOtwj+JET2+C3yVmB0xPfaI5mxRQeUWW6Vkn5k6Qagasgy+wVu8QhQ3hXShXA+fOYhU7caQlgyvHpHUXMDfoX1c3gx1Ac92jAoG6r/x6rtLH0F6u86L1+cxhsbWCSHBid9S511KHNeKifIMx3K840dOb4Ot79tD11Seas4nXiyiO0QBfnZTMF88gjAl6OdwyNaCwoc5Nl4+pLINR38hO0lEd/uxL5pfqhfLQ1c1grslc98W8nu/Y2RtVQUTpD1znqPXpJzzeWut8sXD6YYIWQttScCGcy1MTpo37FCfW9CYGWpT66hP12TwiQgLDwbGRXjzPLjM1avUOWBZ4v9BFlQsC65iPwbyMgflW1L5Bpoz52BVMFNUw6LQjgSTg8tSEuhUIKllVQwYXzBogqh/aDqmVyuVJOYieSNvSPhD3KU6s6k1couurT9RnDVEx8WWRinlD0jWir94h6bJKhptG4YLAOpnvJ04xydiZdAXASBIGSLcdyjUpQKBuBYJKjkqbnVog0Fe2VnzjschrRNtSBSI2QNylONHTm8DSOxuyoj5hz5ZFLSThvbFyhhcSjsuMiVo1QxU26qlptpPPhdyV9dQUMxeJ1hy6KDCdrLWDmX2Mma2bgaiYe1LncmqqauU6S68uWsq/I+jteawRCsR9ihNdvYnEuhgr6hP12fI7QuiOzNAIvAYxqxu/I8i21DI1kK6oWFB6nPMTrLKL9RksDj7G5y68WF+Yqd1tR8isDV/VnQKdd7mHsFh7s1iL6gdzV0qtYIMI96/X0lu/H7cUJ+Ii1eIXQ/P7wbt7N73S7/91G12r17F5+3qjHfdyTfxmfbfO2JberA6m9RQn4mqX97cV9s5m2seAeN+21o7f84gj98r+rOmT1L0DsQOxA/FZmnp724H4JNsOxA7EDsQOxA7EDsQOxKc2uUdg+TtZRb/J6h2Ij+uhx1gIzQnhO7htvsMqV6OcW5SrzYADkl7CJY8i9vBwvNbDQJnv08M4p8qkzS3zXRbO8272YFugNvdReIyFYHq38B0Gt+ZmD7azOwyGDhCpfrN5AOkgeI6HIntTaZTKQojc+vv0MBKlcdPKFdpjsmQSQkldA+EzELA5ugUQsQHiERaCebCbCt/htAHEFlfD5XPLchWIk7wgjngo2ENElFoPQ98Xf5cMAwMhpfaAMPth5XRYHRGwWYCIi2RgQDzKQlA2ROL39pXv4F2f78COobTO1eDX0kFyW5RrpyYNw+ET9uA7Uz0MUuoYQF5L7wdi9ihHsvU+Jgte4j2J1ggzSpAyv9w7oKSLtkAVO1yqS5Vp51EWgnIf0GHKd/Buhe8QdUT0uRoun1uWW60RFz+ZNeKigTj0RfORnb0/oYeRMH1BvOgeJkt5oR/2qzaJticK1yWO2gLVJ/BNqbI8P8pCwJHz9U2ULOBmr1UxaiB4fK5xNfK5TrkGCCdrhDREIqKoHkaMmSL3Xj0MHhFRVoJ7mCxOGCDQGtHjGOHUc4NwRGKwLVCbbanCgHiYhYAjpK2RCt+hVsXoAdHnanCskqSDoyl3Awjcgei6VYB4tx4GjwgQce5kstRaI5PeKJBHk3tu4hHhWiBgsy1Vp6YHWQia5nKhDlO+g3crfIcYgpBmulwNl88ty9V3/bls7uoMRMTtq+phCBDhJ/QwcNcUsxLZbSYLpiYAkQNS5dWJa2bNj9G2QG22pWJqepiFoMs3tyHzHc7TCt/h4nmxXuVqOD3XL5cAOeMWQVSTsGeBoFp4/p/er4ehvyOGdDeThWsI7pxlt6BNYn/BsObHxbZAbbalVne897MQfKO8d/t3Y7/sGG6Vu1S/uPs36rv1MFpbt2OnuBsti6tWt6V+wPbexw63eB2f5RFHhLXpPS27BcQjpf4yIO4td3/otwOxA7EDsQOxA7EDsQOxA7EDsQOxA7EDsZu9W7wDcXM7y3PHrdgm2NhJtPIwLeJ8uJVnjeWRj4fC2vCGHlCbFDesvGcL5SNsNfrel83uZGm4wTXdEQwnwcsTwGA84rFrjl8BIuSScHYhkhB6TavDePgKiEHenDbNSmtAhDVLXcdcabXvAZFW062VZoAoPJMCRLEmVG32q0A03bfCRdgEwj8MhNsAosN5uAuIvm3LYzeBcI8CUXgmrsPSuAkEIqnAmRGYcXCdDBeh0rIQ980FzAUwHVLQ2CmOnR5wxUAICI4kGm84WutyIHYKlDNOKgRE5c1plfMgQLAfBVLmJ3FWwb7TZCO3WEuHnBpnWyYGOh3yEsz/mEoNVbpcTmmpuIwkvgtssDwTtXjO4aQfnUaFEY4LapeoNJwm84CYmUCOvjfLRai0LJy6TCMciOBbgNnA7ytrOAN9gzoInSviaK3LcWZ/LpQzRvXlUnmjenhJHb9wHjDaxsyuoBIkjIHrW6o6Ak5yWiYGugKCKwiHUGqo0uVyUlsXe3w1MotarPFd2A8nHA7n9A122Ke1a1SaEZ51GREysSkQ4CLUWhZOnIzEWFAGwxs5JYU7gWryPkUpYaIKAQeOQ63L4UU1IzBHBE71N+aNqKt9NJwHitLCbBKhjzFXglOrNkZtqYaoQVyXlokhQAS0B+33vXRSjm0puFKRe4/zz3/VYiX3gD6hPeudRoWxQGhUmmiBAAPBAsEzV61lAbc7xWHIBr1RuklLASEA+xylJAPB5TS6HBIWRBz1BQg3abOi4Ty4hGtztmmMYh+4JaFrKeqzV7VlYngZs1EDiEylhoqxoeWYlloglMJWAwGLAQSiv2hUGF9uQXJUGgCB7o1gJmQgTJKiZZGnpkIlCZeLMh1MpJV5Hyocy6mp6HIo30N0MEZMTXN5eWqqOQ9zN42slRGGS6zsCyuWqmqHc8hpmRieXZQ6NWHN0hpsOpfLKS3NU5PheqjF6GRYjLbK1BTM1FTVLlMTIqmc0yAjghalHhcBShXM77ggjglPE5nZAKb4Wc76aciL9VmWdw1hprocYMtBOYM6V+mZWKyXnAcXCTzmo4dB7MvaFl1LcR5xXVomhkwVF9x8CMs9LtNhsa5bKnVd0F+wQS22QFBbYedZuB+wr9SOqDSn6RFNBnvreAc/Iv5UGeu/U+Od9a9ZVDgTccXaNt1926O/rB8svr+9E78HytgG4n31o+l9zkS8M93HAfGXbPtDv71Z/zMW70Dszdot3oHYgdgt3oHYgdgt3oH4L5j7mZryK235FO3cgdguW2WdO6fg9LT78qaZ6/AxbupSKNdhkLDf5akRIrvYsw9Fd2m9z/00rrK8xyzB80R283AslZvRVPhpbL8fls8mRV9Eyu4ol4g3Ma6XFvWIN88lF1ST0BIDYpMyK1LA8xZDEVRIRWNDzj4S3WUVCD4clqIWrk9oyNLwzCGJdTSV0LEmhPLeX6j7IS36R15ZRtlL5ZJ7gHAGiLAOhFsBoowIYWd0gVCNDTm7XXhPE2OD6PMoECe3jKbSBcIpf8W3+hxdIErZjXIJMxgulYqEMBQkJFOoOQ3K+EBMFQUl60/oN2ZSaImFzZDZGQEvuqvQOvEaisYGvHWPRHdp+Rg16yK4wfA5tpglEuiG3+92BgjkPU9XtOsKxxPtBfZD48VkPYZ+8BIr5jSXD7aH6ouoE9iWzQoW1DENcyNKNAZhdhROg8+xF0YR36FiJOdYXIKjKTEFPa5cB6wCITsbg0R2kbMXvK99f3SXlo9Rsy6ILxKy93qLWYLOA3lBQzkUdZEwe6HHTBEkp/LIXBTvSkCEN2ZmeEyHCf2byEIQISDqIk5gW7aId1QqEvKGvi4ONadBeQlFBcnJHjyyIbMnSolvECu5FimHMiI4volMTSrtoHoV90d3afkYNesiCIsC0Vi2mCV2RPgUm2gqAdQGAYJqUIEYlY3AMfSDAkHlB2ZsqL4Iyq6VS1RVZSrMjT4QymlQXoIAMS6B0LOlRAARXQuEjAhwI1aBuF8To/AxatZFEBYFCLSbzJK8RnjDLVF1ER0RrB3CjJNRgIh5TXwTPZ8ga4QCwXOELNbeaaCRUjYMGmPL3IjgGhgghMGgjA8YSa5vA8RYiFS2RGIzoOqanQEWiZScWo2Nh6K7NHyMll+C+iXiyhazxAARXWiiqYS5SxFJDG2jPQEih5GiY+gHLM3UW5dLYKWmoi9CZdfKJcIkWKhIXJhfkZacBmV80KJ3nvIvEOS8nDkyiZPoJFoisRkQ46RmZ2j8E9b9SEVjA5o1D0V3afgYNeuCbgmCK9FYNpgl+XcEqQL6JpqKn5fdmH8/DLwXRBmQrZZj6AdWE0lM/aFvs2WqL4Kya+WSza3cfq1xGh7jU/if/GW9rolRR0eplTLs3lJDwx4prdkmL/T2yq+J2O3BQpv+qV/ta5yGR/kUP/uII25as+yoB1s5vR+I2xbEB9r5y7f9WdMOxA7EDsQOxA7EDsQOxA7EDsSfL3sH4pOUvQPxe8r+aLP+vNTJLlGyA/GeLTa8A3kp3aQYbhaBx5WaLizipODZqmrgD3jmeU/JnU2eYsaqBQtbS4tIN2NNOWOF+dHuG1f2UOrrO8pXtqrcXi522VS8g9qV7lxfMkTU3kUzAEBknkNs46Soix4cDjgo1sKBLO11PUZH6gNhVTpQs5MYMC0QG8yPtjzT5X4VCBvtZdmKiiixBcQap2ETCN06QNRxUgoQxOGA0+chIMy+HE1DA8TQAKEtcvHUjW+ywfz4CSDcNhBFzQLchGtW2TgveAeu4jTUuhqUu5TlJJaI6muUdG2cFLoayaMFDgeFDqiZE+S+UevuY3RQ0ALVyIA/LabKhtwiJyQvjW+yxvxYaIjUTJALUni1qGKU0NlzpcfR6npIS0Mo2hnFKzvym/At78BFyzuw7AfJXcqKiCXil+maOCl0NRJrA2vEXMNUMyeK9/xeRgcBMYorFZwLihJhbMgt8pN3Nr6JVRaxzI+2DY27FX57bu/Ik5xllNBZFbwIXV0PaWmms2QgUNVgWA2Zd5As76DW1ZDJrAJCBBzqdKkJzzG7I014juQa5kQFxF2MDs9sQa5PLBtqG3KLauWMdeZH24aaCSJ1XCX+zNUySnC2ALFkmGR1jtJ54CboiJBmVryDUPEOal0NYTY0QDChpNHfqIEIEvELQATnGuYExZMo1t3F6EjxMrI3WYGIF2tDaVGtnLHO/GjbUDNBpA6NJhQsoyS6Goglw0TVObTz8uRCLASOAjLqMC68g1jxDmpdDTMigm+AqPU36jgp3AlRgeBOrpgT0Rnr7mN0JHA5kBrRvqwNpUVKaRHBhhXmx7BoQzs1QVdDY6fUjBKemho9jlrXQ1oKloTeNYOnQOozFAUlhoZ3cLW8g1pXAx2l8VaIQYGIVm26RZyU6zxIU46TcgVP2tZSrLuT0RHB5RCdDIfFs9hQWjRMZxvfZIX5Iaoipg0NE+SCOiTG16VmlPDFN1k9jlbXY5XHETNhSvdv/Q5dxkXpsz40oNQjcVLWeCLbUU5i51sp7zEmRbxpT1yry/3UFhdF3DJ7yeXo8yw03SOPONZ5InGjpnjD1vc/4tjirXwwEMttf9b0SbYdiB2IHYgdiB2IHYgdiB2IHYgdiB2IHYjPa1RrS73/K8k4n6AXdiA+DRBgNOh7be3mOw9NKEcwR/Gd/iqXQY/EnAIaHiZXfkg31575HbBFnvNS9xzmf7wdpbN+fKe/z5L3mb89f0fKr6988PATQBzmiqS+eedYJTp0vpXvi1qbzHn3uTn+/Pr06gqjIYZ+iA1597gJzhFcHwjfASJg3wChwglOXExEMrDsClWzmLvniAYSHj9+UGOeON+T1PzE374eAcQRnXF4qlrytOylY9tzBoiXgod23sF8HG4AUWo71qeP1h57/Hg4wATLnvj9QPgMRGFXSFwSAuJFO+3pFhBHd1Qglld8b5A8DMSxC8RxOQAeBeKoUxMxGnAVDhVTghwbKtog2hxwaTh9pfY6/yuPhi2XAdspcyyUb5TLSvg2JL3+C7uivO88G/3y/Ho8zpPOy48fX79TM55f58FMQ5w/MxAv7uV4oGPP357dP/NfR3957/n16+s/rwTTP690zNHxV5rIOP187McPTjunfuJclJ5qe37FHp0jS/5Brm+0/51z4iidbWv7J9fC5zEtsc3PUibqOH4pQMTZR4SrMDsj5X3+UV/bFu9tVIkDdsrMrtU3S88yXAZsEtPEBGvSsgb5xmsQA2PYFVivpnkMzB19PPClftQRMe/z5DMfPACI5yNB9uS+Umcfjl+e3Jc5z3y1HSgv5Tjwdzcf50+6CnlCoE93+HKYyz6UvHNi+svnOavUeZxTHqiWLzQN/t+B9rl0PtvW9uWgtRx00szlHLlMzEnP3/55dYbRAKojxyWBSoZjxkQLBLEmFIjhSkAMZdk1XAbpduZT8H4DBPmW9Zuwi7ItyqCi7j0oEHlEZCDmRRpAPBFIc8p/3Nfvz9+lqQTEvE9d88xrDKPJHeCO83GeHJ65lCMBYfI+f0dqx0sU7c3n6JtT+J6/f/3+f9LRzzyRHRa10b9nruVgbi6+zjajdlkbHF0IrjAawNFgpY0p5tBvzHpIyqWYk6XoFAg6SkAU96HlMuiR6AqRxrnCy/D5mwZzKraYxfrlKECUNaIAcTwUII60j9TozBfM9M8vc4pX7povPCIYiKPeBbwiBwGBb+7li1yvPG1Ihx05pXv9ksfR0QGII5eO8urauLRXAOFkaqJSnjQ1ja7vvEwcCpdCQo1BoYI6CBwDZmikmPkMIangCWBiIEZ1WVouA44I1WvEGuBc4WUIZyPoaLDsimjuml4AxOGwBIInEgXihdZ1mnK+0FEsgHxdOkwe81XJq4YAccDEwF35RYDgvDTXH7/oZMIg8N7xQJbM+Q88q3/B1ISjlPdlURvGxOHwJKORLg0zNR3yiKDrTLkUGlMQChXEV5BoIkyOKVFSVHNPVDsuKSQwF2QhNlyGvFh7EA+Fk5p5GVflfLh0dsrvgC34TYPfES+Ol9BX/R2hSx0vfN++8rcMxIGXy2+0VtDyeMjL4hNdmQeZaubFnxdNXay/AQjkpdHC9WH+fj3wHqUjS+aOxmI9L9cvcx1Hto/yvixqw63DnPeFzuD3w3Ne+qlMAPE8L/eb+hjMixD6lHN9RkT+vvgWF+XFJlesohf22BU/88u6LI/2yFEuwa38x/VqNs8ta7O3qzfz3vhxD0Lh1DvVPxpvmGpvdm/Z8jNAlBtGe+Qo1+CvAqKu7aFtf9b0SXphB2IHYgfik5mwA/FJTNiB+CQm7EB8EhN2ID6JCTsQn8SEHYhtg/4G9s/fwlB62M5fB4S/89jHNdA/cPTXWXhnXz69sN/3ZXZXvNCTX3bC88ZPOwMcE7Ozht9woxe1/72eGxnbIetJxK2qUv3qfcSxZdMTolbT23RteYOJfeJEbVxt7Na4zMsvWOJJcseaVQt74VH0Rf8stI6tSqlvxxU7/72ShnR+zqap6bH9Mzmw6antkZwv6iI/mMzk8iePRYI0e1PnmgrwwvZQP2u1aa1MhAjFhxDXa5pN2QAidPa8Cd8RKqKELyFHVi3sAMEa6fxyo4u2BVUZ+kasuaidjTOQTWWHOjs0ZjcFgHgBEPw9yvu38vbwNN4PhOsC4brNdE2To76rfA8QsdXSuAMItxKEZ9XCcQlEivCOURQYW17oWVLsFCBcB4gn9jzx8/MX8hIX1gQ7MVMBgt4P9hLcG0wPdvw4L3FNwPE4VdoTA0cU4cnhMp/hNND7kHf2Kb1EY+kB0a/JS7yWYuOQ9Tcyb6STF++EB/Od4r2cpy0LWQckaLtU4+OUHcDklUQAEChx2DICp78aOwsQ0OqQSWr2zL6CnaBAHAxrwst1BKWLc3rjqemcMEOOAWEHfHk9PeG41Z4g5QnRxBgDXhPP6gboeBz1ctW1QPRr8hKvxdrI5QZ4ebXsNi+UM/j9apn5ON6L27KQz1y0XaO8qj4ifAd37Ri0i9syEJHmzdhJKwo8nNDqkDp0RLhDGRGFNaHTL18THKZC0ZRZPIekwHJ1dkSXxGvmRXvirXQ5M0KgUBGbozpv5qgurLyxVpOXeC3FxoE5JwNzRoLEOFnmjXlqGq4AQsKMbFgIiGjvfFVeio4IWRsEiGFRRpCAN8VO0SjRSB1Bbn1qILBGFNZEzDoVfLWbxbptouhzMMcDUU2K9kQNBPNAYMZYjpL6QOyPiG5NvEaEaGwk7olqiIQcJKDNW4CAPEQPiNZCdD//49Uit9UAIZ9TW0YBQu1sgYjlrukJ/MujAHEsrImU5RH4LsECkWloecJwSj/D3Fq0J2hlkYEPE2WIY46WK8gVNRvtwDI1LWuaTeHj1kaueQxOdES6edG1AdG9mGnC8V7CloWlpBiwcoR811QiqpipyZRRgFA7y11TlKmJLwj6HTGvEi/Pr/QNvyMKa6ICIuB3BEIbqSZGYDUJ0algnYn5uLPaE6Q8IcvyJfDsjHgrp0n94QiCRtodg9wYgMmBYduvCcpOtFirjVLzhYVPzGJd59XFmpU0+NcEqWz4actCJy2T+DBO2yoRX5LaJDcnVRlQO0kNEOesyqFWLLaP+GUd70jz77VhgTSMjnu32sb4UF57e3zbwrU6/DvsvKO/fhcQuF77338XELfr7KV4rI539+X+0O+T2LkDsQOxA7EDsQOxA7EDsQOxA7EDsQOxA/G3yLB8BkM/zoYPbs2vYDX4lZJ2ILa2RH+GEl0kvxvqU05zO7hDU2Z+kMZlnKds+jobo7vF1TPDe+KxhGxDfsIEXRG81VekAM4qBTA/Xf33euZnvuTEIr+lZ11+is19K0b10I+k4huBh/oaDotIFLVX33eA8M6tlFk/0YxhHQhvQl20CIcuEAuKQVO7b8o2AUAMEEot0PDmsXgPQuVLCHirXKTjI3tfZyDobdgQ3EqPdm0MnW9u0YhF4BXbmRsjol/muAbEnWyM9wCxMgSWQLAFNl6ML0Dgm7p/HPmkKyAYnpE84QTEZr0dIIbMuCiv9iKWCA+grLtRMQ5cDOBszEcrzgIzHS4nKaNfZuFDoCREHrFsjFxajkVC+h6QSXdi8Vm5IjnKSY/rceWjJ9R+UZ4F18gtPud4LHRWbGBf+xXxZHgqXQPi1AHiFEICEKem9Ws2StyVmBkX6uhU9QDpJmJtTA3jwIGhwBESKs4CXxHjKGWslJn5EFgjSAeiYWPEwtSAdSNfacEVl37Q8rgs8u71uB6kEzLylctXqnZiHNlPfZ404gVcqLABU9Mb55pbHom9wjWI/9FzvBWG5eI5iguvEUmsuHh+Uf88oYdK69f4KBJ3ZXA1EIPE+JCX05n6oY7BzDgQNkSUsDKFs8CRRPLs2S+z8CGw5FIHWzYGAVGYGoNODwwEBwjIwTHYkXqV4BldrgfphOS5PGaeRVRZF6p5QKQWnppCjqbyltUPTnq1X1VJKjqpj3QWnB0RczkjgAjq58+tX7NRfeFTAYK0MUiJwwsPwzEzwgIR88xeA5F5D055TQrEssymJAQvqhgjVJoCAT5IlBHBJUwKRNTSxjWuxxtbg7mc/OHCszBARI5sAuthgx0RXPdszUlHYg0ExzOqpyaEA1IgqtavMV8ARJ6aDHfCZ46bkQTKU5Ovgag4C0h1mnKckJUytdYMRMXGCFk2RWORMD8jlogkGvgJ4wtRTnpcjze2hiNxMWw+X6dosYSnClEif8ECAIE1IjB7JV6KSollseTwNnLX1AJhW7/KfJGpKUf7sHfK0ZXF+lz4GbxYg2nBeF+oEyxngZkOHEnkLHFPlmUWPgSXBN5FxcbwTlkRGouEGqvcDFjstYxLlHv/HtcjsTWRSximwrOg+dxPiHWCeCxz25ICQSVQZBlaGyNPgYNZeKkluT5uDZHq8DtC1tQyIqZOnh7z5eJ6t5LLH0s2WsntW8N4V5l1STejtmydC9s54x2p3EKVJK7fR9/ctCTb+n+vvZTdo4WzEN3PbPEdZf4MENtsDAXiNmfjZxgh/ZI+qkd/47Y/a9qB2IHYgdiB2IHYgdiB2IHYgdiB2IHYgfgt2e7JcTvNI/V+TI1/Epw7atmB+L1lrtUS2Wlutiif1dOZ6uFdbV5Wuch5h5ym4YA01YdcYl2X3eMSr6XGuChL7J3T5HzRLUyvaok3+wYPdclHYepquRlty+vyt9re1kI7CUAsNSiiYTSU9gcDxFJcIcoRTdPjgOhXDlLgclQVU5f6I/SsPhkNxpDWXm87Ldma6lqW54tpJTUp+PsGCNOWrqxEW37b9q1aDBD1FeZz52jRgymiD4TvA2FsZ/XxBRDLuqIxyK8A4XpAuHUgvLnEtoBwTReNXeGZJRDL8lv+y1Yt7IaZh/RCgwLuH+IcDMw2IKfgwAwExHnoqVxQntOkEutIU3NAuFQtB6wJMbupCywNcC8SLpar8C3AjuhoZiQCYuAIL14UMESVI/FL6wmv5nbOZ9WQUquXYAo/fhTWyQCHclffoy2/x3/ZqoWddnMDFhoUuEpHUAP4MyYJZhAxYJcqF5RnDBp0AGlqDgiXquUIEMSUaOsi31VQ7kV0rKP/JhobY+hrZgwMPXQO4GR9E4aGwB3hQeycz6ohpdbSRYV1gras6XvU5ff4L1u1MEuDuqyvkiHHudCBr4ggkU/WVC6iAaLPAcnlNCPC1uW4ZOFeyIh4Y52NmBuzsJenWOoI1Hq+oqNxrcp00T8vXQS7UKsBIrNOvEbN6La8Lr/X9q1aCMakQCxVMsbcOfO8fSG+Q9AlbEXlwgLR54BoOe0aYesqQAw57JNcvwaI2l5eR3Cdi5qT5uBYFFeNoLQ8r12k7eOJ2SzWansfCCXS1OX32r5VCw9cnpoaDQp0zmkKMsxoHgADIXDwj57KhZ2aNE3NAeFSpRyJsZXvN6q6OIWXwDgZiLFwN5aaGV46jSVYUhAxlpDj66kdvfPKDym1ootKSw37a1Xfw5bfa/tWLXTnG2mxbjUoaFklnrPn5Yxud2nB8cwBGmQhblUuymJNyy7S1BwQLlXKGZrfEVVdnALcC/0dQYwMPwlbpKeZcUWNpBdC1xe+edXuyHJfy/PzqJNltNSKO/yBwR0yB0QX656+R11+r+1btchtpL0ZhAaFNzeGi18hK783/UqawlTwG6XEtV88HRuX9m6n2d58Y2WpNf70L+u27Zu1LCvLFOGV4n/FI45+XWrJdmlI9XGPI8ov+1/5iGNRy/6s6feWuVrLDsTvLXMHYgdiB2IHYgdiB2IHYgdiB2IHwv0HgFg/qf//ju3vYhPdbe0OxG+1tg2FXPZ//DjLfxVnoLfEeOuGT17f6E3l9tg71DJk66tcRNeTkYiLNCX/tuXxrlgXdYJh2bqOm9oAYa2NjWvcAsE+r1Qy5AAnxifemtj2gujDm2R+8bfHNem/qccskrDMFe4AQm0NwZ7r2cs7cZmzbxWUyuuz3kRXKZ+1PkljreUo+GrfAGHiqjwAhDNAhK2Ovv9NwbByka1FV+kC4VaAqM+mHhDubiDWRkQFhLW2cBTg2y375D/D/xxXJZJOhqhaMH/ibKKMKLvBsXLGfFRcRAACLhF2nQh/QVU2lJshqiAL7Q6UnoKWFnIungSMMkcbXaWO8KK2BrH2lO2r7RXFELfMSbFXTvkV46spAa3xokUChQOu+9LVJ+GSa2trZYxolTLI54z/qpJBehPQ31A1DlXECOJOJL8zqVAEcXgqUUzc+wEuJ/AXVGWD04QxWDWDot2hPIgEByXrYMDpKCYbZY4qAgzYHibCS8glhqBHUUptL/pidMucybg7ySVK8VsyFS4UhYQz02wgB9DVJ2HrirWOa7fKGMkqZZQRkVUyIgRLrDSJ8hMo+gnxGVARN4c4FnlqYhWNqxNdCgICvAg6E6CogYAZC+0OBEwgbsSQlTKCcIxqZQ5jKZdYR3gptkKBI+YSa3tR66mTEyE/NOIL+aaH3MLhWjRDsEbEdX0Sts7EgrlGyzEAD6HslzWiqGT0gIgyi0KPQq4wblh0BQjEGpl3JuVmxHwmZLGdrh4I18HciKkA4cQTbZU5jKXKfzIRXoqtUOCIucTG3glrxDKnxF5xCgSPKVkjVKpCNT+29ElwpOpXq4zhLPkjDKkAkVUydESMrSJGyPkCO/OlYUHlfhDKA/nAX9CpSbQwRrViqd2BuigqC0oLIh8UQhGj6ERXGbFGlAgvxdZibc/ewjVpc3LsFVemJorfghJmIMY8IlwGIvdUo0/C7TXWjixHohwF/R2B/cH8jtAM50TLD0RIwJ9QRYwgqhPQ3+ABPmGh9BN+R2AhdqLSUaiOEUyKC7SQetodYlMuDTpLnMvVyhxVdJWLtkYjvBRbgzAxtMTaXiGGdnLS7B/0loPVOsBIoYqYdjkVvgc4JtpTC32SiwWiCJJ1tvgTv6zj4k58kSLcPhPvrMfZG8Lu2figvf7OnPGBti3T/oZHHKgUMa362/oV8DPqFT8HRM/e9wDRb9sfAeJPbftDvx2IHYh3NW0HYgdiB2IHYgdiB2IHYgdiB+K/B8Tfac7nad5fplCzA9Fsq6yK0Hp57fd3BLoJW+bOPrCUQh29BBrDeFvN/0uqxP9e+89z4OBVl/y/19it9R6be7wTeUvOlLUSNSXiv2G/dGOy+HRO8/+5NXMLp8q8sNJxypqIJm0HiOjcHUSAVSAgIR1iaqKXFNVtcd4ES0ao3soLtvnetUBoSIJVg3IL/OLZcchnipxDaNqi+hqzydUl0Y/JAtcOtMZjuBMI71ouw9qI+DkgphGuRhs0wzYCXjQv704vLkVWUVBuxBIIdwsIZ4AIvaMNEP0WzkD4aFkaK6FACix4yTXG60Q+ZHXWIAoJJMYTv9Tr0pAqxoaNejItWRunzH+gv0UxY8iqFNepcEWULUE5yQ8X0j1AsPOGXDkOw549yeJXhL/FuxJzpWVR3Ms7qfkjcz+Qu+di+CTTMm4Kx4WIzrJf7gGCrsA3iBEIgwFRSJA0QUUiYUSM8no5d09St1/LgmBuVNC0JT4KWBNQpdBXzYuqRw4zIBo3JnpJAveC/Fuzgz9Fpq2oO9OzqJCuEd4VboTyQLosiop3smyB8k5q/ojDRDJqKrIoLOKmeJ50nLFkJSYLpCFoL7EeiQJBShfgKpQoJcxUEPqUchmA4VnigXCEkoa1wewGSTsfixo5pPAiigqGikkMEnhjTpvq6CV6NZ1cGRGiDRWJ7eFSjs6So6JoZ9KZJYsCzIx7eCc1f4QoAt6wP0InagxGBIBQS/oxWc7cRxjfJ2eAUF2Kt1CilLCcwZQXa3aMj+ge1VSalqyNMTNBmOWQcuQQGDQ5o4KhQDiJ9yBrRFgCQWOwBcKBQeR0anKGyaHBO5YsCmFm3MU7sfwRn6kPyifpRI3hRuRLDLdQ/Zgs0kvoTTM1QekCUUg0Ssk8Z49Q1ihcBolPEmMe5i1rA+wGnQc1PkpspyaVKDJ8isRTQR29RO6alEMinVGmplDe4A+D4Zzo9NJjUdzNO2n4I2ZqCmZEVHFT+K4pDjX7pR+TJWYgIjMKaEk+TxqxhKOQSJSSefBfhklCLimXIbMVoEyxZG1ExFqZwIXQ+CiYH7FYJ85NfAlV9UBOBcJGL5FYJcifaGlmfkRCKr1HxxoxuBoILNZLFsW9vJOaP4IyYJuXMlSdo8RNQS9bS/oxWeajCUBkoaHur5JVWnrs/oKxLIjo7t189/fnMsrI8kj/Z9m6dsa2TW0LHtt6zJOFJcG9b1vnWawBUVgQj7Tndz3iuAeILd7JfX0Vf2HLfvG2P2vagdiB2IHYgdiB2IHYgdiB2IHYgdiB2IH4fJb8F8z8a+39nwTiHRSK3tbyI3qcjbKVCCKVAWsv8PdqS9IwI4CwxiEZOuVlC0JrZNyw+2e26JbyElUtqfA0qAdpTxWTiaORAj20JD+cT3hHkfwn6rTlNtFny49oORt1p/u7gVg+vrX8iLphtXhCWNS6oMMoEGkNiLBme8/c6Pq1mp6w9voF3MWzXt4sLb6HVDTRY3l71rY0BtfjR3i3rj/xTiCcAULlo40ShV+k+0ggXNeSe45VQFQ6H7GysNADDBDsLYfbp7zBPpqUN4CoORvq9BiEsSCxUy6Fw5G5HsLNOIls+XnqMTzUXWOVKOiKycwRZlpoORwKJ5cvDiQHd5VoXkzCFQlDpQty7tg+5NSFy1FbR9uV2RinRomj2FuzWLaBODEQIZk3t7tAOGhb1PyImrNhHe+jvqI+KjOj4noI/2MUj3foMjzUgWl1M5I4McFpgP84sNKFnkf5GNrsxhw1ZoQr/BCumZRAtK6e7U7VPyRnbR2BwfoCfDx0dT5qFgvgU54GXyaB9sDZiBfiaHC4Dxybj7DPcTqnCggg1/AjkgxI5kAwb0gVNJSjEJSZwUwH5Xpk/gdcfyWQS48fYXQzAjWdylMtgiB7A0Qpcvnnq+eLhS4D1AENDDqLaxIUAuWELG0fnMZucZKzts45FXqAP7oocVh7LYsFI0J5GkwMCKcsE0ExNcqIIH2P+RLqjAif3JIfUXM2KDIIGAraGPYeGw6Hcj1ACRjzLJhHRJcfYZUo3jCAncooBOxljpOWP9uXgZCGJ9ThJjRQF0lR6ljYLsyMTHtorWuBKEocxd6axSJTk/A0nI4WBaJeI5JojiyAkMhxLT+Ck4S4mJpimZpcaYxyPcD/OPFcz1NTiKv8iIrjEEjjgq+/iwAhHA/EaCnlL6cmaGCcQA+oLA4rtgsQogzSWtcC0dP5qFksMrMoTyPIuf5dUyzKJzEzcZUQtOBHBPbdKmejMBTk/lcDmWUOh3I9hP/homhQgBPS50dYjgOdPaO8APYcoqBE5pbY8gdV8bjoYg0NDFbMyJoiRWOjZ7swSyYog7TW8Y+CcJ6CMDR6Oh81i0XvevR3BKK8lN8RNOkCiHMSuZkJQMjtRKJ/5+v6Ler2T5x1LY2uoGHLj+izLeI7mQ7x3Xn71vW2JkTnvffENzdf9P/es21xPHpALPkRPSA2NFpuduf78q5Z9y4g/s5tf+i3N+x/wt4diB2I3d4diB2I3d4diB2I3d4diN3c/8GuXG7+xv7fB4S/q52/vZtFE5z3KoaEkxgqSdMiDfZV6WL2O13pjThWlDBBP6xOBb5H8123wWWFi7qOlUdo0W0eXYTwMH+Dcf+nTmlBHq2u1CXv0DVWB9e2ct3yYaMFKDQMpZv01VktLK11g89PLiO/gggHSGms1amQNzDzd1uKk1dxPxaIsA1Ezmf4HaG0N7gleSKEkr5Y7ZsUW5b7pk4kzXv0qvXJVdoajwFBCiCjChkUrkMd72QZz+SPALERb+UmEO4mEO4+IFwvDxeavLIcyK3hstMlGwZFCmVLaL6TuFkiK2hkIMR/Ap2KK5cKt7zGM8HxwgkpbA1lTigPJAWwOVy2T85eCjGrzdOL9IJzxTbwTfi46nU4tNhnjkdhsaAM2F1FTiGrE6ygODP6wjCs0Agyp0mVSDxcRRERZZRNMkhaQnVSlgPcpNkNmYEY5e1n5j9EBUJZHucEBQ3yQFn9CXI+viHFZOOZ4Lg6Tp1oAsxp+Nso7AmyYK6T2RyUR/9yqqixVpZ56kgviHkCXomJYMJ8E7CORnWijqVVGBFGyYPZIQ4spcpq9A+r/XAK1WxwOYIM7CNuiRBtEiLKKJskR5sBXQAObVq2oTURq6kJihT49ClPTcqZECkTjAidhuHzfRMeh41nguPKgYBqB4+IKxzrYHHABz5cS7wGceoKh0RGxCJPHemF0g/SomKb8E2cKmsU2pvP1ILCYhEfONelcWCy1RgRrMvCKcQKqlV5IupJh3jEWSLKKImBGSHXBgiw/DJDwgARpUujs0BEOZcMEDoN94CwxwunA2/fO42qIiodVijCAoEgIzrTLvPUkV7A6ECaYpvojRRljaLPlCwQnDbzpIp4Q7Fa1ogJQGS1ERNBpgWCRkTMIUgARNQOLaoVZWqSYaxAhMtFskYVkMrBmaq7Jp2GF0CY2CtBuhhTwqi0mTGrYzgMcGJvVECIlke5UJZ56kgvMcdqoakpLxGiN1LxO0YDRFUCs1Ko/LFMTWo1VEp4anIar4mtGEsEmWjFlUR+Ri+SkC1gRoKyHKA2h8Va2AUCBC0yGm0FPl6lTurvCO/wO6IAQQsc9Pm4y03slSBaHFz7JVMgLxrNJQgPhNgbAELtA21myIHRlnnqSC+RyZqc42KBSHL8nCOgyO1JVI5HYbEwK4XKv5xyHBi1GhQ0Kp2npkterC8aQUb7DHltnajpPJXWdLclu6DoYaz/Bv09v6zfx9hYt+3f62Zt7v1nP7YFH9LYj9zex9h4r23x07Tg0wHx37NtB2IHYrdtB2IHYrdtb+wnt20HYgdit20HYjfxv9V1v8C6HYjPA0T2mcQ70iNN0Z+Apu/5yooTKw/Q5C3wzXM+xVW7FratW9uEdmjTrMRBkTPDfV2GkCH87p7tGGg26zZMtjQTNYVfPJaj7Czjp9zBNDisAhHMN6SpIjtEde9YeQgbNMMndSkty9VzIb/MFlaAqFkX4SYQoQNECGtPj0NwKxyLWitEgRAHSzmaoGKe7Q1tvBctswQZicidgcjci3cAoWr0MCf28rAay3WtXD1XBk0Goqt/oUneCYTbuMz7vIyVEVGAcApEqGWpe0C4PhDk3ij8BqvAcZ3yy7vTKWtblDQVEPGkQCTJ45SjwAryfNXb+CoqWs6yCTIiyBtWopxY/Ys+66JYSywK5VsoC+UqLi+N5qI1BzcIu0OmDzkPp5U3RwrHoqh44AiV/+MH+d2hSjJwdBc4y078OrICoYoeTs6hTI4JI2nmT/BegtHFKNwFx0wLFdcfRb0iBsvHUP0JXiMupC4xd2BCHrzCrvwQrAM2vgoHQYqI4qJrhDImtLZiV591YfRCYmZyBGWhUJ4g9duaSe9DHaHORE7hWTzYWCrB1a/Kh6DnqXyMCKot4CV8Occsk6hARIktg9IDl+nAeWHnLH8SEMSTqLkX4C4MHEmE435EjTsCboKmKfoT3MgxajAkzgNRh+yRlcFZ4qswwyFqFBedvkhFo9RW7OqzLgzTgtU5ghs0TknhgMg6VmomqwKrdGDZtJQDUv8YnCp6FI6FF1UOPQ9ZFyiG0F8CglgdqLsGAjbytX8NXDuVon53/iQgIo8Iy73gMiZSyIickCKiZMGHyTAksv5EiQ2iLDiSAekBYeOrIBJJqBY35lzk2opdfdaFsZZGBJU7xTxlvtXcjlwzgIiss4GWWu6Hh4JHw7HwWZXDSx15RAS0k0pn6gGPT7y5bUWDnERvCUrXELoCffIaQXFUjMvfsB90agqpqFdUDImsP2HvmiRiT4KmBgzRF8qr+CojjAghFlWwMJooJ5Z30WddGGsjcS2Cq6cmlN5GdhEgQiG1GCBGG4clNCoe5Tx9mqkJQAS6a5KpSdgdPhOApLV8zwbNGiJoYI3AYn3xRmfCKHBQnJWpqEv4SbkJhSFR4g3id4QCgbhSylGAxI8uVxpfRYiJEsXFieEnE+XE8i76rAtrbRTtjLJYUx4v/BRbM2lUScq8WGeGyUVZFTXH4jzV56kT8TsCEWfOIGNG0hkBJRRlq2rHIMvyDBnzZFj1T6SPaOmROJA/8RvxLjZCXDveCsQ12yN2xXcY/548xd4t69pfr92aNE14V4M/crvFZfjVQPzctmXdXSyNJY1/f9b0SazbgdiB+Cvt2oHYgdiB2IHYgdiB2IH45HbtQPyXrXu8uN/dPffV9+uterSGB9PvQHwqIOLiODkrcbR5zehaXPqqx4FNv/diPlT7/FmpcMReZJVBkhYLa+WO+nnO0irz924eSFx+C2s9tSzrlkWd/ig+blu87aniBseT+MJnMMInTZxr3wUiGOZD+azEH5JKw9tnsOpmKhbWghH6XmrbbO+2gFjngYSHgWiVPG5Z9JNAjKGOcVK4Fd7dMyJCd0S0QLiHgBA/YH39NVbdMyJ+Dghb1j0W3QDixBwIuDGYgcAcCg0yTzFAKs2IVLgVqsex4FhM4qyJhbcwZP0JcS8ZFQ5PLqesdYEXeaFJT7UUC0se+LbOWufFRmhRq6wOxy0eiGV8rOl7FDt6Zd1jUZ9tgl6ek4/MgcDAClmOn6N/QN/9YvkMg+F8KKei5VgIpUDirmhecl+O4sqs9CycOA+5BJcVMAoQamHJAxEVOB6hbLG0yupw3OKBWMbHmr5HsaNX1j0W9dkm6GUiDojIyICoCREDjKJ/nBE9Zaw0I1LhViinouVYQIdC464wb8EoZSgPo6hwwJ0+4G9OV4BQC20eB3ZLVrZYWmV1OG7xQCzjY03fo9ixpuRxy6I+2wS9LDhzQZMFgjga/H9s+QyFW6GcipZjkeOWMG+CF+vJ0DMzDyPTNBPYESKTMGYgRqwRYwbC5DHNHpLrWGV1OG7xQBrGR1ffo9ixquRxw6I+2wS9LDOfTE0huBzGCVFWJFKJ5TMYqoEcazkW0KGYC02Y7srUFM3UVFQ4KC4Kx+ahdWEcLgoE8Ru8sdBqYKi9aKSN0GJ4GFmH4xYPpGJ8dPU9rB29su60qMM2QS8zbqQswdyLCRRCr4s1cRtCoxlxrSvQSCqWYyF0ygt4E5pXlSmwWFsVDoqLwnwHsDNEdYOZcdwgtbDkoSsO9p6FJbG0yupw3OKBWMZHX9/D2tEr6x6L+mwT9DIDsbUtVSN+3W/Y2NSoI3BpoW9sjL/8l7Vf7SkoedxrUVzr5VtALPkIvxqIUiO+3bIQ6X7HI454d9p1i+Ja+v1Z069q9/7Q74/asQOxA7EDsQOxA7EDsQOxA/H7mrwD8Yty7ED85u3+qn+/kY/Z9jkvth2I32RdbJ+A9PQoioJFnVb3ar4FAoTUuhRNxQ3DQcuPbs0vHO9pUeyla21ry2ttO8//+V2+1V4ZRIdkfiCfVDcBEbRdHPIL7rnvONV6AzgSjePoAHUan803jclUgEbYwHA3bGN9A8QthoOWHytwY6em/ibZS1uiq5Q0toBY2MZeSH0PrpRiwo2IU2eAfkjQFogrKtRASKqpDW+Sy3sIiG7n1NyNNSDuYTgEdxsI9wgQTXvWgOjaBiC6vVIDcQJcUS2YnUWxBcJLKh+XcWYqIHwTPQRsiSGrb2QFixKrxHW4G6lmhHinrA19y3ib4RAy6yLzGiqOhWVNlAgvwoeYVD69tMXx67sSz6SyrY4P07ON36GejyKlHvdGwyOOc2kjXD4oH68Ok8vPSRgUFZMfElIRYuesdAJ2C1gzGYg6egiuZn37H+oSGgkFvAfvOtyN5CpGCFyRiMFyD8PhPIVcl/AaKo6FZU2UCC/Ch2D1DliueRxrY4AzUdtWx4fp2eYmAmKYkFKPe7EVXrwxkFdRuCeTxo2BCoDInQR1pIoiR4SP3Dm1GCVT32UgcnSUzLBAaK+BJXxK3AeVQaCFq+EyJMtzEA6GjcFyg+EQRB/D8BoqjoVlTZCdGpmC8kC9Y6ja4qKmD661bREfprENIwLSFm9Bj2u0GQkRpyucfJN1JsXok/L+VB4LqQwQRWAC0WHMGpF5D1EzYqhNGiOkBoIWnprLUPMtChA5BssNhkMQfQzDa6g4FpY1oUCMQfLAtsm2RYGIsiha2xbxYRrbsEZYIBAxQ+qf1oGgCyNkAqabdB2iVBrYpwUimsXaKFYoK0G4HCFWkVDAe9CpyXIZar6FTk0xD/9bDAcJDaMqH8RrqDgWNUsEEV4o0lVmXGBCym3JQHCttW02PkzPtnzXxCkLacZnCzmoEI+SENUmoWyyiJlvpqYg6YPpZ2G3lKlpzlaihxRWwuTzYi0SOjkyCpacmstQ8y2YaZHjidzDcOCIJEY5w4WaY9HGIoFoW8gWiqZHbguoo7Cstq2OD9OzLf+O4JSFqyEpeAEemEkyrxJJQ51Bi83NUw3FotG+o7RIxcDlxZos5vJIPCx96A/IJc9BI5W8h3NxT8yRuHUu/oxtrX2PRkDxK9/Xtg9/xBHvSHUf5+IeNYut2lSa6H22tfb96ggo+7OmlZT7Q78diB2IHYgdiB2IHYgdiB2IHYhfV/GH27YDsQNxy9j3m/Y/Fdvnl+By97n3l7pvZTvM/3g7Spf9+E5/n+X0M397/j6fm1Mebxb33JZugVhkPxyfXuvUqPFpteSnKm29LXO1Bj+5Z1uf+/q9l/K4zHno9tz6uaqE505blseOKIjw+PGDMj9VjXrib1+PNRCHRaOf+p1RA/FSIc/GHg5t056kzra8p1UgnlbSzp8vmlRzHw82xTEXVLrtUAFxMB+HuuIFEE8rQDwt8HrqXDQvuE6pa28AcXTH4/ZF8B4g3DYQ7g4gVurOV/zBpDg2V+GdQBw7QBybz9URcRcQ84GX59fj8eure/nxgwyn4fv8SgnxmYF4cS9HPvb8+vX12f3z+vzNyf78b/72z6vkno//g6Pfnl9//Hj+Rnv/zGX9w3m/8t4/r1TbwVEuTU3lAYi63Odc8lOVtk7ztLTmhT6/0llpjbYAKY4OZ/V6gH2wDGV+5dROyqGjsF6P4bO1FX9d7kPpMy55ru2oQGjOub4DD9cjWXLUETHvHyjhfPCALM/zuSe+nuicO1CuLwcaILSP9MfDl4Pkno8fON3xy/Hw48dc+oHOUh7KO19zhwOnniF+pU9NTRcOgKjLPeaSn0zaNs3Twhpq2Beq8aCtmi86k+LrC84qELAPlpGNtFdSH2ZrjwdYj2OHTq1HbQ+GS06BfI77TYHgliDtE3cLA5FHRAZiXqSR5YlA4kE7n5uPHnKHP8/DH8vr0XQXXenz8e/Hw7NjIOY9GER5ae8gszU+NbWTGp+acp+dAaKkbdI8LaxxXO+BLzc6M7flYFNQew7u4Eq3PWfLaPGkPUo/f3NYzp5xGXEL+Dufa209mJudr9+p7qPkc9IKXaOevz/LBPpyFCDKGlGAOB4KEEd3FCCOBwDxTHP+PLzdq3u1QNDxg44emppeaG++zl6+HKThbBamJgAhqaXGp7bcVy35yaRt0yxySRsABJ15wtSdU2QgvuiIwJVLlmnXHaXUL7iveNWjR3zP562tB9rHNp/jmSQDWANB6Y8MxfEFQBwOSyDmCaAA8cLrOpv/RYa6q6eHPCLkSp8nJkxNvDfP2S/z/DjnPUhz7YhA6rm8L8upCZ8o+cmmXaSpj0gbqMLcqiaPw1lecV5obif7jjo1OewdDy9s/+HgZDoiG15c+WztQKuoRDM1HeoRIWe/6CUzF8SL4Kv+jtClhZeSb1/5mwIxD8FXpKbZ8vnVLDevz7zkyeJGg5OWaizWr7RHC8o8FOe8T6/Pry0QSD2XxzU+NeXO315Q8pNN26RZ5HpxvCY8vR6c5q5T8IT5ygbwZAL7YBlb/e2JU7+w/U/cXliPY/rZ2nrg3yvPshxL3ZyPpz9uo5z99vxa/7Zxj/+yPq7cxdbH5xFx0Lu8Wz8If3zfvi22Ja+nrfPcs/GkeMO+492lPd2V4/hYZ2+dWyDZPU4j4l4gbm1rNboPKvdjgPjpbX/W9Em2HYgdiH3bgdiB2LcdiB2IfduB2IHYgfj98O1Bcv6gbb8aCP8BKX89EP7dOcW2p9cey2B9s09cntk1wrQCOUfBtj1UB1hsmt891q16/Sm0kYadqF2Exflk4z/EbujmQVPSW3TpnKhen+Z/eNcn0Dtx1iooafx7PV/P/PK7xzu0nXeQ4r0QpCZHHbMiLIQcEFGAbQv0iu/hUD+lfFowNA4NEJYr8cTuJHWtEyg+DQaIuNA80ODj1E3t1eRNA+z50hvR2agivnc9JnpRM8rbuYOEUKC3rK1VUV6Pp89kIsZEVwtghEriInQwCouxoECEFSCCFOyRJlCfzfuFatLv+CUQbgnEC9LR9/P1RKZFfcW1NyLw/uX52r22JFV13lxtvnuRWiCieVn5BAuiAJGtskBMYxFciY2xtbJH743GVSBiA0SsSoncJraJ+mzePzh1l/Bk8+2ZXChOeRfEL2CWw1HO0zdXcRFeiFZQeCA0HXjquoQmmyglLLBO+hM6cQyipDGIzodH6PoLx1OpRkyJcUIl1/myesgFaS0QeNub32MO1ioLBL9zLWCrhaqaUVRKBldirkADhNU+RLFE86K9/FpvOss3etF4ti1Bll1UQ2jSJLWSRLZ5etN57r6D8fAeMTUdj1/EucdTzuzcU/fh8YW5GIWL8EK0gsIDwRqhShtQ8KC/Y9CQAyNenI94VVxfZB81PoTGYYkQEcE1pHFIRh7Sdb4cWSIWIPBONEIfaFwka9U5URrvaDV5C2cRToE+h8eM4awaCOril/6zBoiLMSuWaN6oMVyoFBY0kLg0I+ubRFUN8VA6GMkq7rOJmQpgP9RAgAAC9/7c0cevQsT8Kmy548GOiMIDkTftZchGSCIgMkvuvJCXWFK2GFyJw3DOcVjqiQeaGnwdp9DkG1wNBJVxcjoisKhgpKpVJ1dGxMlBTAJAIF6LSl0UNZCBtWlE4EEgoVfboyiWIO8gY+18HUQjgjREzqoVcqWWQTUkiI4BtYbvmgL7jIX9QB39AiCeX4SJw7QRAkLWhleMiMJFwBpReCAilSCzbhQtpOj0WrFAsFbFPMRNQAzWvYjtbJwQh0T0ONp8k8s6GnmNSBaIyCInxqq5hpPWl5Jc8U4mrRYIxpfuuUhwgs+JFk7U1rE6B4E5zeNZ9DqiilpAWSRoy6AaQlOhl9YUIL4IH+cF90TM0MiUKCJLMRAHYR0cn5ibVwFxLDwQAJFkfY3OyA2RxhGAULUyM0pimZosVJKwxCGhS7fOBx2QfLebWN8iYvLzMv3T6+7GKurCiwARFYghg6eaI0UNRO2GZdAAkalJg1uR9pLEn6F/840QWTxCbSOOyQlIXEpivY7IA5H6LBIQxCkAYRCEwqfMRgAX4YnZDHr+ePj6ChoNuAj4HWF5IDT3UpMxIqBRMcBIB30M1e/TRfc8qVCWxBmZGiCCxiGh7k5NPlLFyPFeWK6EVgDcDiD2SuK7OWNVUEU+mipSgJLGIDcXZ9Ec4RRZpYRq8GIZNEB4ERbFEidtdRKLZZiS0/g0iOmSHFoG1ZDZKFI0uUQBolI2QPfK9w4/49i9hX3kl3V092w93YvtnH4134Zd4X3WlZQxLo9ua3b0z3b7rFBntwr8tUD0dC/iO/PdZ9ejG6xp1T6iu6XZ0T/71zxr+mgb/7O27UDsQPz+xu5AfJLG7kB8ksbuQHySxu5AfJLG7kB8ksbuQHySxv5p2/6Gzv68tqlVP2md/2kg/Oqev5H29wDhHzj6y4AoLvXlVrgR8HAhJZ5kai5yaA4rZUf9wjyMoeyVLS0evqUq53qpPU8+OYCmrRY1dvUs0g2uongHjBPaBoM0QoztwwIEPa31ro0mM/SB6HEjSMq/ABFNLnID+MXVI66V0l9h9QoLvZ1Y2RMW3egzGULPoi44gGyLginVpt0eG1p+DVFYpIXnQgMw4GisyvIVEFAqb6PJePkj3IZ1s/hKi5pSgDA8Dd/t3QqIuApEvAWE6wDhMhCuASI2LQpV/ltALCrdAMKW3gPCdYFQ+2w0GQVCuA1b3AiQApCSdOctIwKxRjgyiCtMBWVACMUscYyVSTkdTngbODNMV2E8KCcCThdhUAijwjA5mAGhUUnO7FQ6sZy6ACG2ncR5pG6juiSNxuIWbUf56B0bweU8qQ0a34XsDfBoC/1AI8RIPJcLnTFrRFD7bDQZzl24DVvciLmBmQVBkRhsLvFSR1C5lKkABoTSrLxGlMiuRXWYeokGMQZnOBGIqaJWwH9smBwSWAFRSfJZjldPF4naJq5NcbLaksiOMYdkaNuO8ssUpTFYwMsYc9ABtPM8KREAOQrvg2yiMwaIaO3TtJy7cBu2uBEAAinBEdJciMBCQDDbITMV4HgfroWoRY5J7MMpWc4QEJGjpujZs0Ry0SgpyJGZHMLriAaIKECMxjbEvKA6EQellETHwLYYZLls+SRRLpPhWmKwCC+D2BoS+CPIOkVtUyAK7yMyEOdrAcIntc9Gk+HchduwxY3AnRJSAojMiNBQFSmiicpUcOrsx6wchaOhrAd7BiMC0U/kLJXCvAhZYie+Lp0FAqUxEGMBIhrbgnKRmPlRSoJdEh0FE+SSTyJrhI3BosFGwNHIDC3hreQ1IvM+qDcyTwMTvFP7oknrsWBkbsMqN0IJWkiJxpZcGQgyOTMVhAEBW5l5AY5GnnyCroaYmiiKVeFEMPOBjmFCCbIKmEkGMVYC08FoPuepKdS2gRBGNuSpSTmAYzDRYrp8klGAGEsMlszLkDgtpymEDES+d7K8D778goa24oA+Yl8yaWVqUm7DOjeCw71ETQlmdWFEINYIlrXCVBAGxAWMjSQ8iOECTkcOFyacjEQ8jUvhRIAJwbwImoMRciwzOTTmC6KSeI6+wgvjVNsWOFYKHR+mqqRAdqCOerE2fJILrrMcFyY64WUgH0dg4d8QgduPmDIlQozGc6Ezs1WJ/tG8ovYpEBLBZtq4f/Pmin+AIPBg7JHuXWz3WLyjzo95xPHv9X02+xXLyoj4CaOA1f1AvDf2SPwJIEqdv/dZU3yw9z7Auv2h30dYtQOxA7EDsQOxA7EDsQOxA7EDsQOxaucOxA7ErwPizzT5lzbgL+uLHYjf1hdFUGHq8jFWXqQi5+n8bPHavrGvKWbHTqLz7DS90pPKc+dR2lKPQ22gM4gq7fOnelTk2VLo1Yyt4kesPIYcFq0d7LcHHl6ytyYV+/q9F7d62SZVNsK9QHjyQIQlEPI6L3wKElreiyukLbIA0XJHAAR8BPrpclh7JPGrQFRu+Y52B/ZKe4OruSh+BYgeFQG+6BC3gVANiJVedo1CxiNAkKtS2RJdIEJ0NRBwyPaBcAsg/BIIcW0pEO5BINwCiLqRPwFEtPZtAuFW+CyqfVHYCCdmVYBLcZr0bMujEE2V5Jk/gRRD5m30geA3mWnC4hIwVa1zR9gdJUA4iCiIR4V8d2y5g8NGWRbKEqn5EaWFg7ikkMMz++TEdbHTKncQM04uqrtBZWse5YTwC8sRnJMTsTRSDMU+5Yig7KFS9cicj2wta3hEp9oXhY1AHIc3uPsiKWgI36LhUdAaQRor4CqMIkIyKhPD0bvO0UE56cye23OSt/5DKBo6G9wROGixRpCnzDJHRtL3GDllglMWr607tq3mR5QWiida3LgobeS6Ak90qjAFMZXi8E355XflhKiPHLYQvzAaZgtZMaI3xNFaVD0y5yNby956vm5F+0LZCMRxeGN2ATzHOKtsBnXfs8ZAEr92xHUP9oeZmq6kdVGvEYMbqol0mzviE0YEjb7Cfihe4Tk3hn14YwuIYyFTU+ZHlBZ6nhipJcFpx0UBYriWqQqXhfYKlT24mhNigWC6jMqggIdyRb/BzqFS9cicj2wtp7TaF8pGgDOfegJAiJpGqHkUBETI11QBwk0GCFaiqIGIF0oBoRQ+sMkdQYfRpzPshwLEnDtZIGIeEYUfUVrohcNRAzGksm+BiK4A4aaGE9IFotjHI0LsdJNV9dBezv2FmlQhwgDB3AudmiKmJso2Wh4F/K8gldAaoVNTVqfAXROVHevFWkSAXG9qqrkjtEZEASI6JS+kAsRYrmdRXWK9D8ulqNU9ZEoYmxHB9zJUWgXEWEhBl4t2pXJCBIigQES+a8r2jbRGoCfz1BR0iipTE9Uh5B5ViECVZ2VwXLA8MWPhImoaF8uj4IWURXOoi0kSC4sPsRL8BP2x+XfE5YzBxyp68xSUnHA1zNS0zh1xynrgz1QaCqbFXLpwLoIs2gOrW1guRa3uIcvsBTnO01mYFqy8cTkrPRSMk4v2ClQ3ak4I6gLnJEIx0Np34VsT7kldrFXVQ3tZrA3giHjnHuFdRHN7V35Nxhu5CifinjcOCnckvuuXdVzlUqzmeCfvpGxL++IDyh7mmnwcCPcAEO/Z3s9+iA+38L28kw8H4qMq/3V17A/9diA+TV/sQHySvtiB+CR9sQPxSfpiB+KT9MUOxCfpix2IT9IXOxCfpC/+qs76GRt+p/2/lFazA0Gbv+vsA3XF5bdQdvCBp5MFCDwp5Wc39jFaPCdbHrkky2YjrgyZ56Gf5SlQlSdZS4ds3jkhNok8y+w87amfKlWskiureCTxcbPDBHFX+DnyFW/e/XvtPpeKpvy0AgHypXNCn/nJPHRfx806uisgknPKnAhwl1t5A8jxx2Bip1AeeCSy1ZXuR8yKGlY8IVZnca7kKgrE9ox3iMQQi+B6Nju3JZR8zgpUODifQrRACAeF/5X3RNuIK87IRCxpBRrmI2inJPQZPNduYUezbQHh7gbCKRChHmE9IFwfCGe7vM7TngEQFEhgA4jFhWyByDkzVwQf7ONSIJqu3gLCGzmXzP4QIMiF3AAh/IaLMiFml5AwDsBSwDfwEZgbIU6YeWAHERASIKCFT84iMCCgz+ElqkqMeGE2ZqYIOlUVNTil0zT5czrJOfZt5zyqhmHOSGySE5MKCrPkjLqFW2IZI5G1NPAut0sGiMwViZDaT/q2NYAYMp9DYsM4fU0Yry7rWXqhl1p2ZbfUFW6nhD6LMpLVzvmcuDajMiESO8HBLECshBjA5sAL45k5EREnpwAxsqeJQ42MeBU9RnWBjhJKQNymwtdgA9hx6tknfU54zVw/hwnlCMMi1i+nN2cYCPJkEt+jMEuIMRLh1YTafmaMnNOIswHeQFxIro67Ms/ufoL/ToEAQyQwV0MdsDFPBNyfQV2x1LI3jvDypm/+J5cVQ1y2MziNERLVAf8WvAgdFOc4SAROCgZzgkiGNRBwoJ9F5SKIPoeqZtRAgNEAJgOUMwZITAhpTClkKEcYFknysIbG4gwD4USrSZklYIxQ1UHKK4wReLJBjqG8CDNS6HonDbaW1wyfhRsGUeVQbghCU+WQBsL0cAIE2VoDMYYsRBMFQhEiSfcAQYFYMnMihkaLSCglMQgDQvQ5Epo8Tw/JAhGddnkQgREGYpSjEGAIMZ/zeQ0pEUvsGawRCoQyS8AYKUBEwxjJQIyyRggQmYuR1oHg6CqqNJLImugKEMr0UCDomAIha0QoI0KBCCU7MSEuFy+MA4znUYEYFQhhTsQob9NnnYkCxChyJbRQJwgHUWcgZokOZd7jqCI8jY1YI3BUPkXzAgyLINQXIfk0ZxQI0EALs4T1M6KqfFSMETmr4aDAxHCFixFj0euI9q5J4qIo9S41U5MD08PLVP7Gtr5JWu2rskaMYK1pxBNlQtAS7SUKiJfFGmwO3LAocwKTGrE5VGdCGNsinhWc6HNEYoWDusn0rsLXkGV57lBmTdB9u2Mql36q5gUYFrQk81kJf1afwe8IzpMss0TjmoBxYRkjNGEynyTgd8QgvyMMaacQQpMQMSdEEgOfQ2LDRF2sVWNE1D/mXqGWESOGojoxuyVJn7F6ict2aoyZdzMZ/AM6E21MzNi9c471Z1vGZg3vIzSoXob74M2vqmdu2Pl+JsP9jzjuqiM0n++y5TEglmojv3r7JQyY/VnTJ6lrB2IHYgdiB+LP2bkD8Uns3IH4JHbuQHwSO3cgPomdOxB/ws7fY9TfQpb5vb2yA/E5eqV+DkQsA+FCNLE/4u2iKj2AeBcQjdLGImVsSl8rF+oaQ0kZO/FXjLPZr9XSbRTURyxHxE9tu9mC2JYIrko00SuSWLF4/qa+Ju2aoP7bJvbHmrF1JJJg3CTLJvkFELXShrelSa2+am5YSE7o25oloIYTR9Y2EGEBRFiUrJbgrW9LTQiLxPAXtkDIO6mG/yFAxIpX4g1auWsaRsMtIGqDtoFwa0Dkum6NiD4Q7pcDgVfYl2ScdSCgPlIDgZec+WuKdlKCT+wsMULIAcTvNVeMBtW2aGOR9CORlFgqmvKaU58njb5igBitkoUoZExFO2NO76TWC4Z6sUajsJxZSwNADJLS55Tslrqc5GVfl5U2VE2jxHo5l0gu+TuIYzwiRssRCe5U2niB68hLX8n/BNEL0R8BREkjxnjDK5Ern3xIIagyBbEMoDvTxv5oY5H0I5GUWCpIqdoeTh2cUbULZI24DFWckSrSCLNG6MgoL5AXXYsQYo7CYqcmqlFYJxrfZBTXLzs4zxPiseCtZ/AusC/aAiEHVpC2Aoh5jbhYjsh5GsUK1OeKvodolkB9hLkq1CcJxBl19wbDK8lLm7rwAcRcRLKMBtW2aGOR9CORlFgq7JB0qu2BmCkafWVBO8h1FSUNqSMzP5SQproWVDuisNRAQOXC55TQuwDzQpQ0ipeZeReYQAZx/SMmCtJHiZay5IgEaS1FiuHcV5+tD5mLMghXRYPf0N+QqF+84ZU4iSiSgRiSCdO1iP2xiEXSjURSGA4qFfSmuQu7YwFEqasoaUgdOiJcASLqWgEVg6kGorBOst3CVCntsEBwlBRhfWQOxqTpY+GrVByRkGf/og5CU6zVLCH1kSgjrawRIQl5LfNK5HQUmhcMzmG6FrE/2lgk/UgkJZaKTGKq7SHEs6CaM+rtjnWckRpWROoRdYuRJUxyN2btjxBCBcQorBO1c8RFQMfzPtgTwrvQ9gS51OT7WBRCGIhoOSKhXHZcn+h5JKtZImwQ4XXoqh4SuCGl/1xmKCBGCLMrmGVwbYHoxSLpRyIpsVR0IVNtD6oH7I6K/5FsnJGikJElqmhWx8J2YSGhrGvBS94E+6GtkfU3mHWiKVWPAyJa2GeoJ+VdiL4Hx1wJcpMApobkBEckWY6IAqH1iZ5HtJolUOag3ihRlfSGwoXSf27xsybE3/Ib8hH+h95Hl5vM92w/p7lxW32kaI5Ek+vdm72x/LXbY484fl7d4mc1N+7nXvyspZ0qPw8Qf37bH/rtQOxA/P5e2YH4JL2yA/FJemUH4pP0yg7EJ+mVHYhP0is7EJ+kV/50lR9sUZv+bwN9B8I56279wM1v7OXtXD+uuvLjuATXkHIqKLo0XrI0G/y0k1scW2xx8YV3+pFXVMQ98znUok4DUltfFLWLOT0YF+cKiHy84acY7gi/C9tab2OsxO0mVucHzWb8014in8deEdYFPz+YJl9N1GtDXTyqxZF7HG6aRQwR+/6VKnJURkY5nvqRV4y+hnzCoqGKgLIChLxAO2SRivpt8Hy84adYhY1FB6US2iO4HsHAVyyNaFrfEz/JLwq2V290NqYINfuU3RrbQKjehK8IL50X4VL3akprkVeWQJBFpw4Q4EOY+uUF2tICOmKEKlzLGXkcCL8AwjJLQsUH6QFRi7NI2kaVgjqMNC0MEKJjwX4y8BnYowsh80QOSLzKWtgM58yCUGaIr6KxOOYtnCa/EnlF45KI+yRbpO8mcxj7eOKywIfQ+hOzQQZJ77QFyU5NsYrOUsVeEZl2gFtiqfgcY0VSJD2H/axf4sAMOU1ZIN7Qa6BgAo+5LAjcyis0PRpVighdCgtE9j4nXxzg4mDkoBSTvtytbIbsaszMEF9FY4FrdAx+JfKKipKoy1QtAhDizIwBvIuorsyR1US8jADvcgSkybsaCBudpTBGXMg+tOScjaXicyADJhZM5PnEOeRQ/RIqy3BMVClEeyy1IwKv0b9B06NRpeiMiLPyMcCqSGURUle+BCzLbIbgig6Gl7FUMRtELMWvRV5JGHdexbSqERGg9xHFUcl8CDTvfH0DP0qBSzq51kC4ijOSGSNXXVjPOsVILBWfY6xIioS6dF9lM3wTO0WVQpwptQKCWwllgkaVQteIakToGkHdg/sQ6pypAAEmSGEzyJnJMENqZoMAkdeIJvKKCIZA98NYpEBwSRmIaDQ63oIu1t4pE6VerBWIlp+iChtmRORYKgjlBO5K1qNhjQ3sL4GIzgYLKSOinprQynZEsCpFyM0ud01ZxyJKbCmdmoJVwvCGzZAJWpkZ0jAbaiA6kVfALClsDliUgaC6CxAlDgupiSSsCV7UQlxeM3wux0ZnsfwT0daQNaLEUhEgRuWMBKlL91W/RIAIOYbKaAJAGeU1e9dEYJ8m4ZoVVYood+3nSX9HnDNPglo+5Fgo4DjYxbqwGTTmSGGG1MwGCFlRef3IKxIyadLYKmoR9Cs0skkQiRJdrKke1jFBLBZKf8XvCOalCGOEjtvoLCb2iih2FF01jaXiosZYQQqOWzQJbXIq+iVnYYbUUVqCE12eYH5H5PsoWvRj+1tMk97/O7bcaJZbMbAZ/r3W5UaTJ8ZeWTZHu92yqP6p1/JQ4oOMkY/ebv1OX3SH8hw+2lxmRNn99GgJ/+1nTfGjmv3rt/2h3w7EDsQOxA7EDsQOxA7EDsQOxA7EDsQOxF/R8e+x5yPa8FH9sAb7zfJ3ID4NEHjELBFFjM5E4TbEhomhz6XIcUSxSHKcFfpjPOwU/2To1Lkd3YSem6o12OjB8JoqL3gb56tfFb0t0uC3y1C1jW2Ll48oS6SXNsqM+v014osoRpvezBnnR8PkUYutzkRxqceGAJAfh7ObJmScvLrZjRfKuyXLZju6CUlSw5rsnI+opccQER9cGEycklK2cfwLENtlqGb+8u1CW+qS/aRejPbF5cEVP6FPLixoGRaI8/VEMv0LnYnbQJxccf3nHPcAsdirgIinpkN6QLi6E+PJxClpR4RfAWJZRqm3hjQujtg9b6LDGCCick/wEH4e+XEFCIgxgLxFCWqdicJtwLvOhYlRuo1YIIiMIswLUb6wQBRljhQwEW1HN3HJS4ecRSJdxXZ6DBFxhiadmnoKIShjuKMMJ/VyxJaLRIdJrcUSXSafh7sL7TRAJCEQqJ+QvFGFXWL0SgQIrBExtDoThduAt/8LE6MAMQZ+FV20LLw4HSUChACBMjRqC7pkK7qJn3y+Mu2L4n2GiNAFJp+drEuFEG+ml+0ynEyJEhMmSuyWxmLfnPfgo4R6RHjWNCnsqrmfJ7w0X3plDBJ0Axl95ipYeYPCbTg3GhPBzL9jUK4eFsyimqFAgAmiwULQo1vRTVwoQAzVRNJjiMjVnF31fYUQrGh3lJFVSNDRsL212C/Oq9BJvUZkomhSEQl1Qhd+DGmUsGSDBWJsgFBuQ2yYGBaIGCxp0mvgMDsinAWC75E2o5tYIEQtpAKiZojoQpvvmroKIbxNt8sIrgDBU462tbLYL87H0AMiGBUpABFMuLccs4YECnwGIix0Jgq3gTgchYlRFMMkvki0siCYmnyWkVImiEZtce52dBOvd01FwwJ6Mx2GiBf9kN7UFBdT060yotDYglPeVeiUKiMin/c6IoLljEDTxPINi8iK9soYoA8SkID4Bn6hM1G4DSzhkZkYTpgbHOCL7ouTHj0r3+Ei51NhgmjUFuduRzc5S3wTnxdr5pKkHkMEvA3U7V1fIaQs1jfLuKJeRI9RJY62VO/q89RSsDosZwQ8d51iEfGFeCqWH4NoMw46MWu3lfXPl7i4ZdviJ9w639v60U18861liCx5G0vb31eGyA2ttqOcN5EjVzgjNzROWu2NuNVN7ldvj0c3+QjmyXoZwqvayNk7vz9r+gP1bpWzA/Eb692B2IHYgdiB2IHYgdiB+IV5diB2IH6tATsQPwnE5+7iX29H2ftL+U87EB+4Rf67wako20Jlo3nzqxf6xJxTnoSqLC83X5UQzd8F9yLcY199BLLywdgBT9nZWGX5F+Rf9raVYdn2YS3gxJad9Xk8NbzmV2NzV7hOkApbqO3s0JxM5fyiq7PrRRUBltb6SozkPUBY7kURbbDv+cHLIXaAOJOwF52v+RcO50PFNcg7SgCogFhwP0J1mfVs1nfBY4ehsAlELtYvL4Y0rFebiiC7KAL8IiDaVMFY7OQlYRGGjxmIuACCXg6uCD0NEBXYnStz3c4VIOKSoWA5FdDdYKYCy5uzjobwFgIzEK6TMiI8OVTlPOKGnKYUwPtQjQxmMSTrvjlJTBQIMyjTQ9kNxZHkNM4KqWBcCifkxKlOU47lUuKxXFD64EDqEpdptkPfJMfeqZKKIH+kMqtOYp+UJiwWKtU7tQQWVPVPJ4mzQucoKgx4HjgjjBjhj8z/Y1oyFCynAhOXSvg7B17OCN7CRGneDCNiBkLOA4gxJI5XMhaNDJqZJaKXeHlV62NURQ8AAXZDVrCQIAjkUUtBX6tP+oI5qWOM5xIXJrt5R3GHulCAUDuiaHVgbwyVZsck7A7hs7DKCJcGB+d5UoUOa4Gtn0kVI6QCAmQwxKFMZ0buJZFnobVGFCLWORUOrAhVmHCEbFBaitIBlBExlPMJvIa3gLgkhieRsEYMXKO+3s7OUtEvANMD7AZVsBiu6g9j8YVQqAhBmCc4JnQA5zKbBL7l4VqAUDtiGRFilV0jnAAhnI8r4rSEzEhhsmkRfRAOR6mfo7Fw3/BsHBFJppzJoaN0RORJuMupgO5GzAoTc5umJRBgRLgUL3peQlgwEBghukgGoXDRYomSwXfD1WGBUI0OvZ24F4iRFTSUTSJOfqE1ZD4Fd2lZrGFVDQTOB1dClvCIcApEdH0gUH+O6zIRECFJJBk+o/Fhol0jlgwFy6nIU5OzU5NevdoZMsEkkmAo58m4C0k1jLRm+ByrRWAalYACrQ+uLYHpQesW2A1Yw0D7UabI5aJiRMQJyd0wKvcCq1tRz/B54gNLRO1webFWqyr+RXBmRHAslvE0BaHMBGempmyBrV9pdjw1KRAS30Xiw9D5DERYMhQqToUsq4g6okJVlIsW6+CwYIIRMU9LFz3PzIYLjKCYIoYncRU29EU5END64HESRQHDKbsBw9xxF0p0FDp/KZwQaIAASOFluKKuQS1BjBWOdhKUT0F2lN8RapXlX+jvDJmaiFx5iQ4RV5xwOBBBplhg61ebBtYN8e6chcConMjr8nxef0dsKUUsY5D8e43R3gzqUZMn9m5g9VZ07RcrlxDa9Mvv923xRovixi/rbc2O2GnxkqAfzdHl2X+vD4cl6TEUbulo9M//f3tXk9u4rnRpwQYIjdxAMic8EryKfEAvwIPOfoiMvAwNjbvKT1WniixKlH+SdLfvfdR9r2NTFFnkEUlZdXgqLJpcfab+piPcbNFnX3GEL9afc9xX0m872rumJzkaEA2IBkQDogHRgGhANCAaEA2IBsR/AYjvppD86bp/NwXmczV9wqoGxNMA4aFHfLH6EPXjln4Gq3KYxHu0L7TmyuHvL+N79TP0vaypatFTn+uN6c3tSltUHyLtdLz27u2WfkZIW2O16tv6GcGVnI7P6GeEb9bPcMrvmAHRRciOdHf1hvPL3iCf6UrEGdGHuA+IxbdSP0NLeUQ/I7j53ZdvoXv1M8I362dMFoVyfggyVlhTXjbV3+oNzWl7YwmEy0CQPsQBPItCHwJchEf0MyjtUf0M+O6+pp9xGMP36mdE8DdCtOojoqQR0VMh3uoNigWw6A2/2hboQwzgWRh9COYY+Mf0MwZ/GB/Vz1Bv9lf0Mwbfj9+qnyG0ghCt+ogoaUT0VIi3ekMhK3ojrLYFsgRZMUX1IcAzeEw/Q2gzD+lnqHrLV/QznNep6Zv0M8ST3xfqI6KkIVNmf4eayLI3ELCg2pY5EEYfIsUFuVc/I3fI/foZSUbnC/oZJRBf18/oNNrJ2aqPlECE82fURNb7w4k+hA3t5PNE8Zh+hpbyiH5GXeniMf2MXO/36Gd4eYBghp6oj6iShk40IdzqDc1peyO4tbaIPoTqzKk+BEcMYc7EI/oZWsoj+hnM4nBf08/I9X6PfoYCQWyLFAdGeorjubjMQVnvDc1pe4MJrNW23PgNeC3KSfms/l/Vz7A5nPt6b6y25euvCP7L+hmhkuO7e0Ouae+argHx2ZraS78GRAOiAdGAaEA0IBoQDYgGRAOiAfEHgPi+xnwfBWWN7PKddf5tYo+tP31uQDwBEI+wKdY5CF/nU5DL0Ri2nf7jYy8mv/+if3eSY8efdr+Q8/XEidtPdcR2qkJqmr7si0y1ErdXzhUl7Gbpm+nfjdudNm/b/RZtzC30LjtXbrMp1jkISxfNw3wKU/tU0h5mEh7v79S4DZ/ZSI4Nf3rdA4g9mrTdzDplc6VHDRBvGQ/txq35sy1LWACxWQFiU2bf863j9tvJ3AkUbmNqYQYiaFSD2ojoVoFwJRC8ufeTfApXAPGmZm5uAbF3+/322j36BSD2FSD2s7+rI2IOxI/p3x8TEATFBm1MLZSANeAc3MGmWOcgpFI+zaeQ6C3gS0yNeNud9vtp0nl7f3/9hUE9DWu6q/hvAuLNve23lLb7uXM/pn+Rg/+bPv040ffXE33anfTcj9P7+w/k+bmhq6YcP05UD/K98jmyYUotS3jLf20tVDb+dcnG3UmvQwvo/3uM3zdqY24h9V9U5sIdbIqAkbDOp3Dxs3wK2cXPjtppDMBksnmvI4KaQI2ZErcAYren5mzc64nS9i8b9zJd4zgncu+3L1TEdkv/5y7gjphSp1K3+So35Xjhm5fyOc6v12+5fC1hY/7aWqjsrU6S6Wq9DiPklcFRILamhdRD8f5oJFc4CKmUT/MpmEHSX7Dsb1wyM42IBMS0SAOIDYE05fzhXn/tfknT9zQTT9+nf/X+23FpU4f+4lnaUV66Ml+1+0U5MONsHX2jEraY050tYYvPfM7WsuNpJj9MvE42vv7ay3U6VZUjIrfQZ2WKe6KR3BPT5NN8ClHMEK/h217MzGtEBmK/zUDs6Ttyo0tp5j1NF5zcKTX7hO7g6fuEvHxH4vzbi9y5BJR23V5KeUE3phL2+JzOp1pOvB7I1ETnNpwr3wIWCKwRuYUhK1NowJVrbIrgbvEpMnPhYT6FKGZ4RB7ZvwGI7XYJBE8nCsQbret7SqPUPa+VdtLAdLSVrpZzLwIEX+Xefpz2LzqtcD7+tt+SDT9O26KEN5f/2lroL2qgW8FMTdv5iEBrqI25hTErUygQ19gU6xyEXMpn+RS9KGZI5JGpobyQnvR3hC59vBD+fOVPCYgtL9U/aS7PCzIWSu6a02b6NE0ceu4ngMBVU4c4rmmLZXbL3ygf2TDd2SdbwpvLf20t06c3qUEWayz4uI4OspjSNm8Oj6zb3MKISeF+NsXv51NcU8q48rMsHfs7f9bZK/dX8u3dvcfmoSt+wyuO7+ZTfO0Vhz5A/nkgHjvau6Zvt7YB0YBoQDQgGhANiAZEA6IB0YBoQHxX9zUgPgHE8xzPqgpzn11Pom3TfUPO39uE7tNX3rar+zQQapW4Ns2ZwuEsm0uLoze5zPmYr2Rd04qEQa85aZdaPEaqF6Hn+a2T132mHF+bYp5MrxcpIjTt9O7GRSSRVNudjY2zK3zx3c8sxnd202e7rrVJc+Xc5Epb0zdJVku/qWD6DIjExYhdnGPXmUbY87nsUETV6NzyE+3uJ0cpoOxhgWkw9mk6cRdFnyOjhFROclSZ0n2ltX4xFhQIvwKE7rHvkKcCRK1NSyAIxWVUb5+s9qa6UAdCP7BWS+3+klzFeXPHddUb1QKhG4jp3wMsCKKEsQBiHFzieYSZob6oqB5qZQWIMAMiFKUEbg8rlme7rrVJc9lW1CbEBRBcr1AGhLPBUT44lolDpBO64+fMjg7xRZiBUY4Yo10R3ey6Pl2JvBYIqM6rhsUSCNrpHQRotU75JMdRI5j0rk8RTxCzxI2qtYEX7gcIzI+I1uLicdS4LWxXtHFT2O9I+6ajtetamzSXbQWfZ2l7G5VFrZYlYapXBg552jxHK6FgAQN3zQB5fha8XzA7KKQAMzCwRqBA74x2RehmjBD1gGPXNs6Sgj1y6EbxLllEOhmkME8ryYc/Srgc6IR0mDEkesMggHayId1z9BV26SaJh+D12iA6I/ATeonbgsAGjsMPDOLy9Yg4Eaxd19qUtwjn3C5trHemdFitUyP4K0L/ApsCUT60Ip+Wozmzg/NlhkYaEUa7IvrZdRrlRIGgMg5ORwQWFeIzwKKDyyPi4D64awFE4AAbMrwFDnbi8r3nk5oIn51sBD2hl7mol7FGljG90SFuC2KvTJ+DfHLqS6eWZLuutUlz5dxkF4BgC1PpsLq/mMlVo24FjWsi94sFosLsYPZGmM/IMWtXUJ7ZdaNT1kdeI6IFIjCfQSyaSj9oXTH6TMpEfKwSCO4H8paPGvFkECC0ZdDDoFgn01jGFRLNBXFbggDUR+GSkO1RSA3Grmtt0lymFTIiOJaKLR31ep+fMaN+9EkMZYD+EYa4c1Vmh0dz5s8oWbuCbt+ZWoWEWwp5sQ4ciCOwOlKAIEVUi6gLzwJEUCD6BBw3JgkZmalJmncYBQiv6iJYIyh4htoVmW2CuC3UougEJC4l8oNM4IFo7FptU5dy2dwJCMRYcWoPW41Zintq+gcjAnFCEOUj8KJH2hIyNS2ZHSO0KOZx37J2BT1ylNeRIgWYG9LT/sjm0XJ/ZFqmNriTCQhLIQ1mRG2B4A6VdOSawSfpRo20AiURWBVERaQXdRHUyrFORGekHyP/NpG4LVOLoihsUMvprPPEYQmFXettIhoQctlW8Go3dhJjRUsXq8/o4ehWfPvB3XME/+iV3ep15gFw/pz3CctyzhCWqcE/2qprv5Wtgs7tX9bhsWAl9zW3hmL45HW3G/zoAUvm8V3CjfrXzt6yq1TgWM99ve4nOtpLvwZEA6IB0YBoQDQgGhANiAZEA6IB0YBo3fsvsygd3crntZTf2+zugdSvWdTdtKFbOffNvZQ4BtEkxsXrNj4brpQj52q+e3eNA1FcPatvdsAxFO6AcUS7YMw/l7BosbEouprIsD9mG0gXvzh5jNxDUSUATOqtXjYN0Hfb9NK6G901IZT5l1Cg7xddmXQ70tng4HezQHhnQ16sUWRyPemvX0K0lJqAn6Iz92xXsDyc60ogKnyMTkFPtYSSIRKdeBSLVkV3sxWWoZCdOV30fg2IcAsIVwHCJSDcHAjDgfDFtbeAWFR4BQhbeg0IZ4FIFnVudfTNOq8AIriCMvQJIPJYunhnFDDgXKFPGI79eBGOg7Ig4GYRzoRwKGzMEVbXAAeC6QjsEQvHMbMaDuJSSc6UopSDOF14MFc0QdCkIs7LqPX3ogxCtnr4r4VsAG4JWB5QDumNRdrWeV02oJOHcogwRAJAilzPuRd3z1FqAydEWCJOW9RJ31mLfeaBRFUWSM5EdY/CEfhBbAzDgmCuQ+IuwGNsY4507HYcvLdngzesBnFkijvVlkI2DClYQl0TJE9Rg1fSmefwIXBAKvOEPGJw++OKzPKAckjw2SKE66jUNdoRPhiGCMqVWClDl4OBxGR3UPetzyUHDQOhPQbmDCh2x9EoYMANmXkFBAQxDTIL4sh0MuUuqOMyxxwBiyMYIIIA4VM8LnAlPHMhbCmUFkSvA91T1wSZ7ucLav0AEMSNIG6GCFJ4WaOoXQpEZnlAOeR4yRbxiKjUJSBdpDc8GCLCDYmJJObB0OjT1NRLm4NDPBo6l3Mp5wRcEyrtKDUYBQy6ByyvACMi+MyCYK4DMyFkmR353nQWCBV1QGwRBSLH45L7ijkeuRTcU0H0OtiENU2QKAA7BQJsCgAxGCBCXiMSy4N4FDNWBv1bq0vu7wwEM0SYbEDnQgaIGBpjWiNGBSLoigClhYgWo5Xgmkg/JCBYASNNTbIaYWo6EPkkT1w8vBBZSjU5Mm9DpyZMEt7TnM5Tk8+sBhncgw7drOxBNoSVqSmYqWkCAgAz+y+xMCQyy2H0PgGRnp0sywNyRNmizDmc1QUghgyEMkSY+ycPTjw1KTPDTk0ux6MR1km0k5W5IfXxRhUwdLFWIJjlQKyMc2ZBgPvATAiah3mhybwN0e1glgKddQwTMRUyq4G1OjhNly4pxZMNKL9crK0mCAYr/eWIL8EJCwPXsTIIP517Zk6oCgiPg9EJMwUlZoum41Kr64ip6QxbaEZPDBF/FCCo51RRZGpzWqxZUWTUeDQouZMUcE68y/+vP/1de4qtpoX1a1PpX3+hcE9kl5o13YpV1yy6VdecifEgM+NzR/gCEJmx8Ofe7ISbOT4T8WStXfXvT3y0l36t2f8aixoQDYhmUWt2A6JZ1Jr95BY1IBoQzaJ/qYHPZdvXrblKvmlAfI81Ro3hfiD6HAo+WKd6kFT9i32ftSOrdVjdjsyesNod5YX5Y7hqdHCFw/+B12xB7CKZiZTma21ItvsaJyXMbDbWVFRFONpGpZU2qRSMcFYrootGRSK5LOZA+EWRRnsgZmaGdc3cD4Q6dspscyC69TYWZ9R6dJGm2511ue2pFb7kpNwEoqIq4hd6EmV93XUgyIWo7IZHgMhqHMnx5xY0loeAcHUglHnh3YNA5AhKDERc5jeaIveOCLWmoipCdIBwxUjLJJF4Nj072skJNH0ymhOqcHHM7IqzsjKcMD9UTYLUOsBNgCwOBCEkaspYandkZsOB3UjqAtIzwvFQPoVhPhg9DMudMCwUsu4iHIlSp0MnDVxBegdzTQ2MCFglSh4S8cUl3gizM85gcmRraqoiRAew/ab9ozFocgQaVe5wumU7kgMvGL6FcB+8qlp4qgCsDJ5lJ3/2IAwPzwoTlAJZHB0R4D6U2h2Z2UAuU5jvhAWSOR7Kp7DMB6NwYbkTYouDNkb4gNvSlzodsqlerhjcUlND1gjWIoGSBzt+RUNDVDwCn+X+yNbUVEWo0txv0DhBj4FJIhFojHJHAuLDg4po+RbgIYBrQFwJJQOwg/SinmIsx8z3EJ5FlvroHLgaVruDSgvir2VuCJWdxBzA8VDvcW/UNrJtBXdCbBEdkQkIqgU8kdwK2NPLFTwiFpoa3I6L3tsaLQYaGuqL5rzMv8jW1FRFeGoy/ab9I35xAcIqdxggiGNQ8i2CS7yL5IBXIPSOkglwHHwOQmCBELUKo93hUwAPaFmEJAmUXeoKhBuz2oZVuDDciWybAxCWH+Gz5AS4GWNaIxaaGi6NkwxELxoaFggwOQwPpKIqwuoTpt+0fwBELxForHJHAuJ8Dt6qSFiKlMfUolOTsC50gkEDwPcQIHyXgFhqdyizAfyLXJbleGTmRWY+GIULy52Q67WrPqTkUqdDgFBGSlhqaggQZAmmJuQHCINOTegHIiwYHkhFVQRzXe437Z/MJFkod9DydRTpKGdUJFThomO6DBZbZWWAv8DDdASnmbkd5yDh0bpR2RO6ZFrtDmU2QAVD5aQAhHI8lE9hmQ9GD8NwJ9QW1RGJ4EicS50O2KWMFC3ZamrI1ESMkDMkVY5iM7gcvPDyWea8eMMDqaiKTJ+KftP+Ab8P/JJSuWN2fP7Xa1g8ni1yfJHtUNr2R7gTq7XwU9On++cO5Y7vAqJ2fJXtUNr2Z7gTa7Xww/Sn++cO5Y72runPWdOAaEA0IBoQDYgGRAOiAdGAaEA0IBoQ3wpE6+5/pY3db7jmvkb+bq2O77DxEx2jb1S6f6DUG+69uK5joUflhZkqXCjDY8nvsEEwfPbyqwI1JdB74hh9B8Vw8jZTNOwLbTk/xlxYuKvtevSV6+TNcg2IK9oiZf6yBXIuHFk/mbSeaaNY9MfRFWE8NEDBlZ71Mx0bv9K4zshB2PAdejbk3EXkFRsWpotlM4RpwZ0dJ1gARIDbFK2Imd8RTKm346x0s64D8rV4KIWNRclWUsJXgdCd3dh2H2Q/d6R/Z0DAg3sViLJSf2NEzPX0rwEhjRR2BG+uL6oWpkWEywsDJqiHbxWIihXuTiBmZ5Y21kq+CwjW4Fcf3zgkIMB1ABAHBkLVLg4rDAsNPnC8oZ1xNHyIw5jHi41GovyOvlDJoPvfcicmZ0/MvCnyKLKg/QwIhfr+OCuqlqFKJFl/hB07HP1ByjqjVwyfRLRE2GkUEDmlcxo1ha6btcBlZYMMxPmcgADXgWbfqVHnIBNyTFobS4aF6ljolu017QzPjtMQhMMxKhCDX/I7SpUM6Pord0K/KBAf8A/TGkGuSgeuHYBAJ94bZ4UdpVMucC2O4l2GpoeDIznItvyAXrEMjiR1MfB0E5z0AIhsYLrkFpRA0NpG9X7kqUm4DgGtDxjaRCgQ5YgawwIjwt/QzgBTgXA4XrxZQVBjye8gzkehkmFc9sdL9j0DiOmaPCIugbkZeUTcH2eFLb9oPziXSRHUXgGCOSH4+1EwONB+tII1aC6d06gpSjbILSiAoImXb6YCiOASEN4CMfjEvZgzLFzW0nCr2hkwuY/C4chrhAS/sPwO4nxYlYyCO+Es+MxztGsER0WZrRH3xlkZddFcAhF0REBnn/l7BITamLREHEaE19m/AoTEmRnSGuEViKhrRyKRmKcmL7GuoLWxZFikxdojsEtNz4LSPaBT46Ir9DFKfsdcJaPgTnjR4jBAmKcmKiMUQNwdZwVRZDIQQ2KnQGtDgPBOhEzOhsGRtURojWAghi7zS4KElUotAP1MnpqGxVOT8hj6iN8RoGZB7UJjrcwZFrJYX1hVw9W1M5hcBj6E8DaOzhX6GCW/Y6GSYbkTqsWB3xEJCHqSmubaM6au/Dvi/jgroEVi6Q5eF2toelD6UbQ1nKqOhGyjaolwnJYzK26cjylqClletuAIFUD8jjjT7wgAUUTGrB9hJb27mgd6FjndrCqr+hjp0fCB416NjtLSENynjuCv2OgfK+Pxyt13HCmy0MrZzwLxudbM46zc34qvA9FiqvyP2diAaEA0GxsQDYhmYwOiAdFsbI38F9nYgGhGfqeVj7RiPe/9pfyGXmtAfKYUdr6CS6BvXVlNOOZXU4H/XUSuXn23UlPz6G+8ickSEsGUDQ4FUupqH7ePULfWL3gY1h3vXZJlSHvruKzjiBjb/9AbX3Ykk/7xeujn9TOw65haKOoDaW+lg/y57OGVkOPY0L54Z1qk5HYs1TxKRkcNzdy5wdAJxCMwg8rqviyjAPmHgeiuAuENM8Onbchw/SBsgiuA0NAe3QKIMugH7Aq+lLdwQfzQCgS8zrkpAKJza/jOgJipedwGYj7+bFwWuXdmah9rxwNAmBgvVSCCxExJQHQzIMaBy18A0SXw1s4gVE6XgOhKIA4GiAMcJOIcmhpPoY0ieA4H1dFwqltho6Qs1TyY15CUM8CDQDp0PQDEQSOQSKnqKlItDUR46aH2sWSMjGqHKyKuzBU0VG3D8jDAzwAP4yDaGaKPwR7pi7JPYgkE+S8BhEZL4T44k1uYSu2rZ2AlsWAmB7HXz1gjmEtA7A3yGx3ZgxvOCJmEHfXMVoETUhQ4Bnb7sarELErKUs0DntrkB/bQ/cgqBjJEeQ+yaFXwFnHLxeCsHFiElZCWjBHlm8jNNxgOilXQcKK2USpp6Eb3AKLIoDoZmJo+mLMyWTPdNsQYIT8c9dSHp04EEFmvAM5V0ANqZzh2DKuUcJnyOY1A9R3DBzy5HQcY0bNz83jpxEkLPYmjVZWYRUlZqnkgpypn+KT7kYHQ2CMpxkOKZJG1NKZ77PKRPs8ZI1IeX2MjrswVNLQFloehcWGQEy5X0ccQIGSFjIccsMQdHKgVMiIcGCM+xX1BKcsz2RKoiHjJaYHwCoQKMnCskQitFXkOwohwWVViHiVlqeaRGAtjBkKiqNgR4UzeAgiZ50cOtaOfZ4yRHJUlEQLcR0VBQ0eT5WHItU7GjnahaHnoiODOjRMAOjWBeStAOESqG5dAzM8MPofvSIok1aemAgi550NgSgwN4QPPtUqWCm4eJWWp5mGmJq/skDQ1+S4DwXcYxmYCwkZYGT7Wo61Ip3tRztCIK3MFDZ2ELA/DTk3ctiHLMgAIrBFE/pj65ixABAtEunl8npr66hnS5PBeaDqiGcJrBLEgQBOUiQRkKY+4JOA1IFIaczXOENsKzFkAT6KMkrJU85CFKjMjRPejxzVRgcAiy6WmxTpraVDu6FejrYyIsgLuRI64MlfQULUNy8PIizW1jv9GBYLqoLgyTKDEBDsqLS7y0k+/I5JmB/cDLcP84OJqZwLrhFDnm8+P/QyWZ9+FqkR5PPrL+k/taSitXbMyVB48V6IjrrZYH1JD9UyY5arnvAsOa9aSk/DMrzhux3gJ1fPhaqmPveIID5bx6aO9a/pMKQ2IBkQD4rP1/b0iGxANiAZEA6IB0YBoQDQg/kNAfDcA31ve77w9nuzWa0B876GvtC6IzqyH1ZfIb2w09fh7gPBw4Nd1O/g967r95gjJurA4Y3Q86PMYqj7xGnOkT2eypdIzvlYXjnUNkpWGdGafGZwi5l2hX6TGJRB+9qlb/d5Zr31Kz82ry0V4X1PJuB8IkXc3Oh5Bdr9WWlD0hf1UAiFvd323CsS6BkmlIV1iGDhXyxqWqbGrAtHNBEm6mkCJK+gTKWfiNawBUW/A40Ak+QgFApSCOhBuAYS1VIFwDwIBMxPPQGOckMvCRQ17Dy5HBz/xiCrmqZ0rGQvK62A+A3+6jOA1lN9pYyuVdExMB2Vx9BLbBfuya7odHpoCXNcFjqHE1shMDlUSeX8/MJsjtXMUV08FCHZVRVij9J15/BW1xjlrKW3mlXgvyS0VfY75ck2DxGVnnsY44VA3OT4ER0RAzA8gTl6xWeo4YyxIRBM+7+Gl7irfWezHZz0L6HYMLKZgeRY13Y7j2GncFf8h2/WheOFNDBQvsVre3wf2SKOdyvcodTyOEfoYPLFEWJOn4zL+iktuZGsptDzEiRyznonGfLmmQeIyz+B4MfFHIngX0M+AIoWLcs7PUyUshZTEm8olookTngJ3vFt+/2BdAp+YDtlPDh6F6hEsdTs8N55SlN2hiheWyeFdIgN4hKkJEkHFTE2i42HXiF6syUvzPP6K2mktzT56sF+SnonL0WbWNEhc5hkEw5lQ3kWQrumsm88vUqNlLNiIJipDkoEovysQsECB6KPyKIJb0+3wUjc1HuwOVbxQJgdURBSIoQAixWIxOh4WiHCGNYlZuIi/onZaSzMQwn5JQIQ0ItY0SMqpyenU1LlMQumEGuVdVt0oU4kFOCdTJaYCf8pTk/1OSkXe6Fl4lVxJYS6iW9PtECB8Zneo4gV38aAqIphQsEYM3pkpd67jYRdrTBpGlm4Wf6VLXWotlfYPlvHFfEBP7JfrGiQu8ww0xgkv1vx8LfoZIxQpaFlW1Y0y9ehKxoJGNOHFmT9Ff6x8F+GdpGcB3Q5+THAlELW4LEdVBRF2hype8NR0VhUR6IbQXUuyV7Be+R6ljgfY3lN7IlgdnWHAz+OvCE+DF9psqUSBOSu7RPVMmElyQ4Ok+oi1zqwIq+m1H3TzkubfrZKG/YzQTis13a1lEYqH4XAjd67/Hl5Jl2y5l4ERbmiQfNvxnb+sEe1o/dyjQLg7gPisne5uIL7Slr8ExPeX1176NSAaEH+qsxoQT9JZDYgn6awGxJN0VgPiSTqrAfEkndWAeJLO+p+QSPlf6Kr/ISD/blO7K9+q1vULVkQKQD9KIbTdPMD5k86bPfsl82NWrS/LrB9h8e/VjLcPfs2sgg7R1+sIwgnpHyq6flTeH8XU5pDV0Qsg/CweSH47ml3/pg8pf3L+6BWFeMJVILKqxQprIWtUuMyDsCIMJvRGLPHtKvX6VGsGQp1QfgaE953Z+3bt3vbVuswd4uvXQbejNjqqQNSbl6ODTC6RYIFwDwDhql1WB8ItgJh9jpW0SokJCHahxbSfewGEc3cAcb0+t3r1GhBpRMDBp4wHkAaghIHtqTUgfFBmBFgchXx6LFUwolcZ9KTdMRr9izHpbwir4phTJHqJqmuQnxjRXGBf5y5jZoschBOSmRsaRWXKG7OyxuRAcsLNKOom91QvQPQSA0XVQrKGx9yG1MJC/YPcURcTZQZAoCWd3EBgdcBqVS+RflbHZtLXSFoqUMTAwdvBwyDMCHV92oACWQXDMBjSdu8hSfMgdZAwAS7Fa9CUzokuhmgJ+NBJ7IpBuBMfiY2B+C5mX7/PUVQmy2JW1vjgqWnwtiaOmBHBCVG1kUQ08HCZShtmNmgLsxJIFMDsxnwZEeJeRocTq8N7DQCh1jHjwWcqgAAhHI1iRMBEJ8y4I6KNmFgn4PZABUMd51C68KJugMglWTsD+hu90elIihwh63eQFgjiomQSy4dPwg7oeJmhsTVfo6iQPz0ra3wk6k6uqb9MLlLxgPOIuEA2gkXELuBZSGtnNmgLc2s+uBH0VzVDFAi0MAHBXBbPXI4+WZcMy9IF+ftsakLXGYpi1jDKQEAFQ82E0oVPMhOF/gW734fEqrDqHX3M+h2kqYa4KIk7EetASPyXFEUlyBoRhDNigQjOJQ5HBkJKjVgJPfMsWFRiYUMGQluTgZCVYjTKHGNeI0AaQIATVS9xYDwUI8LxsBssEHqOrA5GY0OnJmlGzCoYmcGQRXI0cknWzoBSk9LCCvUOZ9gWOi2ovIoFwluBFmVuaBQVWKaCDhTdChON1iRBmIIBYhgABOplohlEJeY2aAtza4SxwVOT8l0ECLRQgSDlEh1bWb2kP4NvwJwM0b7ohKOhz8bMv4gsWxV64SjgClGx4PPHmFUwMoNBeR1HUfBI+hdSVxDORFbeCD6xJSTuCVK6ZB/dxMrG0LPQ3QNzQ6OocCyUpKxBQl0d2641gaRJnY3Wa4izziXJr1E0PBY2aAuzEogwNlgYrDeLNXppaolMHbBLI82UwXxuPgl3V9kNt84/+sB3jeGwdiasPjx+9Zf1ssbb/Itwd+mr1v3pmB/hQSuu2Rcea+qdx7LG7+yj9q6pWdea+u+xrgHRgGjWNSAaEM261tQGRLOuNfV3W3dfkfNcjxvyNUmTrzX8s1f/0ZuhAfHF68LNHLe1IyicwPt7f6dJlteQTLQ79sOCZJBYIN42apGvK88XzewiOB33WDlru9ha7dAZPyW9hwo2wxWl2ZCyXQPC0Aj8PNVKN0CVopR4mDv+c5wR6063QCRb4hIIZYEUb1MX+fr1t63RB7iJOreUnfD13nWl0IV2qK9aZvDi/FpSeV03ByJWgeg+CQR2M18Hwn0JCHcTCPp7uAIEXFlfAaKrAlHmS71pgKheNwdCGQ0XOGOi0zglI8USOY4SocFqRwh3ImtoZCBy3BSE4mBNAc5rWAsFr4GnqlHZI+BhMKMEjI9xwQLhKy6VfAIKnyflDVb6EIsPvFkdO8LVyovEdFH74Jsuv8M5pDXT1eXZkp8C8p3Efsm9UFzXi8PoIByRTvo7MRo+iFsQlMng2CM7SHyDUjtCIqhoHARvRwR4F+xuDNnXPYjOBlyDJa+B7xWPOCqwZfAak6TKAuErPljfosx3HC0Qg4+sCjJICQCiM1Z+SAQLtU8Ntt+z/kYn47c8W/JTsEbAWdrlXiiu003v0EIYUlyYxGj4II4FDxMoRxAbIyQgrHZEL2obEsrgYoE4yjdiPSgQdK1lLZS8Bh4RKVQCWCHQ2Uj3WMkCESD6S5gBUY4I6g4vbRGtBK/kGlipQKh9CoT9HsSzzNbw1cXZGT8FcxF4HF3uheI69ALIOj1fLTwYZTQwihF3BEyQETHMtSMQH4RJIKOG3EgjQuVBHIDAYC1ZCyWvgbvNZyCC3LmZeFmyQHAFeE2cbwaElChAKAfLyxphrUwjQuyjllp7hb2hfJOYGCH57IyfwjQa5XFE7YXyOvQCRgTzPGLQmSXI1EScLsRNCTI1HUbv+/NcO0IiqOjwHHimCmnQq7JH8GmoG50NIVRlXgNfJTQ1L9wM28HdjAWCKz5Y36IEIi/m4EWR0gfnEiDIRqwRsJKB8Nk+ZSzm712ONsM2sZhEcbbkp+jVTDGL2gvldQobrREh5XOZ0RA9q1k4qFrQXEexRLrR+bl2BOKDeCcaGmdmYPCCdBTeBXMaPGIrYtaEzgYWa1aySLwG+g4dDbWF1IvyIkzsEcsCwRVsrbP59NEjl8hUSsoFLgb/jqCpUa2kMpQl0o05ZF/+rkJf3EMBV5dnS34KrpYAb0F7obwOvYB4Kmirxq2ZP07Nvplwfdd/0t39y7pb+f7PpV7uWgnhrhpCqfNxxcp5+5bxKO3VlWiVq0ctukpwDxy4m1x6HrjVxfcB8ZmraleEu2oId1s5b1+tvfnqx5gcy1qD+21He9f0u2ptQDQgGhANiN/SoQ2Ib+6SBkQDogHRgGhANCD+IhB/ErPvquvroP75G+/m1Q2IJwDiMXaD5LuxfynwTrcOkdBN7JKyrqDVu9tvb+bnj7FoTLjK77hH7DZcyeYRxUVaT1ulZ7X1KfIEZydxcHJNpFx9nQ+C7Y6jIQdYp7pf2G75BxpHZanVMQv4MYHgEQndxC4p67JAqFL28iZJZIPSsggnk0/2XOF3+Iz73GpnIsN0V4DwskfUF0QCra0rdEYUiJyrm0lBULq+evc+AdHdAYS7CcTs9orjgM3hNmRGWZcCAW+cr/eA+bQEwj0ChMudUrH6FhDuPiC4baxZsg5El4AQW4SPULAbMkujxsJwEskEPlywMTiaidGp6Dmlc+cz7VWexS4p6mI1jLPsS3Y5pkqtZl9YpkAgIsvhCr9DY8VMXzRKTITMehnHhTf1xhoDBLLt2NDbOVHVmNVWAkGdzNwMYamI1kniroDXcZSt0Yyy93N2Q2Zp6JRR8g860b/ABneOkSIBSFSnApodEGrAvW5ilxR1sazEgFzUVI2pUqvZzy1LU5PEeFnhd2isGOewXX/wKeDCLI4L6AVLBgjcx5PtnEvEHGa1ZSBwmzC3Q6kMOdSBcFfA6/AS/IFKlggQlt2QWRqyKM74B+AdyIhAjJSAK1SnoucVgYCYSoyz2CWx5HsocUCnyhyrZF6zn1uWgECMlzm/AzyQIlZM6JMeAICwcVzoCgAxZ4AklY/LEgitbT4iHKsXCBBOLQpJk4MeWJQ5ghHh4PjO7AbD0qiwMJTTIWsERBeCT5QV1spgxzgt1sUawboXZV0CxFACQWUsa/aFZcWIMKxBw+9wYmGOFcO8CQtEEccl5jAeMwaIQ6yWICMiz/K5tgUQAbOHBSIkS3mxHi0Qwkew7IbM0tAJouQfyBQV5RPFSAmIotJlsREqgIGIs9glZV2YmsiCMqZKrWZvLOtkBHQSkUWBqPE7NFaMTk1owzKOi5IyKwwQsE7oXwLCKxC2tm6uzuYViLLfvOGDqOYJPxvjucyyGzJLQ5/fS/6BRAyh6YjirpyRm/6qTgWlTuYFBcLGLinrwmLthOqZY6pUax4Nf4S1P8AI6cAuCWv8Do0Vo8He6O7v4zKOC/EpuE1LBogu1mdia4B9Mq/tOOb1IQMhnJJRlEtG5a6A19HlxVp/X4S7f5V2K5/zr5U5G2P+fVnXnBFxW+uiM7998nGd3/HPRdcefZQs47gs26QMkDq/5BabpMy11gdGxeSRyCC3j3vYDfO67uFP3FPOLX4H4mTdb3e4q/b7ct2b3t41/aZWNCAaEN/VhAZEA6IB0YBoQDQgGhANiAZEA+IbbP3bzaWUP2NDWcu1Ov+K8EoD4k/1SXrlxsyDoN8Cq/8+UGmofuSw8pnVwe9mxyCOopRX4kE77D4rlC2md7ec2o9FqUW0FhGDHyGXzu+RA8Xe5vJ9zkXvXNfMZ5bIdvqPj720e/O2zLn7Ree2++3+9fRgX2+vIeAzX6MzQTOC6GCL29vZN5XdCiuiACLImWhZHWVsdQuE1gZfQY6tQhEXSGNe/RaFtQaUHm+rnfAvRpfCCeRctM14TpPIog9TTXt0FeHx/r7dU3czHKkP6d/XPfXJ5m36z/TwpviLq7brQCwjqTjvrgDRGSBqw8iyIvr6iIgFmWAGRF8A0V0DYnYz29fNB/5/8Jmv0wX4zOwL7wPHiFmP2zLV9Ob22p0AYr8t+zAD8frr9ddm0cPb6wNAE0SAfTykUPLsBHEaM4X+0zgl5IlyPvEPSHHCYWMw8SBqrIgQzbXgUDhWxagCIdEVojI7tDbxJ49Qr4BfDkAgjkmOs9JLjBSdmuCNh2tnqi4qEMjTR4kAkGwXhRGXa5o69m132tOU8/b+/vqLgNidpv/c7vQ6/f1xosnIjogfU27K8Up5fuLvj9Pup6NvjnLT2V/Tf3Q1pVN+9aUibogIPpD7DiFOUpQVPk/OTwemjkf0BEwekTkUVVZENNeyo7JDvBTL6pj+RYoCocwOrY1innTgm7AnnLy9BEQ/Io5JjrMCW0W0guVGsOubZVsmIHSN0DydU21/DT0wJC4KaqKRME39NAz2OiLoP0qd0rYv9K/b7XWN2LiXKTfl4CuniY3+Uhp1OKYmOvt/03909f6F0qfi+7QMT0vZxTuNaMLuwYvGjWAeBO6vyMvnJQHhyIHuhUsxZ0X09loBQqJDZFbHbET0mdkhtU1lcPlEUiCehY4IDksjt4MCgTgsZkRk93/QADi0rV8WcRMdxQnBQa1HTdR1AoSMiNdf050+de5uOrP7xXC4zV4fYAAb5QEQu18KpQHCAQi6mhHe73gJEyDAmAguAyFRVSLilAhdUrqmBgRPxyUr4pyvzUCkNYJZHfM1IpyV2ZFrm3JFABHMGmGBIN9bCkQy1oCATImsEaMu86DZ1IAIskbsBQizRpzcaZqyTgxRBYjtdA2dncB6k5Gx3b1N4+atBAJji4BwZmpSPoZOTc4J+clFjVMiNDCatTmnTk3EeFhhRYTi2hIIYXVYIJjvFyyzQ9cInv+ELWWemjiOifI+lCeRBVI0Qov2f+Z16NSE5VxtB8tCgMAkuH8DENutW0xN08TCJ5ZAEECUx+1f+C8/au3pqWmbpya6Ok9Nslh7J3wMXqyPwlzgKCNB45SAtML8A84ZvUQTCcSDqLIizvnaPtICyEJcwbI6QLWkFJEdOiuzI9UGdQ7hYhS/IziOifI+NCIMPouCyKiLNXMnRrBFdLFm+4NTVZERrBFoa0y28u+IN1pcf25O+jsCizUt1JspfYLkZIF4PRFIOz5LeehKStvxIv162shi/bZ929LVsoifZo+vdChjITMXwuxXWvmDzjIclqyIYB4uQ3CVo1TKWF5/3y/r27yP5SPubS2NR35Zv/9apuZHXZ6Ctu5rR7hq3tohTyg2JT5Sq7Iq7gPi98SB+eorjt3Jfto9+qv7MfN+99Fe+jUgGhANiE92TQOiAdGAaED8vT5pQDxJnzQgnqRPGhBP0id/zKi/1qx/39GA+NMHveQ95c/wQ2lX4UXXTk7v+BMzGrbiY7+jdJeurgKxKAYF0z+b0702bx7Ka+vJRswatL3SmurLvXz9bnHOpGxs+l5L2/CfbaqAcpFn1sm7+U1x7YY/sf/WALEty16Ubi3QvAaIN+TeVoDYbu+2+aG8YFvkjtsWQGztTVn2+xyIfZG4L/vaGrRxt2/W7bwi4ircBGJPbqcrt0fRHAuEewSIu23ePJRXarwOxL4CxH721z0ABLku+BWt+zH9+4N4BZMjEK4Pnmx+0iXENwAL4cdJRwTBIS4Q5+RvAuKNXIy7k7IZwFaol/7jhHzk4WXmw5Tr/X338wezHDZ8/lUYEz9OVCvxJMie7f02P5RX2RZ0oHbUy6wLuHtOxO0Ag0PZHJpGf+f18DdMQtxSdS1RudQavgnZUcdMAzf9f0te1H3yxTpy5ZGHiV18LzTEdY3AiIDbkJ0eWwBBjAb6xL7erWUx1EvfbpPzcQ//7sv2/Z2ck/SJ7dpu2YW/3b7wbUSl0afX0702bx7Kq05+1EW1o17Otd06dZUSg4OvhdtU3adsc1kPf8NgkXx6FVpDI+IXcQ7QpVwV/Z1S9jKH7nnoojgqIk8eepUAMZUEIMhtyB3HntqCxbBSOnEeLBB7ADGlw2gqg75txce1l5tne7fNm4fyWiBQu9TLvA3YO32Sq3ZyPdnHn+W7rWdrHmiIhIZ0rZWBIH7BPpn0IgXs3W0gZiOCzyoQdD2AsCyG1dKdO82B2L1R+nQnvr3w3aMNJPhfCiDusXnzUF5lW8jo22q9qYvJ3un/4DSBzcE3Hj6z3WU90//1yey0x2yR4FMgXvYOUxP9++MkBWyFnYDJQw19uQLEls4qEG/MVOQpx7AY1ktPU9M2jQhO/8HzLZWxlQ7BvI2paXu3zZuH8irbgm4e1K4jcevwbb99Y+vAyVDb3pz+LevR2qk8MzVtixFBSzUtJDTXyeATyuCGU3Ux40H48/VUPtfosoNF/5U/KRDTAJ6xGNZLl8XrJ5gPPCJOnJdJP5S+Oe1OeYqgpTxNTXfYvHkob2JbSF2bE+plm35u2No3tg6cDNiGNPwt66HRvZPydmm5x1U8J/3kRwPLLcATlj554ueashMsS+H916O/rNENtvRrxzQitmrPMvu+8u22zffn3Zsn1GvG7m+c0Xo2N/PLA9W8ABpCt7vqsXMYEfeXDqvuB+KeUu/Nu+yRzwFxn01fPNq7pic5GhANiHY0IBoQ7WhANCDa0YBoQHxbCQ2g9/rnf0Pn/qfgb0CsH921M7svFW3ftuzYLcLEATlHDWOhdO94CyJtItVvtLvaXCxbRFV7mY7wUFOwmzo4n0TAi3Nr11j9Dv/+nq1dXFmGsViUc9cRnS/K8+bMnD9QOtk3Cw7GdgaE1ZnY8BZYdatvcYf5DEQX3Zgbih11XTKri11MkRJ0s3DRUm9UN5aiDdguTKXYrulyuJDZgfSuAIK/GyBgRVcBoqw/rOHsZqFH6kAE524Acev7vgBNgHhDvg2AoDEQoCAw3W/p22z7oeiH+6uN80vVkAUQVEp5jy6B6K4DIfbNrPgMEG4BRN7PGWZmAYidMClefxFjgbUhnGpH7JwyKhbn6ZPLTIQN787fuKxd4SDRH0XJPlKoF3yDIgapdrBw+llGBGtpXEZEeqENigf8FaUQbFokrRCNxnJJCiJ2RJh4KCknNvDyp5ijxnQupZ/f3yVODNuHGDEoAxFZDik2i8Z00a3Eh7Q9+LJitcaAUZtZFyRqvgQEsS2wC55oCvAIq2QBuTBfxLU3O7/dvyn7IwOxNdoVtINZg1zQGkEyDCrwnzaXB8SPoH48jthIT3fQwJvQB6iEBGgCiKA8Yjg45A2qIGLWiOgH0f9ATop0gDyDxnjh2CyDbNmnT2F4f7exURC3YfCk6TGwNgjKxKc8CrOtpHPwUbVaI0BAKwRxZuim1HwZCLf7RfwCzO3gdVggQP+Yn5+uSOwPOyKydgXWCIhCcECLoN80RknH+hoh6RNBWgKiDNAF4W4OiEUCHaYExDQRAQjkPKSxTqkoVcUselboCF4iq0hsFuoQVhC50BkSe7H2QXFEFQyovONFP8Fg1ntKtlJ0mY+61RedoCBawS2PPuUzQJDCxJ4pIdTR6mFSVoPwcGbnpyt4RCgTQdeIrF0BICDvoM9QqrqBGCVTw2NwdSAC35cwNaRoL5D38TI3y4hAedECEZwFAgJZwacgIaMKUwRdXwQItW9IY02EJShFFUT0qWIMxlb69lG1WvMHAYLriCHlYyCEW/AiU9OWO5rpL2AzKFUM7vfiPHc/ufELIPZZuwLCKtD/0aVb1IB4ShIgNLSNBUL0Mg6jNMlrtBcssV464ENkiJwKmfBxPme9DVyFiCoaT0WjxujURGdpasrWUs2qTdLJ9YcxiIARXc26IZiavGp+hOGjbrXMZVGB8JEj1Wk+xzwGp8RLWoI3zFTYSerrSXkV4CfMz++3ryf2K2/B4cDvCKtdQeJb1LSuAAK/I3pW7eCgYOcMBGl80NoCfQ3oCCISSqeL9chRTSRvn1RAdNoByKzg4Y6i2ISIKlDv0OgtpPqhUmGUg2OcJPsCx4hBGbg+4PozFDv6tFh3Jo5MrFt9xi+kyI8olIc+xZRv8QhaPphmmmD9vKtc/92/rMPsqc+5+3U31o61n4WlhWHFlvXz163+Qr5MnL2W608AUap4/B7djUeBeNTqr+T7YmPau6YnaUwD4kka04BoQHzZ9gbEk9jegHgS2xsQT2J7A+JJbG9APInt/9tGPLlFf8SysvBbiqi3FVO/v7ndX7dozbLvPKZ38Z1x7ENXPprXa9EVcTnMx35RWKiUj+SwOB8WpRwjW8IevYJVEVNJi9IDnw1XSl1veS60i+vZQgGED/0453ukW2KUSDSu1l579BUrPWlt26I5HMEaEKF+LyYv1PJu9U66qpPLbfQUjcEizpPgNVZ1zByQRY8El69Mbpd5pu72SPG5DfDudAuskwC9nCHLwtIybb/P9YaijbnsMh5NVwJRMhhEON3bpoUbk8IaEM4AURsRMyB8ECAm70IoWRWuGIvzUDw1IO4bEfnmM6UWmUogjheIzheWmU5eA8JdA0IZDMFlBgO7Rdin2ktEFPhXDetAmBE0ROEA0bgkS07DNFA53gkiryi7IsViYYZD5wwbg63iERGtTQfOt2BIUOkR53P8Fo2rghgrNM4Oo8ZMUZF2iMHz56hAWIYIrqSILWgTycGrZRLCIfE9MpvESySaVAM7fsQBlfpIGSQBkxzgAYPhMGYGA0ZEl4T8K6wDcRAG5WF4jcKw5DRMOQYAAdfkkAI5UQomFg2dwCQAhoOZgdHaRIwKv2BIcOkB5ymci3AtUmACsSYMiG/j1W54peH4zEBYhgiujEwo4LwYMl7XCLWsZJNMYEkoCGWPUIwMnzzo2lNDCo+gI0IYDINhMMigiog9wuEEiC8UDesAMVgQHyUgiolf4TR0YsSHOOvxja6gFDAcOq1HgOr52aRzhU3eAJYYEhpJCC56bo2Jq6KhOjgeBJ1l+3qnnA7JydcjX2aIAK4PCdujQPQX9cWrZSWbxEskGtRANR6dBUJ7CgySgAcS5zKDIfgiromumyM3d5xmwwgfeAYiMG8BPAwEEatzGoQ7FEsg6IoPb+5r1CMOeYoiJB2ZbOJ7Os4ZEp0L6QHDJ5ZFkLgqGuQDIwLMEWZ0jNpyypmBtgyRoQoEsz2c7a2STeI1Eo3W4MoRoT2FWEvUdwpEhcGAipwMYi6EolN5wzpQ47zwMLzGJVlyGjA1uUjcCo1yorFYEMfF5YBTcu+iuXTHZZs4cleYMySodC9AebTGlzFTUCpPeEMCSzkdA9qgJFDLEDmMsLHTaTiAkVGyU+ZsEi+RaGTyGySKUeKUaB9x9DHvY56aKgwGhEVzHssaR0jkqFyWdeAlMonwMEaNS7LkNBzB0gjUxcdR2RVYQqnuTpYvXH+MvSyJGQgzSv2cIUGlBwHKozUmropGW0EeRGTRxZpznaWFUUaEYYgEBxspBXnByCjZKXM2iZdINLJYn9FeadvYpZ4KaHOmY+qPlPXHUjd7LLzNTviOY2lRqNhg47FcP64bnX7X+NtXfM8v6/CVwnHxb2EdPAjE4zaEu3JZhsgTA/Enj/bSrwHRgHhuixoQDYgGRAOiAdGAaEA8uUUNiGbZf8XMP2dTnUL0PxCB6D8DhCpg9AtXbd6AWbsMf2qMBbzHrTMc9KjX6JxuHZ3X1T9azqJ7OtoKf82qwjtfplwvPxTZuCaXZS9y/VaHpNYUUcDoFtWpqsUsVfgnwnuoMBbg2dAqS/ZCMrlao2PZkEXvpDrUZdPdLmfWx9PNwa7eWkf42Z/gbqtvlEBYEgDV1FeA6J27fnuqAsayOXSmW7t1jPUrQAjDwVdvqnqN14DI371p9mo5CyAOrsa7WAPCPQSEK4A4uIPL+iMKxJQW6vXbEcFuDmhMZE4CncFGWOU0ZI4D/aXvNcbCBMSQGQ4le4EcKPm6eY3syT6jlMsIxQvR6ZhKmFK4lKMwQci2ejlZdUMVNWhqsLyLyU0UlO9xBKvjfI/6RskCQV3ETBHWSDRTk+iP5KnJ6pDkFsPFdRhFAYNdmANcj4OwL3j1kFsBzIgpn7jWqav9CmNhGoZnw3Ao2AvBM2/D1WuE2xNOyQ8PxQtshu+YesB18yZ5eHzXyoG6hk9MDe8UiKQDQnvjhfMhrtPhLvWNggXywS0mS4Q1YoBQ/ZEMhNUhyS0Gj8NnhYhOtDHAPPhIW8eJteCyl1eB8DpfLxkLpaJFyV4IUv1ajSq2QEBA8UIVNRSIHvodXpgt1XJ4K/pFFTosEElnYzooRy91oJbb6hslC+SDW6wWgAuiQGT9EQuE1flAi8HjyPMinPpJt+LDPDBl6YTMcchALBkLpaJFyV6YA7GoMWYgoHihnI8usSlqQMzKGYXR4eZAqFV9hACFUCOkltvqGyULRBU/hCkijN3OcE8sEDMdEmkxeBwlEEOqTNgXcEjSoE0jQrUthgTEgrEwVW4UN0r2QvDE27hSY7RTk0wDdmpizkfnVFGjXg7UNXy6hbzXOTrpgNCYGLxMajo13VLfmLNAPhIHRPksXQJC9Ud0iupKHZLUYvA4EhC8BDLDAboVYF/g+Z2WMVW2UI4D8RRkalowFqY1ImaGQ8leoKUJQKzUGLBY4zsrXvAySnVEz6WcuxFMEF2sl+WAteGdMjW6abE+0sNHsorZG2dwPrq0WN9S35izQKKcOQprhLggVNPR6I/0kf6jVKtDklsMHsfNH0Jh/v0OFYw/9Sv2kR0Rc5vq7Qh3pNyyaf7Luly0v+24RwXj3/CKo96OcEfKYzW1d01/zaYGRAPi7zW6AfEkjW5APEmjGxBP0ugGxJM0ugHxJI1uQDxJoxsQ/5Ju+Uw9n+26+XX/CsrNPUZ2lU+/o56nAiLME+z2Jdag16Of8SlsBJR5ob3sltNy/rn8c8F7Wtqn3Lll9JKCrRErn9zcc3xFa8PLKzdx2ef3S+ygove5F7z9/OdCb3DhljpG9RzQ37wVvdIv/C92v4UCAHYyu7wX+4tApGAfBaumm6lbeF/tAe4+fWuv5eQdnrRzv3c2eomvll7XxSi/dVWAOgGid6owktkf6scI4q/oUhvJx8Z8C+Zf9Gnb8KJTEsVAfCsFEORk7kSvo3fd6j2+bNuDQKzfnzMgSi0Pn/c8k5bFwVntD1/t5loN3co3Xx0RuZayji4D4TIQBwbi4MC/OFSA6FI0FlVm0M8WiOA70es4VIHoTEyX1Kvkzs+6E6rMQYNO5Mb1buEcnapbiOS5dyVfIitSdMkBSSyFORA0eG30Emhd9Kl0mUSEMwK7+sSUgL0XbI51mGKOBXcD6h/sIBVGBTuR3IUVMGS8LoDoGIjOSfwXUVVQVgg7oCYnj3I96DM5hPDZrA0CBLR1bAkH6R12Fp2h8EH7v+m78Cp0s7YTZQ4yO/ocpyTHIhF1i6Dn9MxckQJ7r7P4wpFJBnaNsNFLmD5hSpdRFDozMl1iSsDeD7nChawDorZgiz11piqMYGr6YM4FecumVSFi1ze7/qdvx3EOBARfdHO8uoWV64H26GcDRAgmxlhRAl8ptySoBJ48tjIiEH0EnAdV5iCz1aeKOCU9MxU63csfwMlQlz00KKwiBWZmGRF5apIpA+ct10P5ICi9AoSjmChTyVEJAcShAIMItauHOqt/UGeqwogCIdNNPOjEyWvEwdkRoV5mGRGIuSI1WK4HrPJSlwIB5RpuY5QRAT6JcFAkGJVwOoIorThxt5vlZw6ExCkZBx+cdtU0lEYLRHBzRQrm7KEkyVsDInM9fOIdwRvNN0W0QEAXJEUnkk6VUg0QwVkglLthRwSfn1p1SECgjXUgHJ4aR+38zPWAVXMg0BLVTcglBOGgBNM2A0R/RvQRLx0AZQ6aaMC30DglYDSke9bpcLXQWUWK/NRELIUMBNUCIAo1izTwdR3BKgPOiMQuGXI0FAFi6LLwjre0n45L085ELQACawR3gAvn9NQULBC+ACJPLKhPuR7SHv7cGwCD80K2lAW9mNzylR1aHVQJxCP6CHMTnCpzsKJGsHFKwGg4jqpuYRdrqF2UihT5d0TnzGLNtXC0odGqWXSj8kFUO4O6P3FGnPAuxsTWGD1zKPiKS9YBUVuwsBJ3QmvBchspUt2IO1l/R3SpjbRS0DUAQpQyztrWThZr5XoUny1f49JFjah0LErwnFsWa26baIdgsb7yGLv6kPuVmCbh5q/OIPJuWkv4VD117kS48fR9/ZexToT62bZpTrK8ZllX9CCXdH90EtuEr8U0uQVE+g38pVrcbSDco0Csl/DoK47fFRXmW4H4m/W0l34NiAZEA6IB0YBoQDQgGhANiAZEA+JfC8S/A9FnsO4399TvKL57KFd3Rwn/E0AgFAFYCMq0oNdjx+jMa7LM3wjyp4wPouclnvbNQ4TS/UrunObVyvkefuzl6/6ht6r/XPC2lf4SdyTyu1ZiknDOqj211ApLhbxu0YsN4HvQm9ncT3iLXT8SJyZcvSNRfEg+1+A1oonzoj2cxBD8XDIhlne07A8397l91bnUG+nmJ9YOAYLcRCV1QHwRITj1WqiCBwVMCGknalZR9sVIq6VWWCpRVD3QU/BA+MQVEc/LitmZihFvtLGbsRA0ognHB/IFEO4GEMtG3QNEuB+ILqwCIQF0MhDjoECoGPsS9XlqVyO8wMkqG3kzEIkrEqxIykNAgEegjAn2nomuCrEQNKIJe4ppt/6Z3BzkWvESGUXjp3RCF1BSFjbBHiVWiY1TkpkeWhZZ0Jkp6CBRSGxslBTB5Qz6gWP2kGpjgMSwDsTkbRQgxNsXDkbVw6lGQZFK7hovFmcWifgSInrqwJO484krEoUXEsi5tuS2ZFeuaJuMUOQnLQ4vkRWCughVV4VZCCZuyJF26w/YsY+dyN7ET0n0MRmYR5b58NK1Nk5JZnqgLFL48L4rpjXqlOPIfIlEU/PQ6x/EQxyozCBxT7xTZXwXjnEJxIc/RjsiuOKk6qEjokwFSwMWp1gTqjwCH1wQ/kaw0WiE+yET+azFskYgSIMDZ0ZURDReQ9A1glRplIWgTAse+hx2QJUjvHisNX6Kepv7SxoRF2I+zIAomB5alsbZyhMaKVQoX6IX3gNHcLmQW1K4EgE+cEpBdLWDK0bExQJRrBEckqNU9ainevHEs77OJbASk0ZwUeYS/R1MPzmvQPQLbkvmiyRtjxQGSIO+RAUiy3n4xLQITnVUelGOsEAEWSNUmULWDu9G7WAbpyQzPbSsDERI646PypcQFoXz0u1uhJWibeFRD0/RsQBifbHmLreqHjo1LbU+FAiyIpDKR9QILmQDgPCJKxISEBqPomxx4sREQ7wYCiDAKqCZL8t5hMSBiDoieNHTiCM62YC1IYy5AfOw6lzk0FF+wfTQsjIQMYFIQDBfohBAmcoc8CgR+EFSJwzvRV+D+Rjy1DTUgFBtGjAqihExS1WNmXJqonby6oSeEluKfsKIcFAxmbVY+CIJiAFUDQaiP2eVjZ6flvB07JjMmCs4RizVfYo4wjxOZV0EFaA6jghnRHk7UZmwcUoy00PLIlUMUCtjWugxy0NRA4u1FwWNfgRXwsliDbUNwErnYDX0QgCE/o5gVkZES8CoOBrG+jwVizUsNpRPiq9CUmPcU/jFVfaTqoNAxWTeYkzkxHHhqekc5JFXnp3+uShh6tbvxXv4G+HOq26VFVbS79G20Egr84gr99PkLUtjGbflVk/dz3OZ5VRWwS0gPsc+qF91q6yweub5X3Hc308rOdtLv+8B4tmL/2YrGxANiAZEA6IB0YBYs7IB0YBoQDQgGhD/wp76V/B6fr+NT9ALnzXhcxoc3R0p99vYPVj7egkP98L8DVW4mnF+tq82cs4CKa6shJXo8T2mhHjTzHxEfWNDwUemeuP86kJFxKuN4to1FqaaV2rXPX21NvSLErQGZYP0N7o3IZjU8xeo2JAZYdairgrEnAWyDoTP96CGzCkydLeByPmDEw/avIVdkdkyVhZAFKWWtfscVkTZGn5NSSTX4L2zPRVX769SWsRXIPPVEeFXh/GSBVJcGUogkg11pB4AQhyPjwFhLFztImNrt6yy6MUKEK4GBHtNtCCJ7BERReQokuqqrsF/R+FjiMJFijMCbkIEJ4GcHxprBDyLOQtEGReoT3JLrJJettmWnA84WRCx5CBC6jkGCdgPYEPAAeMk2sTkGeNyEkNFVUTUwjO2F6tuRrZQFUn0QO0XxGk564Zm4aucRTck1pVEAITziCwAO8Dv6NjuiH3tUaO4IKIDd+cgXANlZgxw8AVsMCd/F/yrmV3hk9ZLVHegVykg8k66aKKYCOPiQ4T+vQQEGISe1blMAOsSD4iqIssG8e7mGCTBRHrBTU4aG6yvcQYQiaGiTlKU4tWFSfyLfrQWDuI4VSkW1P6BOC2Dqo90UAYZoBvSVZVEUALXcCYf4eCTEzXwVDX1GNcZhToikT2iMgtUQwDudP4ejpcgQ1I9zcqu0EmFupe+JcUMo0WhE3Av28w1J6KlIFZJx+yPXrs/AdGLWodGNeEmSgwSqzQA1ohjX3Be8rM/HkCAA4JyAAR0MxJPRZQ87GwEvYIPrzFX0A/gk3RCOKgriehK6byqI/QuAcH9rg8R4i39AD1qBgSVJiOEeRElEMqusEAE4VmAdWG0KHQCHvlKUFuc5g6JN9ElvobR4BjRFTwikv4FYpDYACM5css1IHgsj8FlIEr+RViE3stAWNELZY9ANySsKIkACO8yEG4UfkdM3BCSoRgBxKCKLTpdZGbGYRQghCfR5cYLu8KnK0m5wyfFDOhtBG5GZjfgP6ovOpubeRMDT3DOanBAAcOz/gXHNhlAUkEMErAfDBADBHEYqxIIJYYNGiEFbVzyL6zmGnNRfAJCpia9IcMAi6mqmpIIblBlm/islkYDhoAYzmdhlHAbHSJ7KHcPXANlZrCwzQjhp26EwoXoXQi7ouPFmlkPQfQ8EBFFWCAWCGVcUH3R5dxU6xHsj5HzJQ0OKGAwFxAqHmeockgMEp8jvUCrg1WhaNGNRwFCGSpQEZm+OV2sO16s5/wL1QFx8jyD2qPnOC1psUZQNrKY21NVEgGUXENMU5PyO4JHALboCq7L6hFkxr6Wp1u58vM/7rsKAyKkcIMm7RN6IGH2cHl/3tVcfj1lRQ3EX++7VVPsnHf/8ZW3LEteQ+0x/zN8kkeA+KytNqVWwx9W4Wgv/Z6kFxoQDYgGxJOZ0IB4EhMaEE9iQgPiSUxoQDyJCQ2IJzHhvwLEv0Jf5Zu76ynb3ID4o4e4YtziHchFNX2vxi0pj5X3cL0tPVCpEC3Xc1bKgN6ban2lEkbvZl4XV7r8Cyt92mzl1dvmckCAkDxwQVU1dFMz4qF0qfTKmyF/rTPDslOW9vmKxXl/s75r13Td3W/5HeuhO6BB381ydG5+PbuTQja5U26IZoiGyuBnlkYCwtvAJhUCBM5k7kW6O6Q1rMKtXIikqkEOB9HVCL0BonJvedtvBQ+rAoQ3yslz6woJi5wUZl2okRDuA8JVgcgmJB4Db7+FZkUyZg0Idw2IbvZStgAi63SkTnehDoTqj8hWXZ/ioGQFktURsZR0uQ8ItwRCqB0RAZDAmGAeAvnYogIBFsdlDDyowZdwwkXIXAfmQ6TYJnAQ9XMgA/MvompRdMwN6TP3IaI+uDNVCSOIyIJjpomwJtifA2cOIqVovRfelq6fgvBLLG0spTlV1VAgXNqNLcoaPseL6ZOCCLWXXGFZt0M5LpQK51CpVaIMDp6SzrhK24ne5a4j2Mj7BMYEyxeQ43s0TtTp74fcSul+Yi5C5joACPHP+rzB3AJBvAoCAhoY6sJUhkYaEdADyEoYrNZB5ZAfHSwTdU3SRIe4EOoW/VDFDP5EXrMhBfCQlWhMjI2oY1+ACFaxQJkd0AURuQbZyE+DM+t2JEdyCteAFiojJiRhCCduYb7KZ094GhHcr5mHEBPrh1kLFog+DShwEdTFboEgNkdwNSBQKpzxiNGSGRppRAjTIu37Dz51DFJ7mcRp6e8v8LvjEYCu8MK0oE8H5m2gsQqEpjmnqhpWpSqF23GZ2UHMFYxvxJ/h+7vQ7cCNcOSSe7kyM2KUwYHx2DnE9EI7+3KNyECANGaBwPqhQDiZmrSbFAhdI4RtN9aAmK4zQIQiMEgGQrlHJRCYKjAiOEoLIrLEoCPCKRBBmBbMvoiB78pgZmVNU6qwdwqETxoeJbNjgArIyCncXlAY5kBQyZPtowWCe18ZHAIERajRdrKWSPHUpAXLYh3SUxNYHB8Q0jESU+AiKNcBdDKfBnA5NQmNKwSw1nyYTU1yHkAMkE+oAjEdiO5Ck3hgFhkipWhMuQ8fBUz6RDwJyh+x2qErJA0piIIiT02ygLsZs4N0QczUBCCMbkeamkg4RmPRGEaMMjgQtYbjGo3aToSBSs+6iTEBHsJFn6kl+gktJ56UKvKztXIRlOvA7ITYpSUN3Amw3iSOSGRuXfRmmQKzAdFKwL9gtoiMNFHCgFoHP8V0ky3MxojUVeCUIFIK18EPEBG0yHNk4g6iwURYnBbr4CQOjJNfTLGTT9DwKJkdIUdGOfcjeI9Wt0M5Lpzbq+5GZsQogwNRa/iq1M5+XIlwGUSuzd111EL0We0K/VxjS7vZbw4ToyT/JKsqYczrDRVb5mfrn8Jdv6zDA32wzi+xrKdwI6/TO/7vvuK4znUID3ZUuJr2dSDutd2eCXe084ZR/7WjvfRrQDxmXgPiScxrQDyJeQ2IJzGvAfEk5jUgnsS8BsSTmNeAeCoz/5aRz9k5f8GqBsRftirIm8oMBL03Nd7gpE1ROYw+Rb/yqqfYwIkt2ss8TlU9iPmxtk1M/IupPB/uaV9f1INdd0VQ6WqUiWwVv5ser9IMnNHPcDU2TO/WzvCR9bxLINgtmeJDZG2KCgI+s0G65BdT/Qg4LbW7NCZB5d1shNuGXD/kNpy/502v8CP2k3aSWgJRhh2pxjKKamMNiDWr4FdZA6IUG+kWJZUqJt31EbEEIscxwf7hTpq2iJtiNuzNgEjNuQ8Ije0iUUsqoAeEm3G5PHzqV4BwV4AYTIbhChCJ+WH4HkMViFLq5QoQ6vhIOhpnYijQtlflRZg1wqvPTtwcLGOuoeOTOscInoKyNDrXuUPS82BlD4cIKvkK8EYQt+UwOXagsdEJx4J278OjNY8AA2WOydMV4Utn20e5kWKuVZkllqeiEWCSGgeVntkd+fOKVS4DwVcf/DKCCp9bsDbIzXwcU0qAqLy3Lr3A6hXMGEq8CAMEhwVQFz6cm7w7O2+W18ghg2xZF66FKnc4B5YEeA+DpIrnVoAYfGTXIeeJGttFuRJlBBhEZFAgUG6iKcRcq0+6AZmn0pkoKQpEOGc9jvR5xSoX9OYQH/c5LCKoiFdxxtpwYpF4rcEe0xglrIyRkyO0JlRVw6W5GkD0SprJzkeJeKKRQ9AhqlDhXQmExsU6ctQV4XBoJCNmYaB+cCycS9pPiwgwUxlOVTw6ZyV5elOramFYngrTJIRNkYAYsh5H+rxiVRfTzeE0FsQ8gooTP3vJ2lAg0MOkLNI53I2jxCuBtoTXeEHgRWQgQA3hwThmINyoQEBXI7gMhNAH4hIIGBhQktMoRbnJzAqKKsfGtRVAqF4HjQgXw3kJBKWVQKiyh/JUwMsgUaG8WGc9Dv28ZpVPtIHM95hHUHEptotlbSgDBswTj5hIxCNItA+vwWlo4hnkzp2wd7I8OQ4AhalJeBc+CY5gilEOh3TTUADhuzkQXuWC1GdNTT5TFw4H8PVU1UPon2UEGOElR9B8BAiPTfoh5Fo1nknJU0H9JCqEeT/rhdjPa1ZlmzLfYx5BxaVesKwNeToR5okHn5J4BMJmGHXxOo7TlHGGjBZVCX4FGA5OFutusVhDW0M5HMcREUOYxxGycgeIisJ+9ZI6KnlmKucsQZfOnMGpqkcXZUkrIsAIVyIggsmRbVfVPasXovFMLE/lqCRKj98RIIXh4cV+XrMq26RAaD/mCCrCj5mxNnikaMqohNbZ8+/8Z4kdEW7xe6Mr/uqxFs2E78LgrhxFpET5t/YbViPALGuw15al2ryWIxL88prwKauuH2HRv7OuKHkES1bB977iuF/ZI7hr9X5N0cJe/VhJ1626feWSx3H30d41PYlVDYgGxF+ttwHx95vcgHiSJjcgnqTJDYgnaXID4kma3IB4kiY/g1XPSih5Hrv+kCUNiL9mibytNFFGlDGRuAXB5dAS9k/tsO7hGXshMT7yxr3lscLugF39WHezJxWCRWiYqwZn5shMFBzf5mkVSzgp+vXmpHRve2Len1Ak8TlWSuJqlNIPMZ2v8BFcJeaKAlHmToyPYvP5fewO2BV8V0UdPrZuKc8QZ9FPFmc1tEbq9FABQr5VLBEgOucr4g/5b1coeFgg7PZqNwdCIqEYIOYIdutDoTIiFtoa+BB7V7ldq0BYvYx1INwVINy9QFwZERVLeBxG764AYS1YAuEsEOycOEM7AuwENEBdFp3oTGQ+AgtHXK7GXDkv2Qte9CnA8egKnsV1dofVy8hh7w+jbBw+o4u09szYUBdosnt5NmpHaFusz2CWZi0ZMn8jUlQKKX2FxyGWQY8ja4/kHnKiki8KE8rVUCBUOgibuTMfQaeVMuaKbvrmyCXDkr1ANfnE8egKnsV1doeyJnRmViereK0HjYqC2i1jQ0kBYvfybAJC23I0nMFZmrXknPkbHzw1DTIH1HgcGvABMhDkeC37U0YEvMjQ27BqFKrB0SUFe+UjZJWXWsyV/pJ321v2ghdg4RXvCp7FLXZH1suAzgfiuXAQgYsKpHRJBSQzNpQUIHYvzyYgtC0IoVa2T9KMJc7wNz5yzJRLncfRFRFViLdR9mcBRJBngqxGoRocdB/kC8FHwNS0EnPFyB5Y9kIJBLgX97I7CtYE2BdKY+H7CnerqoA4YWzoGqGWLM/mOFhDBYgyzVriDH8jA7HG4+iKiCoUhWXZnwqEKEyILoWzGhzcxKFUkdA5tBpzRWR/5uyFBMQgQIR72R0lawKMIwmS5JiHoUAMnfCLZOKK3UL9ojwr6hwxtwWLNFy6ZZq1BI8zGFDQI5F4X1UeRzE1ITDOsj990onwTrkaAEI1OGiOlGgmwkdI3KF6zJUzOmfOXvASkUQ4HsHyLG6wOwrWhERtmcoQZRCJJSc00HNmbIBxkS1ZnhWCXMhtcTKN2PbpvW4siYa/EYg7wled6zwOjUVz1Igzs/5MuoMuPWrdI4Iw/6TMDDAj5hwOyePXuR232R3rrAkubaHsVzA2zKeuYkGotiVU0q5bcu+hskK1/jTHPdXMi7jOzJA84/Uyb7E7rtp1Z5CbcMfZ0o5a2leB6Md5X3waiL9xtJd+DYgGRAOiAdGAaEA8XYMbEA2IBkQD4gkb/D8OxPcb9V8TV6m3557Ua99+i1GP52lAmIP2n4X0Td9Jrh7e6GS4Lq7rZKQ88soNqhlWO+PaUSpmcMXFdca7TG/Fw9UcbrZXqKgpx2BBnn7xTtQHUuxgFofDe+DsVEUq2C/zVLwy99T12+k/PvYCxOatAkSQ9qRdcfEaEFkno3c+rOtkaJ4+6ZBTNcF/SjGj6GZ/FYhEf0hpKeT9smz7rRBdty3icO5MHuiTLzF3Oe9Xr6fKtvip6/cAgvB4f9/up097hmMNCHc3EOT0O7jg13UyNA/ilKhqRvicYsYDQNRGxDoQZkOmvPXuFjInGQht8VB0+UHu/XlqFxIQb24PIDYCxH6rwzOpQygQzJ5wyuLQOCKH8ZC4E+wIOqv/1iVfc10nQ/PIhvZYssseVMzgY8GTcOBypKgs4JEkRRBJY6vCpR6DpbcxWOCuMnFXtEWihMB0CG5xyiGpsZYq88V0S053/tvutN+/ntzb+/vrLwJid5r+c0YdQtcI1Z2Re0L8z+AziAsTLIToRCdDgajrZGgeC0RejcJjihmyPFmeRLrxhxSVxWnMk87cnbDq4G/HYAkqz5DirmiLBIig837W7kAq9JvmqSEBQSNhv93TMNjriKD/Ns6oQ/CAc4iTkskDxHrAeGGtDeZOCAshqk5GAqKqk6F5ujQ12RHxoGKGTBIznoTLzJEEhEMHhDkQQz0GizMxWBSIHHelBIJbE7P3HIolnOJrqcGMiK0CISPi9dfO7WiNyOoQdP8G51xmcTiwDfjuHcBKAHciBul66GTMgSh1MjSParjMpqbHFDMEiJInkVa4GRB9tEDAqulurcZgcTYGiyqRpLgr2iKZBRzoQFa7A6m6WJepeJbCGrEXIMwacXKnjTPqEKxMg4E/JCC8xhEBn0G4E1FJXdDJ0FmwrpOheVT0xKdn0ccVM+C0LHkSEiNlwNSkwWO4BOUTIQ1yRSsxWDobg0WmQo270qUWgekXpGyr3SGpvpbq8mK9fwMQ262bT01JHYJVOC6sEgEFDeJZjBpHJCS1Di/RSrwIlhwvR4m8UtfJ0DzHxMDQ5/nHFTN6GRGWJ9HrUsyLtXzjEoQXktKOYIZUY7DIYs0xWHp5fNC4K5QHLSLFDnoKJLUSdLlqdyBVf12UqfZ3xJubluafm5P+jsBiPS3eN2J65KFfSevu0sm4NzjGPYoZ4WYpoXggt2nzdgZT6/VYLMVKU23Pfak3flnfp0URqqn36GR8/hXH5xUzatfcxZ1Yabe9tr1repKjAdGA+FonNyDu+fZbjHo8TwPitxj1eJ4GxG8x6vE8DYjfYtTjeRoQv8Wox/M0IH6LUY/naUD84U7706Bcq+8ztvwx+xsQT2H/7hdVRO9lp7eB6kt1m9P3lE7l0qvf7X5nSrxW+m61qPVr9pKD6tGOe/9lS9vxJ27r5MPfna6XvitSqLwdatnn+qRF2/3WlLHNn8DUeH1LHZHL3i7qpX9f91TR5m36zynbYPIpbWcsA+1C82l7FQLkpHInH9X0rxq8VvqmUsOjQFA9Tt75b2albrStWwdfQFn+VnNv9UwBxAa1vOEEgOAWVYDgftyi5/d77dR9btXWFD8H4vXX6y+b5Xon3+yZdFC55B58/bU3NW9vAvi5EUH13ARiz72zWvoDQFDq3gCxNyNC0unfrSKiFu1T8eSU2J1+sGvCjojdT6Tu2Mu6cz8mdwblFtYBMw/2PCSnnI6u/jHlT+conb+/bad/+Wo7IujKWulaMp0lQ3eaTr7dXOrPWm0oU1J/6oggOLgcckfK3wTEG7kuuexkAf3lMhz6BDagN3an9/epZM61oSumHFMu4mK4HZXFfUPp7o2u4Jb8pHSyi86+8rm9tBScDtQzdQMB9UL/ut1e14iN27/sOXUzdTIN3xeCnXLv4dyjtD3oCHtMTVPu7T79R3lfpmH5Nv2Lq/MaQf9z1dJTyXStMB4oHfcbJoAp70uttj17IF/o25RD1wiMCHFH0l25BRDU1g13M5WdLaDSX7awCSNiuvYFZe+37+/U2r20iebVF9zkPM5gyxYteJGWvCA/7KK+3jj2W4sl6OUJCrond7/2qHSvTwWU4ZVTwTvQLpkmrQlPZR7s93w3CBCUm1qPs7QUTffAr//b5qtdcg9Od2+l9F0umTs3p9O9Q+cc24qOL2ujnK+/tmz3Lk1+OiISENP1AILayhM5pb/l9tmbAUBwGpe9cwoEzu+4vrRk89hGPtixdyhFS6X8fA1bTpZsuZdg7IkbVAFi71JXMarT4CPkiYfgwDzYvpEBu7c0InAVn6WS6S5QIHZvGYgffPcuS3cnLTkDgXS+d+ic0xEwr20q7W3vJG2bgZiNCIZdgeCr+XtuH+V8KYDY8zme9GlqehPr3l62uBkwNeFaasGW2wHbtB8xIvbJZqSiTRh5jofSC9MKSiBeMMwYtZ8ocD41bfn5Zy/PPj8E0jxZTPPiy8+fcsc7MyJ+TkC81ErPd2MaEQ5T01bS2K6XWm1kjaS9UI4qEFuCXYF4IwYkl11Y8PLjJEBs09QkI5DAk4nzjVq33epCvOGytLPfzNT05mSN2HN++i714JqpJbwunDbTYjRdcrJAvNICReZMCwkN31deasrF+vVEMyyWe7qa7oXZ8jl1Mt37erUCgeWvVrqWTPWwFSetIS3W03W0rC5rI2u2YEX8pBy5PizWr6jh5ysWYQECZRft+7nnVPQJ28ALL9U3jQh5uKFnH2ZjyCPP7u1N7KF8bw7XUD++ySh4faP89B1tIUveuJcqv6Xe3/HjZ/ZIuM3/rp1ND47LR0mTS4DePl76tbLXjvdfj/yyzjXtV62YRsRKrs1VS/ZX7N3fYxwO3M27ld/Amn4dCDsiPlP6Z4B47BVHrmm/agWNiMcs+FYgvu9o75qepKIGRAOiAfFXGtKAeJKGNCCepCENiCdpSAPiSRrSgHiShvzrgPh/ymNCB/9B0CcAAAAASUVORK5CYII=","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":13916,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"},{"data":"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","mimeType":"image/png","cols":196,"rows":71,"chars":7749,"font":"8x13","variant":"bw","lineRepeat":1,"detail":"original"}],"totalChars":230406,"truncatedChars":0,"text":"# User ¶█Complete the assignment below, thoroughly:█# Target█Inspect v0.37 brain pump/registry/dispatcher execution paths that can create periodic CPU bursts; correlate expected cadence with the observed clustered one-second samples. Non-goal: self-hash, already proven fixed by read I/O.█# Change█Read source and current daemon log timing. Identify the highest-confidence periodic work loop and whether the measured duty cycle is expected steady-state or a regression.█# Acceptance█Report exact source locations, cadence, workload complexity, and a concrete field measurement that distinguishes candidates. No project-wide commands.█# Assistant ¶█_**Planning performance regression diagnosis**_█# Tool call ¶█//Reading diagnosis workflow█read(path=\"skill://diagnose\", selector=null)█<out>█\u000e---█name: diagnose█description: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce -> minimise -> hypothesise -> instrument -> fix -> regression-test. Use when user says \"diagnose this\" / \"debug this\", reports a bug, says something is broken/throwing/failing, or describes a performance regression.█---█# Diagnose█A discipline for hard bugs. Skip phases only when explicitly justified.█When exploring the codebase, use the project's domain glossary to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.█## Phase 1 - Build a feedback loop█**This is the skill.** Everything else is mechanical. If you have a fast, deterministic, agent-runnable pass/fail signal for the bug, you will find the cause - bisection, hypothesis-testing, and instrumentation all just consume that signal. If you don't have one, no amount of staring at code will save you.█Spend disproportionate effort here. **Be aggressive. Be creative. Refuse to give up.**█### Ways to construct one - try them in roughly this order█1. **Failing test** at whatever seam reaches the bug - unit, integration, e2e.█2. **Curl / HTTP script** against a running dev server [...5116ch elided...] # Phase 6 - Cleanup + post-mortem█Required before declaring done:█- [ ] Original repro no longer reproduces (re-run the Phase 1 loop)█- [ ] Regression test passes (or absence of seam is documented)█- [ ] All `[DEBUG-...]` instrumentation removed (`grep` the prefix)█- [ ] Throwaway prototypes deleted (or moved to a clearly-marked debug location)█- [ ] The hypothesis that turned out correct is stated in the commit / PR message - so the next debugger learns█**Then ask: what would have prevented this bug?** If the answer involves architectural change (no good test seam, tangled callers, hidden coupling) hand off to the `/improve-codebase-architecture` skill with the specifics. Make the recommendation **after** the fix is in, not before - you have more information now than when you started.█\u000f█</out>█# Tool call ¶█//Mapping brain source files█glob(path=\"**/*brain*\", hidden=true, gitignore=true, limit=200)█<out>█\u000e# crates/█## spt-daemon/█### src/█brain.rs█brainproc.rs█### tests/█brain_decouple.rs█brain_resume_conn_deadlock.rs█daemon_lifecycle_real_brain.rs█brain_swap.rs█## spt/tests/█brain_survive.rs█brain_split.rs█brain_respawn_rename.rs█# docs/adr/█0018-broker-brain-process-isolation-restoration.md█0004-single-daemon-broker-brain-split-and-self-update.md\u000f█</out>█# Tool call ¶█//Locating daemon logs█glob(path=\"**/*.log; **/logs/**; .spt/**; .planning/**\", hidden=true, gitignore=false, limit=200)█<out>█\u000e# .worktrees/r4-stale-guard/█gate.log█# .gstack/█browse-console.log█browse-network.log█Skipped missing paths: .spt/**, .planning/**\u000f█</out>█# Assistant ¶█_**Planning log and source path discovery**_█# Tool call ¶█//Mapping repository root█read(path=\".\", selector=null)█<out>█\u000e.█- .worktrees/ 9m ago█- gate-f4727cd/ 8h ago█- gate-73b29b8/ 9h ago█- gate-ad7fde8/ 22h ago█- pi-w1-main-check/ 1d ago█- gate-a841f5a/ 2d ago█- gate-w6/ 6d ago█- gate-w5/ 6d ago█- gate-w4/ 6d ago█- r4-stale-guard/ 6d ago█- rca-capture/ 1w ago█- f-035/ 1w ago█- ... 1 more█- docs-reorg/ 1w ago█- .claude/ 34m ago█- todlando-commune.md 5.6KB 1h ago█- reports/ [...13509ch elided...] CATION.md 3.0KB 1mo ago█- CI-SELFHOST-PLAN.md 3.8KB 1mo ago█- .github/ 1mo ago█- workflows/ 1h ago█- .gitattributes 363B 1mo ago█- .gstack/ 1mo ago█- browse-console.log 230B 1mo ago█- browse-network.log 2.1KB 1mo ago█- src/ 1mo ago█- .gitkeep 51B 1mo ago█[1 results limit reached. Use limit=2 for more]\u000f█</out>█# Tool call ¶█//Mapping brain module█read(path=\"crates/spt-daemon/src/brain.rs\", selector=null)█<out>█\u000e//! The brain (B2) - the restartable logic half that attaches to the broker.█//!█//! The brain holds all the volatile logic; it may be killed and restarted at█//! any moment (a routine self-update swaps it; a crash kills it). It connects to█//! the stable [`crate::broker::Broker`] over the versioned IPC, drives sessions█//! (spawn / input / resize / kill), and consumes their output. Two invariants█//! this type encodes:█//!█//! - **`gen_start = now()` on cold-start *and* handoff (KNOWN-HAZARDS 2.4).**█//! The wall-clock generation stamp is taken fresh on every start. A handed-off█//! brain rehydrates its resume cursor and generation *counter* from prior█//! state, but its `gen_start` is `now()`, **never** the stale value from that█//! state - a rehydrated `gen_start` would fire time-based discriminators on█//! the new generation. [`Brain::handoff`] takes the prior state by value yet█//! ignores its `gen_start_ms`.█//! - **Gapless, exactly-once resume.** The brain tracks `next_seq` - the next█//! output sequence it still needs. On handoff it `subscribe`s from that cursor;█//! the broker replays buffered output from there. [`Brain::read_event`] accepts█//! only the [...13265ch elided...] vent`] under the same accept/dedup/gap discipline.█/// Durability across a handoff is the logic layer's job (a re-attaching█/// brain queries `net-streams` and re-subscribes from its durable cursors).█net_cursors: std::collections::HashMap<u64, u64>,█/// The presence resume cursor (D4c) - the conn-liveness sibling of█/// `net_cursors`, set by [`Brain::net_presence_subscribe`] and advanced by█/// [`Brain::read_event`] under the same accept/dedup/gap discipline.█/// `None` until subscribed (or the first event arrives).█presence_cursor: Option<u64>,█/// Per-session **resume** output cursors (restoration D4-2): the multi-session█/// continuity state a cold-started brain rebuilds from the broker via█...█}█[Showing lines 1-300 of 2370. Use :301 to continue]\u000f█</out>█# Tool call ¶█//Mapping brain process module█read(path=\"crates/spt-daemon/src/brainproc.rs\", selector=null)█<out>█\u000e//! The brain **process** + its broker-side supervisor (ADR-0018 Q2/Q3 - the█//! broker/brain process-isolation restoration, D1 skeleton).█//!█//! ADR-0004 specified the broker/brain split as two **processes**; production█//! drifted to an in-process thread (`daemon.rs`), so `spt update apply` swaps█//! the binary on disk but never restarts the running code (the regression█//! ADR-0018 corrects). D1 restores the process boundary as a *true minimal█//! skeleton*: `spt daemon run` is the broker process and spawns a supervised█//! `spt daemon brain` child. The child connects over the existing broker socket█//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2█//! migrates the broker-resident loops here one per commit; **D2-1 moved the net█//! consumers** (inbound dispatcher + outbound peer pump - pure IPC clients, no█//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`█//! verb. The digest hub serve + seed-control stay broker-side continuity█//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche█//! loops.█//!█//! What D1 proves (de-risk spike #1, the design's hardest invariant): the█//! broker spawns + supervises a [...14712ch elided...] // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery█// (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on█// BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);█// best-effort - a transient sessions error must never fell the heartbeat (the█// net_status probe above already owns broker-liveness). Self-applies: it drives█// the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands█// its own trial against a live older broker - no coordinated broker restart.█// [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]█let _ = brain.sessions();█write_ready(generation);█}█}█[Showing lines 1-300 of 2165. Use :301 to continue]\u000f█</out>█# Tool call ¶█//Finding periodic Rust work█grep(pattern=\"interval|sleep|tick|recv_timeout|select!|poll|refresh|registry|dispatch|pump\", path=\"crates/spt-daemon/src;crates/spt-core/src;crates/spt/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## access.rs█4|//! order: subnet *visibility* (is the endpoint routable here at all? -█*5|//! `spt_store::visibility`, applied inside registry resolution) -> the█6|//! **endpoint access whitelist** (may *your node* remotely reach it? - THIS█7|//! module) -> *capability grants* (may this agent do this high-risk thing? -█8|//! [`crate::consent`], default-deny). The whitelist is the outer gate before█## adapter_update.rs█7|//! its manifest `[update]` block ([`Update`]); this module turns that directive█*8|//! into a per-adapter [`AdapterUpdateOutcome`], dispatched by avenue:█9|//!█10|//! - **`file_pull`** - spt-core controls the bytes, so it *verifies* them: the█11|//! pulled payload is checked against the adapter's **own** Ed25519 key (declared█...█163|/// is complete here. Soft-deregistered adapters are excluded by█*164|/// [`spt_runtime::registry::registered`].█165|// [impl->REQ-INSTALL-4]█166|pub fn ripple_registered(adapters_dir: &std::path::Path) -> Vec<(String, AdapterUpdateOutcome)> {█*167| let mut set = spt_runtime::registry::registered(adapters_dir);█168| set.sort_by_key(|(r, _)| r.registered_at_ms);█169| set.iter()█170| [...48998ch elided...] rite(\"doyle\", \"mock-shell-0\", \"old-token\", \"stale-frame\");█*351| // Relink minted \"new-token\"; the shell polls with it.█352| assert_eq!(█353| hub.take(\"doyle\", \"mock-shell-0\", \"new-token\"),█354| None,█...█359| !hub.has_slot(\"doyle\", \"mock-shell-0\"),█*360| \"the dead frame is cleared by the mismatching poll\"█361| );█362| }█363|█## effect.rs█7|//! kills it. Effects it drives cross the broker<->brain boundary - a PTY write, a█*8|//! spool row, a registry update. A brain that crashes *around* one of those█9|//! effects must, on restart, neither duplicate it (a re-injected keystroke, a█10|//! double-written row) nor drop it (a lost delivery).█11|//!█...█[Showing lines 1-965 of 1129 (50.0KB limit). Use :966 to continue]\u000f█</out>█# Assistant ¶█_**Planning environment variable and path inspection**█**Reviewing default SPT_HOME location**_█# Tool call ¶█//Locating runtime home paths█grep(pattern=\"SPT_HOME|stderrlog|logs_dir|\\\\.log|brain-.*log|daemon.*log\", path=\"crates/spt-daemon/src;crates/spt-runtime/src;crates/spt/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brainproc.rs█9|//! `spt daemon brain` child. The child connects over the existing broker socket█*10|//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2█11|//! migrates the broker-resident loops here one per commit; **D2-1 moved the net█12|//! consumers** (inbound dispatcher + outbound peer pump - pure IPC clients, no█13|//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`█...█138|/// The `spt daemon brain` child entry. Connect to the broker over the existing█*139|/// socket IPC, signal readiness, host the brain-side logic loops, and idle -█140|/// holding the connection and probing broker liveness each heartbeat. A dropped█141|/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)█142|/// returns `Err`, exiting the process so the broker-side supervisor respawns it█...█159|pub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {█*160| // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink█161| // (REQ-DAEMON-STDERR-PERSIST) - a detached brain's stdio is /dev/null, so every█162| // diagnostic below would otherwise vanish (the [...37609ch elided...] AIL`), and the█1208|/// body restarts after a capped, doubling backoff - a 5.9-class pump death█1209|/// self-heals visibly instead of silently halving the daemon for 24 h.█...█1389| fn pre_round(&mut self, _ctx: &RoundCtx) {█*1390| self.log.borrow_mut().push(format!(\"pre:{}\", self.tag));█1391| }█1392| fn peer_step(█1393| &mut self,█...█2020| let name = format!(\"spt-pump-pushfeed-{}.sock\", std::process::id());█*2021| let broker = Broker::bind_in_with_net(&name, dir.path().join(\"effects.log\"), Some(host))█2022| .expect(\"bind broker\");█2023| let serve = std::sync::Arc::clone(&broker);█2024| std::thread::spawn(move || {█Showing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Mapping periodic modules█glob(path=\"crates/spt-daemon/src/{pump,dispatch,registryhost,livehost,projwriter,shellwake}*.rs\", hidden=false, gitignore=true, limit=100)█<out>█\u000e# crates/spt-daemon/src/█livehost.rs█registryhost.rs█dispatch.rs█projwriter.rs█shellwake.rs\u000f█</out>█# Tool call ¶█//Reading dispatcher loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"160-360\")█<out>█\u000e#[derive(Debug)]█pub enum DispatchOutcome {█/// The family's serve loop ran to its own outcome (rendered for the log).█Served(String),█/// The first line never arrived / didn't parse - dropped.█Unknown,█/// The worker failed (IO against broker or store).█Failed(String),█}█/// A claimed stream's dispatch lifecycle (ADR-0038 C,█/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`█/// insert performed BEFORE worker spawn and never cleared - one transient█/// worker-setup failure permanently abandoned the stream. Claims now█/// distinguish in-flight vs terminal vs retryable, and a transient failure█/// requeues bounded (backoff-shaped, never a hot loop).█#[derive(Debug, Clone, Copy, PartialEq, Eq)]█enum ClaimState {█/// A worker owns the stream right now (`attempts` = prior failures).█InFlight { attempts: u32 },█/// Done for this dispatcher's lifetime: served, unclassifiable, or█/// retries exhausted. Terminal outcomes never re-enter the queue.█Terminal,█/// A transient failure released the claim; eligible again at `next_at`.█Retry { attempts: u32, next_at: Instant },█}█/// Bounded retry budget per stream pe [...7280ch elided...] [impl->REQ-REGISTRY-REPLAY-BOUNDED]█fn outcome_transition(█outcome: &DispatchOutcome,█family: Option<StreamFamily>,█attempts: u32,█now: Instant,█breaker_window: Duration,█) -> (ClaimState, bool) {█match outcome {█DispatchOutcome::Served(_) | DispatchOutcome::Unknown => (ClaimState::Terminal, false),█DispatchOutcome::Failed(msg) => match classify_failure(msg) {█FailClass::SeatBlocked if family_is_one_way(family) => {█let attempts = attempts + 1;█if attempts >= ONEWAY_POISON_STRIKES {█(ClaimState::Terminal, true)█} else {█(█...█)█}█}█...█},█}█}█[Showing lines 159-363 of 1920. Use :364 to continue]\u000f█</out>█# Tool call ¶█//Reading net consumer wiring█read(path=\"crates/spt-daemon/src/brainproc.rs\", selector=\"303-380\")█<out>█\u000e/// reports a net endpoint up (`net_enabled`) AND we have not already started█/// them. Pure for the unit table - the spawn-exactly-once + net-gating█/// semantics that keep a single dispatcher/peer-pump set running.█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█fn consumer_gate(net_enabled: bool, already_started: bool) -> bool {█net_enabled && !already_started█}█/// Spawn the net consumers - the inbound dispatcher + the outbound peer pump█/// (D9-1) - against the broker's socket. **Relocated from the broker process to█/// the brain child (restoration D2-1):** both are standalone IPC clients█/// (`Brain::cold_start`, no shared `Arc<Broker>`), so they belong with the█/// restartable brain. Each mints its own registry + stop flag and connects█/// independently; when the brain process exits these in-process threads die with█/// it, and the respawned brain re-spawns them from the current binary. Mirrors█/// the wiring the broker boot used to do, `node_hex` now sourced from the█/// `net-status` reply rather than the broker's identity load.█// [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█// [impl->REQ-DAEMON-9]█fn spawn_net_consumers(node_hex: &str) {█let registry = Arc::new(cra [...2518ch elided...] = spt_store::atomic::atomic_write_string(&brain_ready_path(), &obj.to_string());█}█/// Lowercase-hex SHA-256 of the running process's own executable file,█/// captured **exactly once per brain process** (best-effort; a failed█/// `current_exe`/read stays `None` for the process lifetime - no per-tick█/// retry, the breadcrumb simply omits the field). Restoration D7-1: the█/// `exe_hash` breadcrumb that proves *which bytes* a brain generation is█/// running. The once-per-process capture is load-bearing TWICE█/// (REGISTRY-LIFECYCLE R1): the pre-fix per-tick re-read hashed 30+ MiB every█/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and - worse█/// - it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain█[Showing lines 302-383 of 2165. Use :384 to continue]\u000f█</out>█# Tool call ¶█//Reading pump configuration█read(path=\"crates/spt-daemon/src/config.rs\", selector=\"35-190\")█<out>█\u000e█/// Default peer-pump cadences (D9-1): how often the daemon pushes its█/// registry/notif feeds to trusted peers and pulls context syncs from them.█/// Conservative defaults - every loop is a thin call over an idempotent█/// driver, so a missed tick costs only latency, never correctness.█pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);█pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);█pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);█pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);█/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows█/// authored by a node not heard within this window are evicted on the next█/// registry pump tick. Sized to ~10 default pump cadences - generous against█/// transient drops (a peer re-advertises every cadence, so one admitted feed█/// inside the window keeps its rows), short enough that a dead node identity█/// stops poisoning bare-id resolution within minutes.█pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);█/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) -█/// the `\"re [...6988ch elided...] /// The worker-reap TTL floor (seconds since a worker's `started`), W-3█/// (REQ-WORKER-REAP): the reconcile GC reaps any worker older than this even█/// under a live parent with a stale `ready` marker (the `SubagentStop`-never-fired█/// leak class). Default [`spt_store::worker_reap::DEFAULT_REAP_TTL_SECS`] (24h),█/// clamped at the reap site to a ≥1h floor (a fat-fingered tiny value can never█/// mass-kill in-flight workers); `0` disables the TTL leg.█pub worker_reap_ttl_secs: u64,█/// Endpoints replayed as startup defaults at daemon start (F-038 W5,█/// REQ-ENDPOINT-AUTOSTART) - `spt endpoint run --save` writes this list.█/// Default empty = nothing auto-starts. A replay failure logs loud and█...█}█[Showing lines 34-193 of 652. Use :194 to continue]\u000f█</out>█# Tool call ¶█//Finding pump functions█grep(pattern=\"spawn_peer|peer_pump|pump_once|registry_pump|run_pump|PumpSchedule|next_due\", path=\"crates/spt-daemon/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brainproc.rs█329| let cfg = crate::config::DaemonConfig::load();█*330| if cfg.peer_pump {█*331| let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);█332| }█333|}█334|█## config.rs█38|/// driver, so a missed tick costs only latency, never correctness.█*39|pub const DEFAULT_REGISTRY_PUMP_PERIOD: Duration = Duration::from_secs(30);█40|pub const DEFAULT_NOTIF_PUMP_PERIOD: Duration = Duration::from_secs(15);█41|pub const DEFAULT_SYNC_PULL_PERIOD: Duration = Duration::from_secs(60);█42|pub const DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);█...█102| #[serde(default, skip_serializing_if = \"Option::is_none\")]█*103| peer_pump: Option<bool>,█104| #[serde(default, skip_serializing_if = \"Option::is_none\")]█*105| registry_pump_period_ms: Option<u64>,█106| #[serde(default, skip_serializing_if = \"Option::is_none\")]█107| registry_evict_after_ms: Option<u64>,█108| #[serde(default, skip_serializing_if = \"Option::is_none\")]█...█151| /// self-drives; `false` is the kill switch for debugging/hermetic setups.█*152| pub peer_pump: bool,█153| /// Registry feed push cad [...6367ch elided...] , no broker, no loopback E2E. The peer-step IO█1365| // (PeerIo -> brain) is exercised by `tests/pump.rs`; here `run_due` takes a█1366| // recording closure so the ordering/abort choreography is a unit fact.█...█1594| !peer_eligible(&sched, \"bb\", now),█*1595| \"and backs the peer off (not eligible until next_due)\"█1596| );█1597|█1598| // A connect-then-silent reply-read TimedOut, reclassified OUT of TimedOut█...█1615| // failure waits the floor, each subsequent one doubles, saturating at the cap;█*1616| // eligibility respects next_due; a reset (success removes the entry) returns to█1617| // the floor. A dead peer backs off; a live peer never languishes.█1618| #[test]█1619| fn per_peer_backoff_doubles_caps_and_eligibility() {\u000f█</out>█# Assistant ¶█_**Locating default SPT home implementation**_█# Tool call ¶█//Finding SPT home resolution█grep(pattern=\"pub fn spt_home|fn spt_home|LOCALAPPDATA|\\\\.spt\", path=\"crates/spt-store/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-store/src/█## perch.rs█24|/// Root of all spt-core on-disk state. Honors `$SPT_HOME`, else the platform█*25|/// default (`%LOCALAPPDATA%\\spt-core` on Windows, `$HOME/.spt-core` on Unix).█26|/// **Pure** - reads env, composes a path, creates nothing.█27|///█28|/// The default lives under `spt-core/`, **deliberately distinct from the modern█...█33|// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]█*34|pub fn spt_home() -> PathBuf {█35| if let Ok(over) = std::env::var(\"SPT_HOME\") {█36| if !over.is_empty() {█37| return PathBuf::from(over);█...█44|fn platform_default_spt_home() -> PathBuf {█*45| if let Ok(local) = std::env::var(\"LOCALAPPDATA\") {█46| if !local.is_empty() {█47| return PathBuf::from(local).join(\"spt-core\");█48| }█...█50| let up =█*51| std::env::var(\"USERPROFILE\").expect(\"LOCALAPPDATA or USERPROFILE must be set on Windows\");█52| PathBuf::from(up)█53| .join(\"AppData\")█54| .join(\"Local\")█...█60| let home = std::env::var(\"HOME\").expect(\"HOME must be set on Unix\");█*61| PathBuf::from(home).join(\".spt-core\")█62|}█63|█64|/// The owlery directory holding all perches: `<spt_home>/owlery/`.█...█686| #[test]█*687| fn spt_home_is_pure_and_honors_env() {█688| let tmp = tempfile::tempdir().unwrap();█689| let target = tmp.path().join(\"does-not-exist-yet\");█690| let _g = EnvGuard::set(&target);\u000f█</out>█# Tool call ¶█//Reading pump scheduler loop█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"1-220,219-340,500-760\")█<out>█\u000e//! Outbound peer pump (D9-1-2) - the production trigger loops every D5-D8█//! slice deferred (\"rides D9 with the daemon lifecycle\").█//!█//! One daemon-hosted loop - *the* peer pump - is a pure scheduler + per-peer█//! fan-out over four [`PumpWorker`] legs. The pump owns *when* (each worker's█//! cadence + its wake markers, fed to the pure [`due`] kernel) and *toward█//! whom* (every roster member of every non-detached member subnet); each worker█//! owns *what* (its node-local `pre_round` and its per-peer `peer_step`), a thin█//! call over an already-shipped, idempotent driver. The four legs, in fan-out█//! order, each in its own module:█//!█//! - **registry push** ([`registry`], [`RegistryHost::advertise_local`] -> one█//! feed stream per peer): the node re-advertises its own rows; peers█//! reconverge within one cadence (replay-is-recovery, the D4d/D8 push█//! posture). Mesh-D6 widened the push target from the directly-paired set to█//! ALL roster members - a wider DIRECT fan-out, never a relay (REQ-MESH-3).█//! Own rows only - a relayed third-party row would carry an origin the█//! receiver cannot gate honestly (KNOWN-HAZARDS 7.5/4.10), so every row still█//! arri [...28028ch elided...] -idle tick sleeps without loading a round).█fn compute_due(█workers: &mut [&mut dyn PumpWorker],█last: &[Option<Instant>],█now: Instant,█) -> (Vec<bool>, bool) {█let mut flags = vec![false; workers.len()];█let mut any = false;█for i in 0..workers.len() {█let wake = workers[i].poll_wake();█flags[i] = due(last[i], wake, now, workers[i].cadence());█any |= flags[i];█}█(flags, any)█}█/// Run each due worker's node-local `pre_round` ONCE for the round, before any█/// peer_step (the registry sweep + advertise; the other legs default no-op).█fn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {█for i in 0..workers.len() {█if due_flags[i] {█workers[i].pre_round(ctx);█}█}█}\u000f█</out>█# Tool call ¶█//Reading pump round execution█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"760-1040,1180-1280\")█<out>█\u000efn pre_rounds(workers: &mut [&mut dyn PumpWorker], due_flags: &[bool], ctx: &RoundCtx) {█for i in 0..workers.len() {█if due_flags[i] {█...█}█}█}█/// Run `step` for each due worker index in fan-out order, aborting on the█/// FIRST error (abort-on-first-fail - the caller drops the peer's conn and█/// redials next tick). The peer-step IO itself lives in `step`; this is the█/// pure ordering/abort kernel, so the choreography is a unit fact.█fn run_due(due_flags: &[bool], mut step: impl FnMut(usize) -> io::Result<()>) -> io::Result<()> {█for (i, &is_due) in due_flags.iter().enumerate() {█if is_due {█step(i)?;█}█}█Ok(())█}█/// Per-peer fan-out outcome (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION) - SUPERSEDES█/// W1's whole-round `peer_outcome` poison at the round level while KEEPING its█/// carrier-desync->restart path. `Ok` keeps the conn. An ORDINARY error (including█/// a connect-then-silent peer's reply-read `TimedOut`, already reclassified OUT of█/// `TimedOut` by `Brain::read_peer_reply_until`) is a PER-PEER failure: drop THAT█/// conn + back the peer off (Q3 - a mid-round `peer_step` fail isolates exactly█/// like a `DIAL_ [...14328ch elided...] PERVISOR ([`supervise_pump`]), not the bare loop: the pump█/// restarts after a panic or error with capped backoff (M8 decision 23).█// [impl->REQ-DAEMON-5]█pub fn spawn_peer_pump(█broker_name: String,█registry: Arc<RegistryHost>,█cfg: DaemonConfig,█stop: Arc<AtomicBool>,█) -> thread::JoinHandle<()> {█thread::spawn(move || {█let paths = PumpPaths::production();█supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {█run_peer_pump(█&broker_name,█Arc::clone(&registry),█&paths,█production_resolver(),█PumpConfig::from_config(&cfg),█PumpHooks::default(),█&stop,█)█});█})█}█#[cfg(test)]█mod tests {█use super::*;█...█}\u000f█</out>█# Tool call ¶█//Finding dispatcher main loop█grep(pattern=\"pub fn run_dispatcher|fn run_dispatcher|spawn_dispatcher|DEFAULT_DISPATCH_POLL|thread::sleep\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 86|/// workers block on their stream's event feed).█*87|pub const DEFAULT_DISPATCH_POLL: Duration = Duration::from_millis(100);█88|█89|/// What protocol a peer-initiated stream speaks, by its first record's shape.█90|#[derive(Debug, Clone, Copy, PartialEq, Eq)]█...█532| // with fresh replay subscribers (Amendment fix 5).█*533| thread::sleep(poll);█534| continue;█535| }█536| let reply = brain.net_streams()?;█...█678| }█*679| thread::sleep(poll);█680| }█681| Ok(())█682|}█...█704| }█*705| thread::sleep(Duration::from_millis(10));█706| }█707| Err(last)█708|}█...█1414|/// socket - the daemon-boot entry ([`crate::daemon::Daemon::run`]).█*1415|pub fn spawn_dispatcher(█1416| broker_name: String,█1417| registry: Arc<RegistryHost>,█1418| stop: Arc<AtomicBool>,█...█1422| if let Err(e) =█*1423| run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)█1424| {█1425| eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");█1426| }\u000f█</out>█# Tool call ¶█//Finding registry scan complexity█grep(pattern=\"pub fn|read_dir|walk|owlery|registry|advert|scan|entries|resolve\", path=\"crates/spt-daemon/src/registryhost.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e*1|//! The daemon's live subnet-registry holder (D9-1-2) - REQ-INST-7's█2|//! production wiring.█3|//!█*4|//! D3 built the registry **model** (`spt_net::net::registry`: the epoch█5|//! lease, the join-time collision check, visibility enforcement) and D4d the█*6|//! wire record (`RegistryUpdate`), both consumed only by tests. This type is█*7|//! the daemon-side instance: one in-memory `SubnetRegistry` per member█8|//! subnet, fed from two directions -█9|//!█*10|//! - **inbound**: the dispatcher's registry arm applies peer feeds under the█11|//! same fail-closed gate as every replicated store (member subnet ∧ origin█12|//! trusted *in that subnet*, subject = handshake-proven stream origin -█13|//! KNOWN-HAZARDS 7.5);█*14|//! - **local**: [`advertise_local`](RegistryHost::advertise_local) scans the█*15|//! owlery and (re-)advertises every visible self perch with a fresh█16|//! [`EpochSource`] epoch - the per-node monotonic lease key, never█17|//! wall-clock (KNOWN-HAZARDS 4.8).█18|//!█*19|//! The registry is **eventually consistent by re-advertisement**: state is█20|//! in-memory (a daemon restart forgets peers' rows), and each pump tick█21|//! re-pushes the n [...35690ch elided...] r, node: &str, epoch: u64) -> RegistryUpdate {█*1262| RegistryUpdate {█1263| subnet: subnet.to_string(),█1264| endpoint_id: id.to_string(),█1265| instance: Instance {█...█1298|█*1299| fn policy(subnet: &str, trusted: &str) -> RegistryGatePolicy {█1300| let mut roster = RosterStore::default();█1301| roster.merge_entry(member(subnet, trusted));█*1302| RegistryGatePolicy {█1303| subnets: vec![subnet.to_string()],█1304| roster,█1305| }█...█1307|█*1308| fn host(dir: &Path) -> RegistryHost {█*1309| RegistryHost::new_at(█1310| \"aa11\",█1311| EpochSource::load_from(&dir.join(\"epoch.json\")),█*1312| dir.join(\"registry\"),█1313| )█1314| }█1315|\u000f█</out>█# Tool call ¶█//Finding livehost cadence█grep(pattern=\"const .*PERIOD|Duration::from|thread::sleep|reconcile_once|spawn_live_host|loop \\\\{\", path=\"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/projwriter.rs;crates/spt-daemon/src/shellwake.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## livehost.rs█6|//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of█*7|//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from█8|//! disk): same shape - enumerate Self perches, resolve each manifest from its█9|//! `info.json` `adapter` option, hold a stop flag per supervised thread, and run█10|//! one bounded reconcile sweep at boot and every tick. Where the shell waker█...█134|/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the█*135|/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):█136|///█137|/// - **un-host** (tabled ∧ ¬online) - stop the driver + de-table (exit guard: a█138|/// signed-off / removed endpoint must not keep pulsing - thread + dead-agent leak).█...█144|// [impl->REQ-DAEMON-1]█*145|pub fn reconcile_once(█146| owlery: &Path,█147| registered: &[(AdapterRecord, Manifest)],█148| adapters_dir: &Path,█...█540|/// massacres them (seed #6, the field-accept blocker). Runs ONCE at█*541|/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear█542|/// ([`reconcile_hosted_liveness`]) offlines the sta [...9870ch elided...] .expect(\"waker pid parked\")█...█931| shellinfo::write_shell_info(&perch, &info).unwrap();█*932| reconcile_once(owlery, &registered, &adapters_dir, &set, &params);█933| assert_eq!(set.len(), 0, \"onlined instance keeps no watcher\");█934| assert!(█935| !spt_store::proc::is_process_alive(waker_pid),█...█943| std::fs::write(perch.join(WAKER_GAVE_UP_FILE), b\"\").unwrap();█*944| reconcile_once(owlery, &registered, &adapters_dir, &set, &params);█945| assert_eq!(set.len(), 0, \"the give-up latch suppresses adoption\");█946| }█947|█...█989| let params = fast_params();█*990| reconcile_once(owlery, &registered, &adapters_dir, &set, &params);█991| assert_eq!(█992| set.len(),█993| 1,\u000f█</out>█# Assistant ¶█_**Retrieving daemon log directory and constants**_█# Tool call ¶█//Listing runtime home█read(path=\"C:/Users/decid/AppData/Local/spt-core\", selector=null)█<out>█\u000e.█- owlery/█- hertz/█- mobile-gw/█- todlando/ just now█- lia/ just now█- doyle/ just now█- webbie/ 8m ago█- deployah/ 8m ago█- .registry 12.0KB 8m ago█- perri/ 8m ago█- emphasys/ 8m ago█- chert/ 7h ago█- ... 16 more█- sptc-diag-2/ 3w ago█- brain.ready█- identity/█- epoch█- pump-heartbeat.json 13B just now█- registry/ just now█- pump-health.json 766B just now█- pump-ops.json 5B just now█- peer-addrs.json 4.0KB [...23622ch elided...] 1mo ago█- deadline-sptc-ci-liverelay-24320-sess.json 46B 1mo ago█- deadline-sptc-ci-v08b-sess.json 46B 1mo ago█- deadline-sptc-ci-v08d-sess.json 46B 1mo ago█- deadline-sptc-ci-liverelay-sess.json 46B 1mo ago█- deadline-sptc-argv-cap-sess.json 46B 1mo ago█- scratch/ 1mo ago█- pump/ just now█- net/ 1w ago█- context/ 1mo ago█- .seed.git/ 1mo ago█[1 results limit reached. Use limit=2 for more]\u000f█</out>█# Tool call ¶█//Reading stderr log layout█read(path=\"crates/spt-daemon/src/stderrlog.rs\", selector=\"1-180\")█<out>█\u000e//! Persistent daemon stderr (LIFECYCLE-TRUTH W3, REQ-DAEMON-STDERR-PERSIST).█//!█//! A detached daemon nulls its stdio (`Stdio::null()` at spawn, or the█//! [`null_std_handles_if_detached_in_fact`](crate::daemon::null_std_handles_if_detached_in_fact)█//! undrained-pipe defense) - so every `eprintln!` diagnostic the broker and brain█//! emit goes to `/dev/null`. The 2026-07-06/07 incident window left ZERO logs; both█//! RCAs ran blind and had to recreate everything from rigs. This module gives the█//! daemon a durable place to write instead: at startup each process REDIRECTS ITS█//! OWN stderr to a rotating, size-capped file under `SPT_HOME/logs`, opened█//! **in-process** - never an inherited or piped handle (`REQ-HAZARD-DETACHED-DAEMON-STDIO`█//! / KH 5.6: a detached child inheriting a caller's pipe BLOCKS when the pipe fills;█//! a disk file never blocks, which is exactly why the existing null-guard already█//! keeps a file stderr alive).█//!█//! Redirecting the process stderr FD (not swapping every call site) captures all█//! existing `eprintln!` output unchanged. Rotation is at INSTALL (each process█//! start / brain generation): the file is stamped with the role + generation, [...6830ch elided...] ty never rolls\");█assert!(!should_roll(STDERR_LOG_CAP - 1, STDERR_LOG_CAP), \"just under never rolls\");█assert!(should_roll(STDERR_LOG_CAP, STDERR_LOG_CAP), \"exactly at cap rolls\");█assert!(should_roll(STDERR_LOG_CAP + 1, STDERR_LOG_CAP), \"over cap rolls\");█assert!(!should_roll(u64::MAX, 0), \"cap 0 disables rotation\");█}█// [unit->REQ-DAEMON-STDERR-PERSIST] roll keeps at most KEEP files: the current█// file moves to .1, a pre-existing .1 drops (KEEP=2 -> current + one backup), and█// the content is preserved across the roll (the backup holds the OLD current).█#[test]█fn roll_keeps_bounded_generations_and_preserves_current() {█let dir = tempfile::tempdir().unwrap();█...█}█...█}█[Showing lines 1-183 of 232. Use :184 to continue]\u000f█</out>█# Tool call ¶█//Reading dispatcher polling loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"500-715,1400-1440\")█<out>█\u000e/// (the daemon spawns it on its own); workers detach (each ends with its█/// stream).█pub fn run_dispatch_loop(█broker_name: &str,█paths: &DispatchPaths,█registry: Arc<RegistryHost>,█stop: &AtomicBool,█poll: Duration,█) -> io::Result<()> {█let mut brain = connect(broker_name)?;█// Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable -█// replaces the pre-fix one-shot `HashSet` whose burned claims permanently█// abandoned a stream on the first transient failure.█let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));█// Dispatcher generation id (Amendment fix 9): every telemetry record this█// loop emits carries it, so per-generation attach/poison censuses line up.█let generation = now_ms();█// Global circuit breaker (Amendment fix 5) + its current window, shared█// with workers so a seat-blocked retry paces on it.█let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));█// Bounded worker pool (Amendment fix 7): a cold table (daemon refresh█// with a large backlog) claims at most this many rows per poll - the█// rest wait for the n [...9874ch elided...] rc<RegistryHost>,█stop: Arc<AtomicBool>,█) -> thread::JoinHandle<()> {█thread::spawn(move || {█let paths = DispatchPaths::production();█if let Err(e) =█run_dispatch_loop(&broker_name, &paths, registry, &stop, DEFAULT_DISPATCH_POLL)█{█eprintln!(\"DISPATCH_LOOP_FAIL: {e}\");█}█})█}█#[cfg(test)]█mod tests {█use super::*;█use serde_json::json;█// [unit->REQ-NET-1] the demux table: every family's first record█// classifies correctly, including the `request` kind collision.█#[test]█fn classifies_every_family_by_first_line_shape() {█let sync = json!({\"kind\": \"request\", \"sync_id\": \"pull-1\", \"refs\": [], \"have_tips\": {}});█assert_eq!(classify_first_line(&sync), StreamFamily::Sync);█...█}█...█}\u000f█</out>█# Tool call ¶█//Reading livehost loop█read(path=\"crates/spt-daemon/src/livehost.rs\", selector=\"100-180,1015-1120\")█<out>█\u000eimpl LiveSet {█...█fn insert(&self, id: &str, handle: HostedLife) {█let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());█map.insert(id.to_string(), handle);█}█/// The currently-tabled ids (finished pruned) - the stop-side reconcile input.█fn ids(&self) -> Vec<String> {█let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());█map.retain(|_, h| !h.thread.is_finished());█map.keys().cloned().collect()█}█/// Un-host one lifecycle: trip its stop flag, join the driver, de-table. The█/// pulse loop checks the flag each sleep-slice, so the join is prompt. We do█/// NOT re-stamp `offline` - the perch already left the online set (graceful█/// signoff cleared it, or the perch is gone); a brain *crash* deliberately█/// leaves `status=online` so the next brain rehydrates it (CONTEXT:194).█fn stop_host(&self, id: &str) {█let handle = {█let mut map = self.inner.lock().unwrap_or_else(|p| p.into_inner());█map.remove(id)█};█if let Some(h) = handle {█h.stop.store(true, Ordering::SeqCst);█let _ = h.thread.join();█[...8470ch elided...] elay/legacy perches exempt.█// [impl->REQ-HAZARD-HOSTED-LIVENESS-RECONCILE]█// [impl->REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE]█if let Some(live) = query_live_session_endpoints() {█reconcile_hosted_liveness(&owlery, &live);█}█reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);█// Sleep in slices so a stop lands promptly.█let mut left = LIVE_RECONCILE_INTERVAL_MS;█while left > 0 && !stop.load(Ordering::SeqCst) {█let step = left.min(100);█std::thread::sleep(Duration::from_millis(step));█left -= step;█}█}█})█}█#[cfg(test)]█mod tests {█use super::*;█use crate::test_home::with_home;█...█}\u000f█</out>█# Tool call ¶█//Reading shellwake loop█read(path=\"crates/spt-daemon/src/shellwake.rs\", selector=\"35-90,450-580\")█<out>█\u000euse spt_runtime::registry::AdapterRecord;█use spt_store::shellinfo::{self, SHELL_STATUS_OFFLINE};█/// The wake opcode (documented in `docs/MANIFEST.md` §Shell adapters): a█/// wake-watcher exiting with **86** fires the wake resolution; every other█/// exit is a crash.█pub const WAKE_OPCODE: i32 = 86;█/// The running watcher's OS pid, parked on the shell perch - the█/// one-watcher-per-instance lock and the cross-daemon-restart kill handle.█pub const WAKER_PID_FILE: &str = \"waker.pid\";█/// The give-up latch: present => the watcher crash-looped past its budget and█/// the reconciler must NOT restart it. Cleared by the next shell activity█/// (any (re)launch - [`crate::shellhost::launch_shell`]).█pub const WAKER_GAVE_UP_FILE: &str = \"waker.gaveup\";█/// Watcher supervision knobs (injectable for tests; defaults are production).█#[derive(Debug, Clone, Copy)]█pub struct WakeParams {█/// First-crash respawn delay; doubles per consecutive crash.█pub backoff_base_ms: u64,█/// Backoff ceiling.█pub backoff_cap_ms: u64,█/// Consecutive crash-exits before the give-up latch drops.█pub give_up_after: u32,█}█impl Default for WakeParams {█fn default() -> Self {█[...5436ch elided...] owlery_dir();█let adapters_dir = spt_store::perch::adapters_dir();█let registered = spt_runtime::registry::registered(&adapters_dir);█reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);█// Sleep in slices so a stop lands promptly.█let mut left = RECONCILE_INTERVAL_MS;█while left > 0 && !stop.load(Ordering::SeqCst) {█let step = left.min(100);█std::thread::sleep(Duration::from_millis(step));█left -= step;█}█}█})█}█#[cfg(test)]█mod tests {█use super::*;█use spt_store::shellinfo::{spawn_record, SHELL_STATUS_ONLINE};█fn fast_params() -> WakeParams {█WakeParams {█backoff_base_ms: 10,█...█}█}█...█}\u000f█</out>█# Tool call ¶█//Reading project writer loop█read(path=\"crates/spt-daemon/src/projwriter.rs\", selector=\"35-75,590-690\")█<out>█\u000e█use serde::{Deserialize, Serialize};█use spt_store::branchstore::BranchStore;█use spt_store::contextstore::{self, PROJECT_CONTEXT_FILE};█use spt_store::info;█use spt_store::perch;█use spt_store::projderive;█use spt_store::projindex::{self, AbsentReason, EndpointProject, IndexRead, ProjectIndex};█use spt_store::projinval::{self, Coalesced};█use spt_store::sessions;█use crate::brain::now_ms;█/// Queue poll cadence (a single `read_dir` - pure file I/O). Runtime-env█/// overridable for int rigs (`SPT_PROJINDEX_POLL_MS`), never for production.█const POLL_MS: u64 = 500;█/// Debounce window after the first observed event - a burst (an adapter█/// stampede, a multi-endpoint rename) coalesces into ONE reconcile.█const DEBOUNCE_MS: u64 = 250;█/// The low-frequency periodic FULL reconcile - the backstop that catches a█/// lost nudge (`SPT_PROJINDEX_PERIODIC_MS` override for int rigs).█const PERIODIC_MS: u64 = 300_000;█/// The complexity counters - the deterministic CI gate surface (gate ruling:█/// counters gate, wall-clock is manual acceptance only).█#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]█pub struct CycleCounters {█/// Branch enumerations this cycle [...3917ch elided...] impl->REQ-PROJECT-INDEX-INVALIDATION]█std::thread::sleep(debounce);█engine.stats.pending_refresh = true;█engine.write_stats();█}█let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));█if due_periodic {█since_periodic = Duration::ZERO;█}█let req = if due_periodic { Coalesced { global: true, ..req } } else { req };█if req.is_empty() && !due_periodic {█continue; // a racer consumed it (never happens in production)█}█if let Err(e) = engine.reconcile(&req, due_periodic) {█engine.record_failure(e);█}█}█})█}█#[cfg(test)]█mod tests {█use super::*;█...█}\u000f█</out>█# Tool call ¶█//Reading registry pump worker█read(path=\"crates/spt-daemon/src/pump/registry.rs\", selector=\"1-260\")█<out>█\u000e//! The registry pump worker (pump-seam P2) - the first leg cut behind the█//! [`super::PumpWorker`] seam.█//!█//! `poll_wake` consumes the event-driven advertisement marker (force a round█//! NOW on an endpoint online/offline transition); `pre_round` runs the█//! node-local sweep (repair-evictions -> silent-peer eviction -> due seed█//! rotations -> re-advertise) ONCE per due round and holds the produced adverts█//! as worker state; `peer_step` pushes this node's own rows for the given█//! subnet over the peer's feed stream. Construction-captured deps: the shared█//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the█//! two registry cadence knobs.█use std::io;█use std::path::PathBuf;█use std::sync::Arc;█use std::time::Duration;█use spt_net::net::replicate::RegistryFeedRecord;█use spt_store::subnet::SubnetStore;█use crate::registryhost::RegistryHost;█use super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};█/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,█/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the█/// prior generation one-deep for the re-seed grace) and clear its pending entry.█/ [...9948ch elided...] 4] `pre_round` runs the full node-local sweep once per due█// round: a scheduled seed rotation fires (epoch bumps) and adverts are█// recomputed each call (a fresh epoch per advertisement - the once-per-round█// re-stamp). The per-step ORDER (evict -> rotate -> advertise) is preserved█// verbatim from the pre-seam inline loop; each step keeps its own█// registryhost-side unit coverage.█#[test]█fn pre_round_sweeps_and_refreshes_adverts_each_round() {█with_home(|home| {█// A served subnet plus one advertisable Self perch.█let owlery = home.join(\"owlery\");█let id = \"adv-ag\";█let p = spt_store::perch::resolve_perch_path_in(█...█);█...█});█}█}█[Showing lines 1-263 of 334. Use :264 to continue]\u000f█</out>█# Assistant ¶█_**Grep logs for event timing**█**Analyzing periodic task timing and clustering**_█# Tool call ¶█//Reading daemon cadence config█read(path=\"C:/Users/decid/AppData/Local/spt-core/daemon.json\", selector=\"raw\")█<out>█\u000e{█\"pulse_period_ms\": 5000,█\"protection_window_ms\": 2000,█\"crash_grace_ms\": 2000,█\"full_auto_update\": false,█\"relay\": \"n0\",█\"peer_pump\": true,█\"registry_pump_period_ms\": 30000,█\"registry_evict_after_ms\": 300000,█\"notif_pump_period_ms\": 15000,█\"sync_pull_period_ms\": 60000,█\"update_check_period_ms\": 3600000,█\"detached_subnets\": [],█\"worker_reap_ttl_secs\": 86400,█\"startup_endpoints\": [█{█\"id\": \"mobile-gw\",█\"adapter\": \"mobile\",█\"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"█},█{█\"id\": \"lia\",█\"adapter\": \"claude-spt\",█\"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"█}█]█}\u000f█</out>█# Tool call ¶█//Reading pump health snapshot█read(path=\"C:/Users/decid/AppData/Local/spt-core/identity/pump-health.json\", selector=\"raw\")█<out>█\u000e{█\"peers_total\": 6,█\"live_peers\": 4,█\"last_dial_ok_ms\": 1784292578982,█\"last_registry_admit_ms\": 1784292937885,█\"failing\": {█\"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\": \"quic-connect\",█\"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\": \"quic-connect\"█},█\"targets\": [█\"5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce\",█\"c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573\",█\"cfd9fc552b44f9da7b7146baee3eb18c7b7514e01c5ad06e367d3f15765c3f6f\",█\"ecb39e40e3400d46ddca73914685fb91b2d82969119e42293408511e27e55657\",█\"f15d837bdeff3d56f5d5a21bdcd6acb9632a764cb13c477cad966ccb811be884\",█\"f7afcc8292cbc441e8fe2002299cd37cde2a315e4073b47cee61c66f1473eda4\"█]█}\u000f█</out>█# Tool call ¶█//Reading project index stats█read(path=\"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json\", selector=\"raw\")█<out>█\u000e{\"generated_ms\":1784292861265,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784292861265,\"last_duration_ms\":1606,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":13,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":8,\"derivations\":11},\"cumulative\":{\"branch_enumerations\":2,\"tree_scans\":8,\"derivations\":11}}\u000f█</out>█# Tool call ¶█//Extracting current pump events█grep(pattern=\"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|=== spt broker stderr - generation 0 - pid 88008 ===█2|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█3|DOCS_SERVER_UP: http://localhost:5474█4|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█...█12|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*13|=== spt brain stderr - generation 0 - pid 63116 ===█*14|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)█15|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*16|BRAIN_PROMOTED: candidate v64 signalled ready (generation 0) - swap accepted█17|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415181 mono_ms=817 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█18|CONN_LIFECYCLE: conn=8 role=brain wall_ms=1784292415200 mono_ms=837 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█19|DAEMON_RESTART_RESUME_REFUSED:deployah: custody pid still alive - refusing to re-run over a live process (dup guard)█...█46|CONN_LIFECYCLE: conn=1 role=brain controller session=3 endpoi [...15221ch elided...] R_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372█*2592|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292806281 mono_ms=219372█2593|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█2594|CONN_LIFECYCLE: conn=1050 role=brain wall_ms=1784292807156 mono_ms=392792 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█2595|CONN_LIFECYCLE: conn=1051 role=brain wall_ms=1784292810351 mono_ms=395987 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Tool call ¶█//Extracting prior pump timing█grep(pattern=\"PUMP_|BRAIN_UP|BRAIN_NET|DISPATCH_EV|DISPATCH_LOOP|REGISTRY_|ROSTER_GHOST|SEED_ROTATED|generation\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|=== spt broker stderr - generation 0 - pid 72488 ===█2|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█3|DOCS_SERVER_UP: http://localhost:5474█4|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█5|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█*6|=== spt brain stderr - generation 0 - pid 70372 ===█*7|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 70372, generation 0, start-reason cold)█8|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784265242223 mono_ms=103 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█9|PAIR_MEET_UP:SPT_DEV step=59475508 id=42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398 addr=EndpointAddr { id: PublicKey(42a00983dd0754fcd4b859394af1939a1c9843e5efc8346d3e2ca5ca249d7398), addrs: {Ip(100.68.35.65:52399), Ip(192.168.1.81:52399)} }█10|PAIR_MEET_UP:BIGNET step=59475508 id=5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d addr=EndpointAddr { id: PublicKey(5e3b45885dec1640073206433762bde7ef2b4ef3660cf5c8df185695cba64b3d), addrs: {Ip(100.68.35.65:52400), Ip(192.168.1.81:52400)} }█...█15|CONN_LIFECYCLE: conn=4 role=brain controller session=1 endpoint=li [...39285ch elided...] 9█*26050|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784270286781 mono_ms=4961860█26051|CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█26052|CONN_LIFECYCLE: conn=10800 role=brain wall_ms=1784270287269 mono_ms=5045136 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█26053|CONN_LIFECYCLE: conn=10801 role=brain wall_ms=1784270291678 mono_ms=5049546 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█Searched only the first 4MB of large files (matches past the 4MB window are not shown; use `read` for the rest): ..\\..\\..\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log.1\u000f█</out>█# Tool call ¶█//Checking poison telemetry█grep(pattern=\"poison|subscriber busy|replay halted|lease canceled|breaker-trip|oneway-strike-retire\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log.1\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/logs/█## daemon.stderr.log█7|PAIR_MEET_UP:BIGNET step=59476413 id=0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542 addr=EndpointAddr { id: PublicKey(0f73daa0c48d9ba6b3d038be1f77a14080ebada2bac58828e07cd05ea64f2542), addrs: {Ip(100.68.35.65:50302), Ip(192.168.1.81:50302)} }█*8|CONN_LIFECYCLE: conn=2 role=brain wall_ms=1784292414784 mono_ms=420 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*9|CONN_LIFECYCLE: conn=3 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*10|CONN_LIFECYCLE: conn=4 role=brain wall_ms=1784292414790 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*11|CONN_LIFECYCLE: conn=5 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*12|CONN_LIFECYCLE: conn=6 role=brain wall_ms=1784292414791 mono_ms=427 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█13|=== spt brain stderr - generation 0 - pid 63116 ===█14|BRAIN_UP: connected to broker spt-daemon-broker-78bf18a9fd96fdc6.sock (pid 63116, generation 0, start-reason cold)█*15|CONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292415141 mono_ms=778 event=write-start [REQ-C [...7904ch elided...] ONN_LIFECYCLE: conn=11 role=brain wall_ms=1784265242747 mono_ms=628 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*42|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784265242747 mono_ms=628 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]█43|PUMP_IPC_READER: spawned█44|PUMP_IPC_READER: spawned█*45|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242748 mono_ms=629 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*46|CONN_LIFECYCLE: conn=14 role=brain wall_ms=1784265242749 mono_ms=629 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█Searched only the first 4MB of large files (matches past the 4MB window are not shown; use `read` for the rest): ..\\..\\..\\AppData\\Local\\spt-core\\logs\\daemon.stderr.log.1\u000f█</out>█# Tool call ¶█//Finding registry feed logging█grep(pattern=\"eprintln!|REGISTRY_|Served\\\\(|registry feed|feed:\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"700-1050\", case=true, gitignore=true, skip=null)█<out>█\u000e 860| Err(e) if e.to_string().contains(\"no such stream\") => {█*861| return WorkerReport::bare(DispatchOutcome::Served(█862| \"terminal pre-serve: row already gone\".into(),█863| ))█864| }█...█889| return WorkerReport {█*890| outcome: DispatchOutcome::Served(\"finished attach: terminal, retired unserved\".into()),█891| family: Some(family),█892| endpoint,█893| };█...█928| ) {█*929| Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█930| Err(e) => DispatchOutcome::Failed(e.to_string()),█931| }█932| }█...█936| match serve_update(&mut brain, stream_id, origin, 0, &cache, &roster) {█*937| Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█938| Err(e) => DispatchOutcome::Failed(e.to_string()),█939| }█940| }█...█1004| ) {█*1005| Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█1006| Err(e) => DispatchOutcome::Failed(e.to_string()),█1007| },█1008| None => {█...█10 [...201ch elided...] }█1013| }█1014| }█...█1029| ) {█*1030| Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█1031| Err(e) => DispatchOutcome::Failed(e.to_string()),█1032| }█1033| }█...█1035| let _ = brain.net_stream_send(stream_id, &[], None, true);█*1036| DispatchOutcome::Served(\"xfer refused: no endpoint named\".into())█1037| }█1038| }█1039| }█...█1047| match crate::resthost::serve_rest(&mut brain, stream_id, origin, knob) {█*1048| Ok(out) => DispatchOutcome::Served(format!(\"{out:?}\")),█1049| Err(e) => DispatchOutcome::Failed(e.to_string()),█1050| }\u000f█</out>█# Assistant ¶█_**Analyzing log lines around generation1 event**█**Extracting stream-sub-attach events**_█# Tool call ¶█//Extracting stream attach cadence█grep(pattern=\"event=stream-sub-attach\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-2800\", case=true, gitignore=false, skip=null)█<out>█\u000e 1023|CONN_LIFECYCLE: conn=412 role=brain wall_ms=1784292560816 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1024|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 wall_ms=1784292560816 mono_ms=146452 event=stream-sub-attach stream=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█1025|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560816 mono_ms=146452 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█1026|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d wall_ms=1784292560835 mono_ms=146471 event=controller-replaced session=1 new_conn=412 [REQ-CONN-POISON-ATTRIBUTION]█1027|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560835 mono_ms=146471 event=controller-attach session=1 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█...█1030|CONN_LIFECYCLE: conn=414 role [...49163ch elided...] 70 mono_ms=220506 event=stream-sub-attach stream=237 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█1567|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634870 mono_ms=220506 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1568|CONN_LIFECYCLE: conn=630 role=brain stream-subscriber stream=237 wall_ms=1784292634872 mono_ms=220508 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1569|CONN_LIFECYCLE: conn=631 role=brain wall_ms=1784292634873 mono_ms=220509 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█...█1574|CONN_LIFECYCLE: conn=633 role=brain wall_ms=1784292638482 mono_ms=224118 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 1-341 of 895 (49.9KB limit). Use :342 to continue]\u000f█</out>█# Tool call ¶█//Extracting transport cadence█grep(pattern=\"event=(write-start|transport-close|stream-sub-release)\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-1800\", case=true, gitignore=false, skip=null)█<out>█\u000e*1000|CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1001|CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1002|CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1003|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]█*1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19... wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1005|BRAI [...41218ch elided...] 1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0█1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0█*1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Tool call ¶█//Finding stream table complexity█grep(pattern=\"pub fn net_streams|KIND_NET_STREAMS|net_streams\\\\(|streams_info|held_streams|list_stream\", path=\"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brain.rs█50| KIND_NET_SENT,█*51| KIND_NET_STATUS, KIND_NET_STATUS_REPLY, KIND_NET_STREAMS, KIND_NET_STREAMS_REPLY,█52| KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,█53| KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,█54| KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,█...█845| }█*846| KIND_NET_STREAMS_REPLY => {█847| let ev: NetStreamsReply = serde_json::from_value(env.payload)█848| .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;█849| return Ok(BrokerEvent::NetStreams(ev));█...█1510| /// finds streams (incl. peer-initiated ones) that arrived while it was down.█*1511| pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {█*1512| self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;█1513| loop {█1514| match self.read_event()? {█1515| BrokerEvent::NetStreams(ev) => return Ok(ev),█## broker.rs█65| KIND_BROKER_IMAGE, KIND_BROKER_IMAGE_REPLY, KIND_STALL_EVICTS, KIND [...610ch elided...] => {█*3298| if let Err(msg) = self.dispatch_net_streams(&send) {█3299| send_error(&send, &msg);█3300| }█3301| }█...█4722| /// brain uses to find streams that arrived while it was down.█*4723| fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {█4724| let host = self.net.get().ok_or(\"net disabled\")?;█4725| // SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-█4726| // initiated rows never cross the IPC - the dispatcher only ever█...█4730| let frame = Envelope::new(█*4731| KIND_NET_STREAMS_REPLY,█4732| serde_json::to_value(NetStreamsReply {█4733| streams: host.dispatch_stream_infos(),█4734| })\u000f█</out>█# Tool call ¶█//Reading brain heartbeat calls█read(path=\"crates/spt-daemon/src/brain.rs\", selector=\"1780-1900\")█<out>█\u000e /// cross-operator guard). That silent re-take fires NO `Displaced` notice and█/// ORPHANS the prior local controller (the broker stops writing its output but█/// does not close the conn), FREEZING the session immediately; a >15s█/// `stall_evict_controller` is a separate, later, output-dependent symptom█/// (only an actively-producing stolen session blocks long enough to evict).█/// That is correct for `attach` (a serve loop that WILL drive the session), but█/// it is why a brain-respawn must NOT resume-re-attach as Control - it would█/// silently STEAL every local/free controller (incl. the operator's local█/// `spt rc`) it never drains, freezing the session█/// (REQ-BRAIN-RESUME-NO-CONTROL-STEAL). [`Brain::resume_sessions`] re-attaches█/// as Viewer instead; Control is reserved for sessions the daemon brain drives.█// [doc->REQ-BRAIN-RESUME-NO-CONTROL-STEAL]█fn subscribe(&mut self, session_id: u64, from_seq: u64) -> io::Result<()> {█self.subscribe_with(session_id, from_seq, AttachIntent::Control, 0, None)█}█/// Release this connection's controller/viewer role on `session_id`█/// (REQ-RCVIEW-1) - the explici [...4943ch elided...] .recv_timeout(remaining) {█Ok(framed) => framed,█Err(RecvTimeoutError::Timeout) => Err(io::Error::new(█io::ErrorKind::TimedOut,█\"brain IPC read deadline elapsed\",█)),█Err(RecvTimeoutError::Disconnected) => Err(io::Error::new(█io::ErrorKind::UnexpectedEof,█\"brain IPC reader thread ended (conn closed)\",█)),█}█}█None => frames.recv().map_err(|_| {█io::Error::new(█...█)█})?,█},█}█}█[Showing lines 1779-1903 of 2370. Use :1904 to continue]\u000f█</out>█# Tool call ¶█//Reading registry advert body█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"459-735,742-850\")█<out>█\u000e /// Scan the owlery and (re-)advertise every self perch into every member█/// subnet it is visible in, each row stamped with a fresh epoch. Returns█/// the updates to push to peers (the node's own rows only - peers' rows█/// reconverge from their own re-advertisement, no transitive gossip in█/// v1: trust is pairwise per subnet, a relayed third-party row would█/// carry an origin the receiver can't gate honestly).█// [impl->REQ-INST-7]█pub fn advertise_local(&self, owlery: &Path) -> Vec<RegistryFeedRecord> {█let subnets = SubnetStore::load();█let mut vis = VisibilityStore::load();█// First-join home adoption (D9-5, REQ-INST-15): within one█// advertisement cadence of the node's first join (a pair lands the█// subnet record; no pairing-protocol threading needed), unhomed Self█// perches adopt the sole subnet + seed their sync scope. Strictly█// adopt-if-unset; a multi-subnet store adopts nothing.█// [impl->REQ-INST-15]█if !spt_store::home::adopt_for_unset(owlery, &subnets, &mut vis).is_empty() {█let _ = vis.save();█}█let vis = vis;█// The node-l [...18357ch elided...] ots(&self) {█self.snapshot_writes█.fetch_add(1, std::sync::atomic::Ordering::Relaxed);█let regs = self.regs.lock().unwrap();█if regs.is_empty() {█return;█}█if std::fs::create_dir_all(&self.snapshot_dir).is_err() {█return;█}█for (subnet, reg) in regs.iter() {█let Ok(json) = serde_json::to_vec_pretty(reg) else {█continue;█};█let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &json);█}█drop(regs);█// The heard-map mirror (M7 D2 hybrid liveness). `.meta`, not `.json`:█// the snapshot reader globs `<subnet>.json`, so this can never shadow█// a subnet (even one literally named \"heard\").█...█}\u000f█</out>█# Tool call ¶█//Finding livehost interval constant█grep(pattern=\"LIVE_RECONCILE_INTERVAL_MS\", path=\"crates/spt-daemon/src/livehost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 49|/// (mirrors [`crate::shellwake::RECONCILE_INTERVAL_MS`]).█*50|pub const LIVE_RECONCILE_INTERVAL_MS: u64 = 5_000;█51|█52|/// One brain-hosted live lifecycle: its config-paced pulse-driver thread and the█53|/// held stop flag (tripped to un-host on an offline-transition). F-030 W3: the█...█133|/// One reconcile sweep - the brain's live host-set invariant holder, run at boot█*134|/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the█135|/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):█136|///█137|/// - **un-host** (tabled ∧ ¬online) - stop the driver + de-table (exit guard: a█...█1030|/// Spawn the brain's live host: one thread sweeping [`reconcile_once`] at boot█*1031|/// and every [`LIVE_RECONCILE_INTERVAL_MS`] until `stop`. The registered set +█1032|/// config are re-read each sweep (adapter / pulse-period changes land between█1033|/// ticks). Mirror of [`crate::shellwake::spawn_wake_host`]; the stop flag is held█1034|/// for symmetry - the threads die with the brain process and the next brain█...█1068| // reap-driver in ISOLATION. This loop's own `query_live_session_endpoints()`█*1069| // -> `brain.sessions()` (every LIVE_RECONCILE_INTERVAL_MS) would OTHERWISE█1070| // drive the same broker reap and mask the fix (todlando 2026-07-09). Setting█1071| // it faithfully REPRODUCES THE FIELD'S livehost-silent update-trial condition█1072| // (PIN Q2: the trial-brain livehost's first reconcile tick landed around the█...█1106| // Sleep in slices so a stop lands promptly.█*1107| let mut left = LIVE_RECONCILE_INTERVAL_MS;█1108| while left > 0 && !stop.load(Ordering::SeqCst) {█1109| let step = left.min(100);█1110| std::thread::sleep(Duration::from_millis(step));\u000f█</out>█# Assistant ¶█_**Analyzing startup and failure timings**█**Investigating stream table growth and retirement**_█# Tool call ¶█//Reading stream enumeration filter█read(path=\"crates/spt-daemon/src/nethost.rs\", selector=\"1850-1930,2050-2180\")█<out>█\u000e pub fn send_stream(&self, stream_id: u64, bytes: &[u8], finish: bool) -> io::Result<()> {█...█}█/// A stream's serve lease (ADR-0038 Amendment fix 4) - the cancellation█/// handle the DAEMON-LIFECYCLE C2 work consumes. `None` = no such stream.█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█pub fn stream_lease(&self, stream_id: u64) -> Option<Arc<StreamLease>> {█let streams = self.shared.streams.lock().unwrap();█streams█.get(&stream_id)█.map(|e| Arc::clone(&e.log.lock().unwrap().lease))█}█/// Every held stream's info - the query a re-attaching brain uses to find█/// streams (including peer-initiated ones that arrived while it was down).█/// Retired rows are hidden (ADR-0038 A): their exchange is over, and this█/// enumeration is exactly what a future dispatcher generation would replay.█pub fn stream_infos(&self) -> Vec<NetStreamInfo> {█self.stream_infos_filtered(true)█}█/// The DISPATCH enumeration (ADR-0040 decision 2,█/// REQ-STREAM-INFOS-SERVER-FILTER): `stream_infos` with█/// `initiated_locally` rows excluded SERVER-SIDE, before any clone or█/// serialization - th [...7943ch elided...] tream█// (the PresenceLog mirror): the seat's writer drains the replay█// before any live event, conn I/O outside the mutex. A replay write█// failure poisons the seat; the next push halt-and-removes it - the█// brain re-subscribes from its cursor.█// [impl->REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE]█let _ = self█.shared█.presence█.lock()█.unwrap()█.begin_attach(Arc::clone(&sub), from_seq); // busy refusal: quiet, as before█}█/// Detach `sub` from presence iff it is the current subscriber (brain█/// disconnect cleanup; the log + its ring persist).█pub(crate) fn detach_presence_sub(&self, sub: &SharedSend) {█self.shared.presence.lock().unwrap().detach_if(sub);█}\u000f█</out>█# Tool call ¶█//Reading broker stream dispatch█read(path=\"crates/spt-daemon/src/broker.rs\", selector=\"4710-4750\")█<out>█\u000e fn dispatch_net_stream_send(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {█...█match req.op_id {█...█Some(op) => {█...█let frame = Envelope::new(█...█serde_json::to_value(NetSent {█stream_id: req.stream_id,█op_id: op,█applied_now: outcome == Outcome::Applied,█})█.expect(\"NetSent serializes\"),█);█send_frame(send, &frame);█Ok(())█}█}█}█/// List every stream the broker holds (D4b) - the query a re-attaching█/// brain uses to find streams that arrived while it was down.█fn dispatch_net_streams(&self, send: &SharedSend) -> Result<(), String> {█let host = self.net.get().ok_or(\"net disabled\")?;█// SERVER-SIDE eligibility filter (ADR-0040 decision 2): locally-█// initiated rows never cross the IPC - the dispatcher only ever█// skipped them client-side, and serializing the full local history█// every 100ms poll was the O(history) enumeration cost of KH 7.44.█// [impl->REQ-STREAM-IN [...286ch elided...] frame(send, &frame);█Ok(())█}█/// Release the calling connection's subscriber seat on a stream (ADR-0040█/// decision 5) - seat removed, writer thread stopped and joined, cursor█/// dropped caller-side. Identity-checked: only the caller's own seat.█// [impl->REQ-SEAT-LIFETIME-BOUNDED]█fn dispatch_net_stream_unsubscribe(█&self,█env: Envelope,█send: &SharedSend,█) -> Result<u64, String> {█let req: NetStreamUnsubscribeReq = serde_json::from_value(env.payload)█.map_err(|e| format!(\"bad net-stream-unsubscribe payload: {e}\"))?;█let host = self.net.get().ok_or(\"net disabled\")?;█let removed = host.unsubscribe_stream(req.stream_id, send);█...█}█[Showing lines 4709-4753 of 6771. Use :4754 to continue]\u000f█</out>█# Tool call ¶█//Reading net stream client call█read(path=\"crates/spt-daemon/src/brain.rs\", selector=\"1495-1530\")█<out>█\u000e pub fn net_stream_send(█...█) -> io::Result<Option<NetSent>> {█self.send(█...█)?;█if op.is_none() {█return Ok(None);█}█let want_seq = op.map(|o| o.seq);█let deadline = self.call_deadline();█loop {█match self.read_event_until(deadline)? {█BrokerEvent::NetSent(ev) if Some(ev.op_id) == want_seq => return Ok(Some(ev)),█BrokerEvent::Error { message } => return Err(io::Error::other(message)),█_ => continue,█}█}█}█/// List the streams the broker holds (D4b) - how a re-attaching brain█/// finds streams (incl. peer-initiated ones) that arrived while it was down.█pub fn net_streams(&mut self) -> io::Result<NetStreamsReply> {█self.send(KIND_NET_STREAMS, serde_json::Value::Null)?;█loop {█match self.read_event()? {█BrokerEvent::NetStreams(ev) => return Ok(ev),█BrokerEvent::Error { message } => return Err(io::Error::other(message)),█_ => continue,█}█}█}█/// Retire a completed stream row from redispatch eligibility (ADR-0038 A).█/// The dispatcher calls this when a serve loop runs to completion, so no█/// future dispatcher generation rediscovers and replays the stream█/// (KNOWN-HAZARDS 7.41). Best-effort at the caller: an older broker█/// answers `error` (KH-2.3 N-1 window - retirement then waits for the█/// broker to cycle onto the new binary).█// [impl->REQ-REDISPATCH-FINISHED-RETIRE]█pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {█self.net_stream_retire_with(stream_id, false)█}█/// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical█[Showing lines 1494-1533 of 2370. Use :1534 to continue]\u000f█</out>█# Tool call ¶█//Finding dispatcher retire implementation█grep(pattern=\"net_stream_retire|dispatch_net_stream_retire|retire_terminal|KIND_NET_STREAM_RETIRE\", path=\"crates/spt-daemon/src/brain.rs;crates/spt-daemon/src/broker.rs;crates/spt-daemon/src/nethost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brain.rs█52| KIND_NET_STREAM_DATA, KIND_NET_STREAM_EOF, KIND_NET_STREAM_OPEN, KIND_NET_STREAM_OPENED,█*53| KIND_NET_STREAM_OPENER, KIND_NET_STREAM_OPENER_REPLY, KIND_NET_STREAM_RETIRE, KIND_NET_STREAM_RETIRED,█54| KIND_NET_STREAM_UNSUBSCRIBE, KIND_NET_STREAM_UNSUBSCRIBED,█55| KIND_MET_MEMBER, KIND_NET_STREAM_SEND, KIND_NET_STREAM_SUBSCRIBE, KIND_OUTPUT, KIND_PAIR_CODE_SUBMIT, KIND_PAIR_JOIN, KIND_PAIR_JOINED, KIND_PAIR_MEET,█56| KIND_RESIZE, KIND_SESSIONS, KIND_SESSIONS_REPLY, KIND_SIZE, KIND_SPAWN, KIND_SPAWNED,█...█1528| // [impl->REQ-REDISPATCH-FINISHED-RETIRE]█*1529| pub fn net_stream_retire(&mut self, stream_id: u64) -> io::Result<bool> {█*1530| self.net_stream_retire_with(stream_id, false)█1531| }█1532|█1533| /// TERMINAL retire (ADR-0040 decision 1): eligibility retire PLUS physical█...█1540| // [impl->REQ-ONEWAY-STREAM-TERMINAL]█*1541| pub fn net_stream_retire_terminal(&mut self, stream_id: u64) -> io::Result<bool> {█*1542| self.net_stream_retire_with(stream_id, true)█1543| }█1544|█*1545| fn net_stream_retire_with(&mut self, stream_id: u64, terminal: bool) -> io::Result<bool> {█1546 [...1276ch elided...] if let Err(msg) = self.dispatch_net_stream_retire(env, &send) {█3304| send_error(&send, &msg);█3305| }█3306| }█...█4770| // [impl->REQ-REDISPATCH-FINISHED-RETIRE]█*4771| fn dispatch_net_stream_retire(&self, env: Envelope, send: &SharedSend) -> Result<(), String> {█4772| let req: NetStreamRetireReq = serde_json::from_value(env.payload)█4773| .map_err(|e| format!(\"bad net-stream-retire payload: {e}\"))?;█4774| let host = self.net.get().ok_or(\"net disabled\")?;█...█4784| let frame = Envelope::new(█*4785| KIND_NET_STREAM_RETIRED,█4786| serde_json::to_value(NetStreamRetired {█4787| stream_id: req.stream_id,█4788| removed,\u000f█</out>█# Tool call ¶█//Finding one-way stream terminal source█grep(pattern=\"one.?way|terminal|finished|retire\", path=\"crates/spt-daemon/src/nethost.rs\", selector=\"1200-2300\", case=false, gitignore=true, skip=null)█<out>█\u000e 1863| /// streams (including peer-initiated ones that arrived while it was down).█*1864| /// Retired rows are hidden (ADR-0038 A): their exchange is over, and this█1865| /// enumeration is exactly what a future dispatcher generation would replay.█1866| pub fn stream_infos(&self) -> Vec<NetStreamInfo> {█1867| self.stream_infos_filtered(true)█...█1887| .iter()█*1888| .filter(|(_, e)| !e.retired.load(std::sync::atomic::Ordering::SeqCst))█1889| .filter(|(_, e)| include_local || !e.initiated_locally)█1890| .map(|(id, e)| {█1891| let log = e.log.lock().unwrap();█...█1896| next_seq: log.next_seq,█*1897| finished: log.finished,█1898| initiated_locally: e.initiated_locally,█1899| floor_seq: log.floor_seq(),█1900| lifetime: e.lifetime,█...█1906| /// PHYSICAL bounded-lifetime gauges (ADR-0040, KH 7.44): `(rows held,█*1907| /// seats installed)` - retirement-blind on purpose: these count what the█1908| /// process actually retains (the resource truth the eligibility view█1909| /// hides), the `net [...3701ch elided...] try.log.lock().unwrap().opener_line();█...█2029| /// may have been lagging the sender at the backpressure cap). Returns█*2030| /// `(bytes, finished)`; `finished` => the read side ended (the poller closes).█*2031| /// `None` => no such stream. Empty bytes + `finished == false` => nothing pending.█2032| // [impl->REQ-SHELL-4]█2033| pub fn drain_stream(&self, stream_id: u64) -> Option<(Vec<u8>, bool)> {█2034| let entry = Arc::clone(self.shared.streams.lock().unwrap().get(&stream_id)?);█...█2268| // The BYTES are retained + drained in arrival order, framing-agnostic.█*2269| let (bytes, _finished) = log.drain();█2270| assert_eq!(█2271| bytes,█2272| b\"xa-much-larger-coalesced-read-carrying-many-logical-sender-writes\".to_vec()\u000f█</out>█# Tool call ¶█//Inspecting current stream activity tail█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"2500-2800\")█<out>█\u000eCONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1010 role=brain wall_ms=1784292791894 mono_ms=377529 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1011 role=brain wall_ms=1784292792057 mono_ms=377692 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mon\u000eo_ms=380938 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1012 role=brain wall_ms=1784292795303 mono_ms=380938 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1013 role=brain wall_ms=1784292795304 mono_ms=380939 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream=419 wall_ms=1784292795304 mono_ms=380939 event=stream-sub-attach stream=419 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1013 role=brain stream-subscriber stream= [...44055ch elided...] ream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=stream-sub-attach stream=472 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1136 role=brain stream-subscriber stream=471 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1138 role=brain stream-subscriber stream=472 wall_ms=1784292843264 mono_ms=428899 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1137 role=brain wall_ms=1784292843265 mono_ms=428900 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=1137 role=brain stream-subscriber stream=473 wall_ms=1784292843265 mono_ms=428900 event=stream-sub-attach stream=473 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 2499-2803 of 3774. Use :2804 to continue]\u000f█</out>█# Tool call ¶█//Reading registry snapshot sizes█read(path=\"C:/Users/decid/AppData/Local/spt-core/identity/registry\", selector=null)█<out>█\u000e.█- heard.meta█- BIGNET.json█- SPT_DEV.json█- BS-Resources.json 7.6KB 2d ago\u000f█</out>█# Assistant ¶█_**Parsing log timings for cause**_█# Tool call ¶█//Locating CPU sample evidence█grep(pattern=\"8\\\\.39|6\\\\.44|28\\\\.1|63\\\\.91|HFENDULEAM|bursty|24/90|27/90\", path=\".claude;docs;C:/Users/decid/AppData/Local/spt-core\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# .claude/█## doyle-to-todlando.md█40|█*41|Your b2 leg (SPT_ENDPOINT_ID perch-gated, label-only) matches the field evidence - both our live sends stamp cli@HFENDULEAM under installed v0.30.6, which predates it. perri rider (OWL_SESSION_ID unexported -> export restores detect leg a) noted; I'll carry that to perri when W4 merges.█42|█43|## Order of work (binding)█44|█## flynn-commune.md█6|<live-context>█*7|Agent identity: flynn, spt-mobile perch on node HFENDULEAM. Session ended via /exit with no task content - nothing to report.█8|</live-context>█## todlando-commune.md█1|<live-context>█*2|I am todlando, build-lane live agent on spt-core (HFENDULEAM; co-located: doyle=triage/gate, deployah=publish, perri=adapter, flynn=mobile, lia, hertz=roadblock-RCA). Operator: Reavo End.█3|█4|Standing working rules (burned-in / ruled):█5|- Messaging: `spt send <target>` for ALL agent traffic (SENT/QUEUED both = success, never retry). Long bodies from FILE, short printf-piped.█...█10|- Per-wave REQ stage flips ride IN build commits with evidence tags; re-home [impl->] tags when moving code.█*11|- hfenduleam = dev box + CI runner + gate box + live-daemon host: NO local suites while a CI t [...36346ch elided...] until W2 adds the arm).█35|█## MUSL-W3-DISPATCH-RULING.md█25|- clippy `--workspace --all-targets -D warnings`; `traceable-reqs check --json` exit 0 (`REQ-RELEASE-MUSL-ARTIFACT` +impl +unit +int).█*26|- Full `nextest --workspace` BOTH legs (Windows hfenduleam + Linux kitsubito) green - gnu/windows release/update/apply/propagate suites UNCHANGED (musl additive).█27|- **The int gate is a real cut**: assemble a **draft/test release** carrying the musl artifact, then on a **static musl binary running on a sub-2.39-glibc box**:█28| - `spt update fetch` -> gets the musl artifact (NO `NoArtifactForPlatform`)█29| - verifies SHA256 + Ed25519 signature **over the musl bytes**█Showing files 1-20 of 75+. Use skip=20 for the next page, or narrow paths/pattern.█[Some lines truncated to 512 chars]\u000f█</out>█# Tool call ¶█//Finding net status gauges█grep(pattern=\"stream_rows|stream_seats|NetStatusReply|stream_counts\", path=\"crates/spt-daemon/src;crates/spt/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brain.rs█41| KillReq, NetDialReq, NetDialed, NetPresenceEvent, NetPresenceSubscribeReq, NetSent,█*42| NetStatusReply, NetStreamData, NetStreamEof, NetStreamOpenReq, NetStreamOpened, NetStreamSendReq,█43| NetStreamSubscribeReq, NetStreamsReply, NetStreamOpenerReply, NetStreamOpenerReq, NetStreamRetireReq, NetStreamRetired, NetStreamUnsubscribeReq, NetStreamUnsubscribed, OutputEvent, MetMember, PairCodeSubmit, PairJoinReply, PairJoinReq, PairMeetReq, ResizeReq,█44| SessionsReply, SizeEvent, SpawnConflict, SpawnReq, Spawned, StreamLifetime, SubscribeOutcome,█45| SubscribeReq, SubscribedReply, ViewerEvictedEvent,█...█155| /// The broker-owned net endpoint's status (a `net-status` reply, D4a).█*156| NetStatus(NetStatusReply),█157| /// A net dial durably landed - fresh or deduped (D4a).█158| NetDialed(NetDialed),█159| /// A NON-BLOCKING dial submit was accepted and its concurrent dial spawned█...█822| KIND_NET_STATUS_REPLY => {█*823| let ev: NetStatusReply = serde_json::from_value(env.payload)█824| .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;█825| [...3801ch elided...] s A2's late release\");█3160| assert!(host.unsubscribe_stream(owner, &b), \"B releases its own\");█3161| }█...█3176| host.subscribe_stream(shell, Arc::clone(&sub), 0).expect(\"subscribe\");█*3177| let (rows_before, seats_before) = host.stream_counts();█3178| assert_eq!(seats_before, 1);█3179| assert!(host.retire_stream(shell));█*3180| let (rows_after, seats_after) = host.stream_counts();█3181| assert_eq!(█3182| rows_after, rows_before,█3183| \"plain retire is eligibility-only: the physical entry stays\"█...█3188| assert!(host.retire_stream_terminal(owner));█*3189| let (rows_terminal, _) = host.stream_counts();█3190| assert_eq!(█3191| rows_terminal,█3192| rows_after - 1,\u000f█</out>█# Tool call ¶█//Finding status gauge output█grep(pattern=\"stream_rows|stream_seats|net_stream|rows held|seats\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log;C:/Users/decid/AppData/Local/spt-core\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/█## docs/█### llms-full.txt█3160|█*3161|One endpoint, several seats. `sergey` is a single identity; an **instance** of█3162|sergey is his presence on one node. The registry tracks every instance's node█3163|and state (active / dormant / suspended / offline), and the same mind syncs█3164|to wherever he sits.█### print.html█2932|<h1 id=\"instances\"><a class=\"header\" href=\"#instances\">Instances</a></h1>█*2933|<p>One endpoint, several seats. <code>sergey</code> is a single identity; an <strong>instance</strong> of█2934|sergey is his presence on one node. The registry tracks every instance's node█2935|and state (active / dormant / suspended / offline), and the same mind syncs█2936|to wherever he sits.</p>█### searchindex-ef47b3c9.js█*1|window.search = Object.assign(window.search, JSON.parse('{\"doc_urls\":[\"index.html#spt-developer-docs\",\"index.html#install\",\"index.html#how-these-docs-are-organized\",\"index.html#for-ai-agents-reading-this\",\"quickstart/messaging.html#quickstart-two-agents-exchange-a-message\",\"quickstart/messaging.html#1-install\",\"quickstart/messaging.html#2-optional-link-two-machines\",\"quickstart/messaging.html#3-hand-your-rec [...661ch elided...] his presence on one node. The registry tracks every instance's node█5|and state (active / dormant / suspended / offline), and the same mind syncs█6|to wherever he sits.█## tracked/projects/github-com-bigscreenvr-website/webbie/█### project-context.md█5|█*6|Assistant clarified: no separate account type needed - screen shown is the Zero Trust plan picker; a Free plan ($0, up to 50 users) covers Access for step 4. Caveat: Cloudflare requires a payment method on file to activate Zero Trust even at $0, though nothing charges at ≤50 seats (expected usage ~5-10).█7|█8|Two paths offered, awaiting user decision:█9|- **Path A (recommended):** click \"Choose a plan\" -> select Free plan, proceed with step 4 as written. Only blocker is card-on-file requirement.█[Some lines truncated to 512 chars]\u000f█</out>█# Tool call ¶█//Reading pump due kernel█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"340-520\")█<out>█\u000e█/// Observation hooks. `on_pull` fires after every completed sync pull -█/// the conflict surface (ADR-0013) and the E2E's probe.█pub struct PumpHooks {█pub on_pull: OnPull,█}█impl Default for PumpHooks {█/// The production hook: conflicts are loud, never silent - the artifacts█/// already persist (hazard 6.6); the reconcile turn runs at activation.█fn default() -> PumpHooks {█PumpHooks {█on_pull: Box::new(|peer, report| {█for (branch, file) in report.conflicts() {█eprintln!(\"SYNC_CONFLICT:{peer}:{branch}:{file}\");█}█}),█}█}█}█/// The pump-worker seam (arch-review rev 2 card 1): each cadenced leg -█/// registry / notif / sync / update - is a [`PumpWorker`] the pump schedules█/// (cadence + wake markers -> the pure [`due`] kernel) and fans out per peer█/// (per-subnet × per-roster-member). The pump owns *when* and *toward whom*;█/// the worker owns *what* - its node-local `pre_round` and its `peer_step`.█///█/// **KH 7.4 - never an LLM-bearing worker.** A pump worker is cadenced,█/// fire-and-forget peer IO. LLM-bearing work (the bounded Psyche reconcile█/// turn) runs a [...5994ch elided...] cache█/// row; the next tick redials - conns are rebuilt freely, nothing leaks█/// because the broker's closed-watcher reaps dead conns).█///█/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):█/// heartbeat -> poll every worker's wake -> the [`due`] kernel -> each due█/// worker's `pre_round` (once, before any peer_step) -> per-subnet × per-peer█/// (`ensure_conn` -> each due worker's `peer_step` in fan-out order,█/// abort-on-first-fail) -> mark-after-round with a POST-round instant. No leg█/// logic lives here - the shell owns only *when* and *toward whom*.█pub fn run_peer_pump(█broker_name: &str,█registry: Arc<RegistryHost>,█paths: &PumpPaths,█resolver: PeerResolver,█...█) -> io::Result<()> {█...█}█[Showing lines 339-523 of 2054. Use :524 to continue]\u000f█</out>█# Tool call ¶█//Reading dispatch worker classification█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"810-950,1050-1160\")█<out>█\u000efn line_endpoint(family: StreamFamily, line: &serde_json::Value) -> Option<String> {█...█line.get(key)█...█.map(str::to_string)█}█/// A worker's report: the outcome plus the telemetry keys it resolved█/// (family + endpoint, once the opener classified) - Amendment fix 9.█struct WorkerReport {█outcome: DispatchOutcome,█family: Option<StreamFamily>,█endpoint: Option<String>,█}█impl WorkerReport {█fn bare(outcome: DispatchOutcome) -> WorkerReport {█WorkerReport {█outcome,█family: None,█endpoint: None,█}█}█}█#[allow(clippy::too_many_arguments)]█fn worker(█broker_name: &str,█stream_id: u64,█origin: &str,█floor_seq: u64,█finished: bool,█paths: &DispatchPaths,█registry: &RegistryHost,█) -> WorkerReport {█if take_injected_transient() {█return WorkerReport::bare(DispatchOutcome::Failed(█\"injected transient worker-start failure (test valve)\".into(),█));█}█if take_injected_seatblocked() {█return WorkerReport::bare(DispatchOutcome::Failed(█\"injected subscriber busy failure (test valve)\".into(),█));█}█let line [...9334ch elided...] }) if sid == stream_id => {█if let Some(batch) = acc.push(decoder.push(&bytes)) {█merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);█}█}█Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█if let Some(batch) = acc.finish() {█merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);█}█return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));█}█Ok(BrokerEvent::Error { message }) => return DispatchOutcome::Failed(message),█Ok(_) => {}█Err(e) => return DispatchOutcome::Failed(e.to_string()),█}█}█}\u000f█</out>█# Tool call ¶█//Finding registry receive batching█grep(pattern=\"serve_registry|apply_feed_batch|RegistryDecoder|RegistryFeedRecord|net_stream_unsubscribe|retire_terminal\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 66|use spt_net::net::replicate::{█*67| FeedDecoder as RegistryDecoder, NodeLabelUpdate, RegistryFeedRecord, RegistryUpdate,█68|};█69|use spt_net::net::wanmsg::{WanDecoder, WanReply};█70|use spt_store::contextstore::ContextStore;█...█642| };█*643| let (state, retire_terminal) = outcome_transition(█644| &outcome,█645| report.family,█646| attempts,█...█654| // [impl->REQ-REGISTRY-REPLAY-BOUNDED]█*655| if retire_terminal {█656| if let Ok(mut retire_brain) = connect(&name) {█*657| let _ = retire_brain.net_stream_retire_terminal(stream_id);█658| }█659| eprintln!(█660| \"{}\",█...█942| StreamFamily::WanMsg => serve_wan_feed(&mut brain, stream_id, origin, paths, registry),█*943| StreamFamily::Registry => serve_registry_feed(&mut brain, stream_id, origin, registry),█944| StreamFamily::Attach => {█945| // The gate subject is the session's OWNING endpoint, resolved█946| // from the broker's table (the spawn's label) [...1732ch elided...] 3| RegistryFeedRecord::Instance(RegistryUpdate {█1864| subnet: \"home\".into(),█1865| endpoint_id: id.into(),█1866| instance: spt_net::net::registry::Instance {█...█1885| let lbl = || {█*1886| RegistryFeedRecord::NodeLabel(NodeLabelUpdate {█1887| subnet: \"home\".into(),█1888| node: \"bb22\".into(),█1889| label: \"X\".into(),█...█1913| // An EMPTY feed commits nothing at all (zero snapshot writes ride on█*1914| // this: apply_feed_batch is never called with an empty remainder).█1915| let mut acc = FeedAccumulator::new(10);█1916| assert!(acc.push(vec![]).is_none());█1917| assert!(acc.finish().is_none(), \"an empty feed commits nothing\");\u000f█</out>█# Assistant ¶█_**Analyzing process cadence and load patterns**█**Identifying burst timing and loop frequencies**_█# Tool call ¶█//Reading brain main loop█read(path=\"crates/spt-daemon/src/brainproc.rs\", selector=\"130-390\")█<out>█\u000eimpl BrainRestart {█...█pub fn request(&self) {█...█}█/// Consume a pending request (supervisor side): true at most once per█/// `request`, clearing it so the next cycle starts fresh.█pub fn take(&self) -> bool {█self.requested.swap(false, Ordering::SeqCst)█}█}█/// The `spt daemon brain` child entry. Connect to the broker over the existing█/// socket IPC, signal readiness, host the brain-side logic loops, and idle -█/// holding the connection and probing broker liveness each heartbeat. A dropped█/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)█/// returns `Err`, exiting the process so the broker-side supervisor respawns it█/// from the (possibly swapped) binary.█///█/// **D2-1 - net consumers run here.** The inbound dispatcher + outbound peer█/// pump are pure IPC clients (each `Brain::cold_start`s its own connection; no█/// shared `Arc<Broker>`), so they belong with the restartable brain, not the█/// broker - a brain respawn re-spawns them from the swapped binary. They are█/// meaningful only once the broker-owned NetHost is up, so we gate on the█/// existing `net-status` verb (which also serves as the broker-liveness [...13675ch elided...] d 30+ MiB every█/// 500ms heartbeat (the hertz v0.36 always-on 15%/core brain CPU), and - worse█/// - it re-read the exe *PATH*, so a post-swap resident-OLD-bytes brain█/// published the NEW file's hash: the breadcrumb lied in the exact enlyzeam█/// class it exists to catch. Once-at-start capture IS the resident-bytes█/// truthfulness contract (a respawned brain is a new process and computes the█/// swapped binary's hash independently - the D7 process-replacement e2e).█// [impl->REQ-BRAIN-HASH-ONCE]█fn current_exe_hash() -> Option<String> {█static EXE_HASH: OnceLock<Option<String>> = OnceLock::new();█EXE_HASH█.get_or_init(|| {█EXE_HASH_COMPUTES.fetch_add(1, Ordering::Relaxed);█...█})█.clone()█}█[Showing lines 129-393 of 2165. Use :394 to continue]\u000f█</out>█# Tool call ¶█//Locating brain worker spawns█grep(pattern=\"thread::spawn|Builder::new|spawn_|run_.*loop|PERIOD|INTERVAL|sleep\\\\(\", path=\"crates/spt-daemon/src/brainproc.rs\", selector=\"130-500\", case=true, gitignore=true, skip=null)█<out>█\u000e 189| // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the█*190| // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`█191| // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).█192| // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,█193| // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of█...█234| // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█*235| let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));█236|█237| // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller█*238| // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at█239| // boot (the rehydrate the no-op above can't do) and every tick - re-hosting█240| // every ONLINE live endpoint from disk (the harness-endpoint mirror of the█241| // shell waker). Online-only is staged behind the interim `api listen`█...█245| // [impl->REQ-DAEMON-1]█*246| let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);█247|█248| // Materialized project-index writer (AD [...1177ch elided...] broker_socket_name(),█326| Arc::clone(&registry),█327| Arc::clone(&stop),█...█330| if cfg.peer_pump {█*331| let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);█332| }█333|}█334|█...█342| last = Some(e);█*343| thread::sleep(Duration::from_millis(10));█344| }█345| }█346| }█...█454|/// durable two-phase applied record, the generation-stamped readiness probe,█*455|/// and the promote/rollback effects - all **injected** (exactly as `spawn_child`█456|/// is) so the unit harness drives the readiness-gated state machine█457|/// deterministically with a scripted ready/no-ready + a capturing notif sink,█458|/// while production binds the real `spt_home` + relcache + notif sender\u000f█</out>█# Tool call ¶█//Locating daemon periodic loops█grep(pattern=\"pub const .*PERIOD|const .*PERIOD|const .*INTERVAL|thread::sleep|recv_timeout|DEFAULT_.*POLL\", path=\"crates/spt-daemon/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## applyhost.rs█461| }█*462| std::thread::sleep(Duration::from_millis(10));█463| }█464| Err(last)█465|}█...█560| }█*561| std::thread::sleep(Duration::from_millis(10));█562| }█563| panic!(\"brain cold-start could not connect\");█564| }█## attach.rs█101|/// progress), never a busy-loop. ~200ms = several bursts/sec, imperceptible lag.█*102|const RESUBSCRIBE_INTERVAL: Duration = Duration::from_millis(200);█103|█104|/// The CONTROLLER fell behind the live ring further than the ring holds - the█105|/// dropped frames are GONE (`tail - delivered_through > cap_chunks`), so an█...█572| if since < RESUBSCRIBE_INTERVAL {█*573| std::thread::sleep(RESUBSCRIBE_INTERVAL - since);█574| }█575| }█576| brain.attach_skip_to_live(sid, Some(origin_node))?;█## autostart.rs█104| if attempt < LAUNCH_ATTEMPTS {█*105| std::thread::sleep(LAUNCH_RETRY_DELAY);█106| }█107| }█108| }█...█137| });█*138| rx.recv_timeout(budget [...17649ch elided...] e stream-open / sync round-trip, below█...█611| if !any_due {█*612| thread::sleep(TICK);█613| continue;█614| }█615|█...█1147| }█*1148| thread::sleep(Duration::from_millis(10));█1149| }█1150| Err(last)█1151|}█...█1244| while slept < backoff && !stop.load(Ordering::Relaxed) {█*1245| thread::sleep(TICK.min(backoff - slept));█1246| slept += TICK;█1247| }█1248| }█...█1826| assert!(first > 0, \"a real wall-clock stamp\");█*1827| thread::sleep(Duration::from_millis(15));█1828| write_heartbeat(&path);█1829| let second: u64 = std::fs::read_to_string(&path)█1830| .unwrap()█Showing files 1-20 of 24. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Locating consumer gates█grep(pattern=\"spawn_net_consumers|spawn_live|spawn_wake|spawn_proj|spawn_digest|spawn_psyche|spawn_peer|spawn_dispatch\", path=\"crates/spt-daemon/src/brainproc.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e 189| // message-DELIVERY axis; the orthogonal live-agent **Psyche** lifecycle (the█*190| // run_pulse_loop production caller) is hosted by `livehost::spawn_live_host`█191| // below, keyed on the live ENDPOINT not the broker session (CONTEXT:168/177).█192| // CURSOR-ONLY resume (UPDATE-WEDGE round 3, REQ-BRAIN-RESUME-NO-CONN-DEADLOCK,█193| // doyle Option A-split): the supervised daemon brain is a NON-DRAINING consumer of█...█234| // [impl->REQ-HAZARD-BROKER-PROCESS-ISOLATION]█*235| let _ = crate::shellwake::spawn_wake_host(Arc::new(AtomicBool::new(false)));█236|█237| // Live-agent Psyche host (M11-W0.1, REQ-DAEMON-1): the production caller█238| // `run_pulse_loop` lacked. One thread sweeps `livehost::reconcile_once` at█...█245| // [impl->REQ-DAEMON-1]█*246| let _ = crate::livehost::spawn_live_host(Arc::new(AtomicBool::new(false)), reason);█247|█248| // Materialized project-index writer (ADR-0037 §2, PROJECT-INDEX W2): the█249| // brain hosts the SOLE single-flight writer - load persisted index, boot█...█272| let hex = status.node_id_hex.clone().unwrap_or_default();█*273| spawn_net_consumers(&hex);█274| consumers_started = true;█275| eprintln!(█276| \"BRAIN_NET_CONSUMERS_UP: net enabled (node {hex}) - dispatcher + peer pump started\"█...█320|// [impl->REQ-DAEMON-9]█*321|fn spawn_net_consumers(node_hex: &str) {█322| let registry = Arc::new(crate::registryhost::RegistryHost::new(node_hex));█323| let stop = Arc::new(AtomicBool::new(false));█*324| let _ = crate::dispatch::spawn_dispatcher(█325| broker_socket_name(),█326| Arc::clone(&registry),█327| Arc::clone(&stop),█...█330| if cfg.peer_pump {█*331| let _ = crate::pump::spawn_peer_pump(broker_socket_name(), registry, cfg, stop);█332| }█333|}█334|\u000f█</out>█# Assistant ¶█_**Inspecting shellwake and livehost workloads**_█# Tool call ¶█//Reading shell wake reconciliation█read(path=\"crates/spt-daemon/src/shellwake.rs\", selector=\"480-690\")█<out>█\u000epub fn reconcile_once(█...█) {█...█let live: Vec<(String, String)> = {█let mut map = set.inner.lock().unwrap_or_else(|p| p.into_inner());█map.retain(|_, h| !h.thread.is_finished());█map.keys().cloned().collect()█};█for (owner, shell_id) in live {█let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, &owner, &shell_id);█let still_eligible = shellinfo::read_shell_info(&perch)█.map(|i| i.status == SHELL_STATUS_OFFLINE)█.unwrap_or(false);█if !still_eligible {█set.stop_watcher(owlery, &owner, &shell_id);█}█}█// Start side: every offline instance with a wake_command and headroom.█for owner in spt_store::perch::list_self_perch_ids(owlery) {█for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {█if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {█continue;█}█let Some(shell) = shell_section_of(registered, adapters_dir, &info.adapter_name) else {█continue; // deregistered adapter: nothing to run█};█let Some(wake_command) = shell.wake_com [...6250ch elided...] up_after times, then the durable give-up█// latch drops and the resolution never fires; clear_gave_up re-arms.█#[test]█fn watcher_crash_exits_respawn_then_give_up() {█let tmp = tempfile::tempdir().unwrap();█let owlery = tmp.path();█seed_owner(owlery, \"doyle\");█let id = spawn_record(owlery, \"doyle\", \"mock-shell\", None).unwrap();█let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);█let tally = perch.join(\"waker-tally.txt\");█let stop = AtomicBool::new(false);█watcher_run(█owlery,█\"doyle\",█&id,█&crash_tallying(&tally),█&fast_params(),█&stop,█...█);█...█}█...█}█[Showing lines 479-693 of 1001. Use :694 to continue]\u000f█</out>█# Tool call ¶█//Reading live host reconciliation█read(path=\"crates/spt-daemon/src/livehost.rs\", selector=\"1000-1120\")█<out>█\u000efn gc_live_bin_dirs_with(owlery: &Path, remove: &dyn Fn(&Path) -> std::io::Result<()>) {█for id in perch::list_self_perch_ids(owlery) {█...█for entry in entries.flatten() {█...█if name == \".live-bin\" {█let displaced = fresh_live_bin_old(&dir);█match std::fs::rename(&dir, &displaced) {█Ok(()) => {█let _ = remove(&displaced);█}█Err(e) => eprintln!(█\"LIVE_BIN_GC_DECLINE:{id}: {e} (image-locked, left in place - retried next boot)\"█),█}█}█}█}█}█/// A fresh, non-colliding `.live-bin.old[-N]` sibling of a `.live-bin` dir (mirrors█/// crc_swap's `fresh_old_path` so a still-mapped prior `.old` is never renamed OVER).█fn fresh_live_bin_old(live_bin: &Path) -> PathBuf {█let base = live_bin.with_file_name(\".live-bin.old\");█if !base.exists() {█return base;█}█for n in 1u64.. {█let candidate = live_bin.with_file_name(format!(\".live-bin.old-{n}\"));█if !candidate.exists() {█return candidate;█}█}█unreachable!(\"an un [...5297ch elided...] query_live_session_endpoints() {█reconcile_hosted_liveness(&owlery, &live);█}█reconcile_once(&owlery, &registered, &adapters_dir, &set, &cfg, reason);█// Sleep in slices so a stop lands promptly.█let mut left = LIVE_RECONCILE_INTERVAL_MS;█while left > 0 && !stop.load(Ordering::SeqCst) {█let step = left.min(100);█std::thread::sleep(Duration::from_millis(step));█left -= step;█}█}█})█}█#[cfg(test)]█mod tests {█use super::*;█use crate::test_home::with_home;█use std::time::{Duration, Instant};█// A no-op Psyche summarizer command: spawns + exits 0 (we never depend on its█...█}█[Showing lines 999-1123 of 2333. Use :1124 to continue]\u000f█</out>█# Tool call ¶█//Reading dispatch enumeration loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"500-690\")█<out>█\u000e/// stream to a family worker, until `stop` is set. Blocks the calling thread█/// (the daemon spawns it on its own); workers detach (each ends with its█/// stream).█pub fn run_dispatch_loop(█broker_name: &str,█paths: &DispatchPaths,█registry: Arc<RegistryHost>,█stop: &AtomicBool,█poll: Duration,█) -> io::Result<()> {█let mut brain = connect(broker_name)?;█// Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable -█// replaces the pre-fix one-shot `HashSet` whose burned claims permanently█// abandoned a stream on the first transient failure.█let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));█// Dispatcher generation id (Amendment fix 9): every telemetry record this█// loop emits carries it, so per-generation attach/poison censuses line up.█let generation = now_ms();█// Global circuit breaker (Amendment fix 5) + its current window, shared█// with workers so a seat-blocked retry paces on it.█let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));█// Bounded worker pool (Amendment fix 7): a cold table (daemon refresh█// with a large ba [...7668ch elided...] );█}█let mut c = claims_done.lock().unwrap();█c.insert(stream_id, state);█});█}█thread::sleep(poll);█}█Ok(())█}█/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream█/// table claims at most this many rows per poll tick.█const MAX_DISPATCH_WORKERS: usize = 8;█/// PURE pool gate (Amendment fix 7): may the loop claim another row right█/// now? The cold-enumeration break rides this - a refresh with a large█/// backlog claims at most [`MAX_DISPATCH_WORKERS`] rows per poll, the rest█/// wait for the next tick (batched, never one thread per row).█// [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]█fn pool_has_room(active: usize) -> bool {█...█}█[Showing lines 499-693 of 1920. Use :694 to continue]\u000f█</out>█# Tool call ¶█//Reading pump scheduling loop█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"500-850\")█<out>█\u000eimpl PeerIo<'_> {█...█/// Mint the next durable open-op from the pump's sole counter (exactly-once█/// open identity - a restart can never reuse one), tagged with the `pump`█/// journal minter (ADR-0034): the pump is the sole writer of `pump-ops.json`,█/// so its ops namespace under `pump` and never collide with cli/rc/shell ops.█fn open_op(&mut self) -> io::Result<MintedOp> {█Ok(MintedOp::new(Minter::Pump, self.ops.next_epoch()?))█}█}█/// Run the pump until `stop` is set. Owns one brain IPC connection and a█/// per-peer connection cache (an IO failure against a peer drops its cache█/// row; the next tick redials - conns are rebuilt freely, nothing leaks█/// because the broker's closed-watcher reaps dead conns).█///█/// The pure scheduler + fan-out (pump-seam P4, all four legs behind the seam):█/// heartbeat -> poll every worker's wake -> the [`due`] kernel -> each due█/// worker's `pre_round` (once, before any peer_step) -> per-subnet × per-peer█/// (`ensure_conn` -> each due worker's `peer_step` in fan-out order,█/// abort-on-first-fail) -> mark-after-round with a POST-round instant. No leg█/// logic lives here - the shell owns only *when* and *toward who [...16228ch elided...] s, sched, now)?;█if !conns.contains_key(peer_hex) {█break; // an ordinary failure dropped the conn - redial a later round█}█}█Ok(())█}█/// Apply one drained presence event to the pump's per-peer state (PUMP-TRUTH W2).█/// `CONNECTED` -> cache the conn, RESET the peer's backoff, seed the observed addr█/// (REQ-CONV-1 write-back rides the async connect), and run the peer's due legs in█/// THIS round (advertise the round it connects - no head-of-line block by the dead█/// peers). `DIAL_FAILED` -> back the peer off (G5), log the ordinary per-peer█/// signal, and drop the stale seed (REQ-CONV-1 self-heal -> next round re-resolves█/// via discovery). `DISCONNECTED` -> drop the cached conn, NO backoff (redial-█[Showing lines 499-853 of 2054. Use :854 to continue]\u000f█</out>█# Tool call ¶█//Reading registry pump worker█read(path=\"crates/spt-daemon/src/pump/registry.rs\", selector=\"1-270\")█<out>█\u000e//! The registry pump worker (pump-seam P2) - the first leg cut behind the█//! [`super::PumpWorker`] seam.█//!█//! `poll_wake` consumes the event-driven advertisement marker (force a round█//! NOW on an endpoint online/offline transition); `pre_round` runs the█//! node-local sweep (repair-evictions -> silent-peer eviction -> due seed█//! rotations -> re-advertise) ONCE per due round and holds the produced adverts█//! as worker state; `peer_step` pushes this node's own rows for the given█//! subnet over the peer's feed stream. Construction-captured deps: the shared█//! [`RegistryHost`], its `PathBuf` slices out of [`super::PumpPaths`], and the█//! two registry cadence knobs.█use std::io;█use std::path::PathBuf;█use std::sync::Arc;█use std::time::Duration;█use spt_net::net::replicate::RegistryFeedRecord;█use spt_store::subnet::SubnetStore;█use crate::registryhost::RegistryHost;█use super::{now_ms, PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};█/// Fire any seed rotations whose coalescing window has closed (Mesh-D7,█/// REQ-MESH-4). For each due subnet: rotate the seed (bump epoch, retain the█/// prior generation one-deep for the re-seed grace) and clear its pending entry.█/ [...10265ch elided...] the pre-seam inline loop; each step keeps its own█// registryhost-side unit coverage.█#[test]█fn pre_round_sweeps_and_refreshes_adverts_each_round() {█with_home(|home| {█// A served subnet plus one advertisable Self perch.█let owlery = home.join(\"owlery\");█let id = \"adv-ag\";█let p = spt_store::perch::resolve_perch_path_in(█&owlery,█id,█spt_store::perch::ParentHint::Infer,█);█std::fs::create_dir_all(&p).unwrap();█let rec = spt_store::info::InfoJson::new(█id,█\"now\",█std::process::id(),█\"s\",█...█);█...█});█}█}█[Showing lines 1-273 of 334. Use :274 to continue]\u000f█</out>█# Assistant ¶█_**Inspecting reconcile_once complexity**_█# Tool call ¶█//Locating live reconciliation body█grep(pattern=\"pub fn reconcile_once|fn reconcile_once|query_live_session_endpoints|reconcile_hosted_liveness\", path=\"crates/spt-daemon/src/livehost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 144|// [impl->REQ-DAEMON-1]█*145|pub fn reconcile_once(█146| owlery: &Path,█147| registered: &[(AdapterRecord, Manifest)],█148| adapters_dir: &Path,█...█541|/// [`spawn_live_host`] start, BEFORE the reconcile loop's phantom-clear█*542|/// ([`reconcile_hosted_liveness`]) offlines the stale-online records - which IS the \"was█543|/// online at restart\" signal. A brain restart with a SURVIVING broker sees the live█544|/// sessions in `live` and re-runs nothing (they are not orphaned). The re-run resumes█545|/// from the last ledger session via the shared [`launch_ledger_resume`] tagged█...█547|/// [`restart_resume_gate`]. Broker unreachable => skip entirely (never mass-respawn on a█*548|/// hiccup - the safe direction, same posture as [`reconcile_hosted_liveness`]).█549|// [impl->REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL]█550|pub fn resume_restart_orphaned_endpoints(█551| owlery: &Path,█...█554|) {█*555| let Some(live) = query_live_session_endpoints() else {█556| return; // broker unreachable - skip (never mass-respawn on a hiccup)█557| };█558| for id in perch::list_self_perch_ids(owlery) {█...█689|█*690|pub fn reconcile_hosted_liveness(owlery: &Pa [...3637ch elided...]█1614| assert_eq!(█1615| offlined,█1616| vec![\"skeleton-dead\".to_string()],█...█1708| assert!(live.contains(\"wallb\"), \"broker hosts the session\");█*1709| assert!(reconcile_hosted_liveness(&perch::owlery_dir(), &live).is_empty());█1710| assert_eq!(status(\"wallb\").as_deref(), Some(STATUS_ONLINE));█1711|█1712| // Kill the session; wait for the exit-waiter to reap it from the table.█...█1720| let live2 = session_set(&mut brain);█*1721| let offlined = reconcile_hosted_liveness(&perch::owlery_dir(), &live2);█1722| assert_eq!(offlined, vec![\"wallb\".to_string()], \"dead-session perch offlined\");█1723| assert_eq!(█1724| status(\"wallb\").as_deref(),\u000f█</out>█# Tool call ¶█//Reading live reconciliation body█read(path=\"crates/spt-daemon/src/livehost.rs\", selector=\"760-1000\")█<out>█\u000epub fn reconcile_hosted_liveness(owlery: &Path, live_sessions: &BTreeSet<String>) -> Vec<String> {█...█for id in perch::list_self_perch_ids(owlery) {█...█// Controllable gate: harness-hosted relay (Some(false)) and legacy (None)█// are exempt. An `unbound` skeleton is ALWAYS spt-hosted (bind hasn't run█// yet, so `controllable` may be unset) - skip the gate for it.█// [impl->REQ-ENDPOINT-UNBOUND-ATTACH]█if !is_unbound && info.controllable != Some(true) {█continue; // harness-hosted relay / legacy - exempt█}█if !has_session {█// spt-hosted (online or unbound skeleton), but the broker hosts no█// session -> the harness child is gone. CUSTODY GATE first: a█// wake-resume spawn in flight (live `resume.pid`) means the seat is█// mid-revival - normalizing now would land `suspended` under the█// incoming bind (which carries rest_state forward by design,█// REQ-HAZARD-BIND-REST-STATE-CARRY) and strand the revived seat.█// Skip this tick; a genuinely dead spawn probes dead next tick.█// [impl->REQ-REST-TERMINAL-NORMALIZE]█[...11314ch elided...] }█if remove(&dir).is_ok() {█continue;█}█// Still image-locked. An already-displaced `.old*` just waits for the next█// boot (uniquely named, never a brick); the LIVE `.live-bin` is displaced now█// (a locked exe can be MOVED even when it can't be unlinked) so the endpoint's█// perch no longer carries the stale own-copy in place. NEVER abort.█if name == \".live-bin\" {█let displaced = fresh_live_bin_old(&dir);█match std::fs::rename(&dir, &displaced) {█Ok(()) => {█let _ = remove(&displaced);█}█...█}█}█}█}█}█[Showing lines 759-1003 of 2333. Use :1004 to continue]\u000f█</out>█# Tool call ¶█//Locating wake reconciliation body█grep(pattern=\"pub fn reconcile_once|fn reconcile_once|list_self_perch_ids|registered\\\\(\", path=\"crates/spt-daemon/src/shellwake.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 470|// [impl->REQ-SHELL-2]█*471|pub fn reconcile_once(█472| owlery: &Path,█473| registered: &[(AdapterRecord, Manifest)],█474| adapters_dir: &Path,█...█494| // Start side: every offline instance with a wake_command and headroom.█*495| for owner in spt_store::perch::list_self_perch_ids(owlery) {█496| for (shell_id, info) in shellinfo::list_shells(owlery, &owner) {█497| if info.status != SHELL_STATUS_OFFLINE || set.contains(&owner, &shell_id) {█498| continue;█...█559| let adapters_dir = spt_store::perch::adapters_dir();█*560| let registered = spt_runtime::registry::registered(&adapters_dir);█561| reconcile_once(&owlery, &registered, &adapters_dir, &set, &params);█562| // Sleep in slices so a stop lands promptly.█563| let mut left = RECONCILE_INTERVAL_MS;█...█896| spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();█*897| let registered = spt_runtime::registry::registered(&adapters_dir);█898|█899| let id = spawn_record(owlery, \"doyle\", \"mock-wake\", None).unwrap();█900| let perch = spt_store::perch::resolve_shell_perch_path_in(owlery, \"doyle\", &id);█...█974| spt_runtime::registry::register(&adapters_dir, &src, 1).unwrap();█*975| let registered = spt_runtime::registry::registered(&adapters_dir);█976|█977| // A bare-parent instance: no wake_command in the parent => never woken.█978| spawn_record(owlery, \"doyle\", \"mock-wakeprof\", None).unwrap();\u000f█</out>█# Tool call ¶█//Reading pump workers notif sync█read(path=\"crates/spt-daemon/src/pump/notif.rs\", selector=\"1-260\")█<out>█\u000e//! The notif pump worker (pump-seam P3) - the full semilattice spool push.█//!█//! `peer_step` emits this node's notif feed for the subnet█//! ([`emit_notif_feed`]) and pushes it over the peer's feed stream; the█//! receiver's join dedups. No node-local `pre_round` and no wake edge - a█//! plain cadenced push. Construction-captured dep: the notif spool DB path.█use std::io;█use std::path::PathBuf;█use std::time::Duration;█use spt_store::notif::NotifStore;█use crate::notifsync::emit_notif_feed;█use super::{PeerIo, PumpCadence, PumpPaths, PumpWorker, RoundCtx};█/// The notif leg as a [`PumpWorker`]: the full semilattice spool per subnet█/// ([`emit_notif_feed`]); the receiver's join dedups.█pub(super) struct NotifWorker {█/// The notif spool DB ([`NotifStore::open_at`]).█notif_db: PathBuf,█/// This worker's scheduling period (`cadence.notif`).█cadence: Duration,█}█impl NotifWorker {█/// Construction capture (§Frozen-4): the notif spool DB path + the cadence.█pub(super) fn new(paths: &PumpPaths, cadence: &PumpCadence) -> NotifWorker {█NotifWorker {█notif_db: paths.notif_db.clone(),█cadence: cadence.notif,█}█}█}█impl PumpWorker for NotifWorker {█fn cadence(&self) -> Duration {█self.cadence█}█/// Emit this node's notif feed for `subnet` (the full semilattice spool)█/// and push it fire-and-forget; the receiver's join dedups.█// [impl->REQ-NOTIF-1]█fn peer_step(█&mut self,█io: &mut PeerIo,█subnet: &str,█_peer_hex: &str,█_ctx: &RoundCtx,█) -> io::Result<()> {█let store =█NotifStore::open_at(&self.notif_db).map_err(|e| io::Error::other(e.to_string()))?;█let feed = emit_notif_feed(&store, subnet).map_err(io::Error::other)?;█if !feed.is_empty() {█io.push_feed(&feed)?;█}█Ok(())█}█}█\u000f█</out>█# Tool call ¶█//Reading pump sync worker█read(path=\"crates/spt-daemon/src/pump/sync.rs\", selector=\"1-300\")█<out>█\u000e//! The sync pump worker (pump-seam P3) - anti-entropy pull for the minds.█//!█//! `poll_wake` consumes the wake-edge freshness-pull marker (a dormant->active█//! transition forces a pull NOW); `peer_step` builds the want-set - the union█//! of locally-tracked allowed branches ([`select_refs`]) and registry-derived█//! `a-<id>` bootstrap refs (endpoints known in the shared subnet this node█//! never held locally), both gated by the same [`crate::sync::SyncPolicy`] the█//! responder enforces (symmetric scoping) - then pulls via [`request_sync`]█//! over the shell's open-op counter and reports conflicts through the█//! construction-captured [`PumpHooks`]. Construction-captured deps (§Frozen-4):█//! the registry [`Arc`] (snapshot bootstrap refs), the store/scratch/marker█//! paths, and the hooks.█use std::io;█use std::path::PathBuf;█use std::sync::Arc;█use std::time::Duration;█use spt_store::contextstore::ContextStore;█use crate::registryhost::RegistryHost;█use crate::sync::{request_sync, select_refs};█use super::{PeerIo, PumpCadence, PumpHooks, PumpPaths, PumpWorker, RoundCtx};█/// The sync leg as a [`PumpWorker`]: anti-entropy pull for the minds.█pub(super) struct SyncWorker {█[...2392ch elided...] s = ContextStore::open_or_init_in(&self.ctx_root)?;█let mut want = select_refs(&ctx.policy, &cs, peer_hex)?;█// Registry-derived bootstrap refs: minds named in the shared subnet█// that this node never held locally.█if let Some(snap) = self.registry.snapshot(subnet) {█for id in snap.endpoint_ids() {█let r = format!(\"a-{id}\");█if !want.contains(&r) && ctx.policy.allows(&r, peer_hex) {█want.push(r);█}█}█}█if !want.is_empty() {█let open_op = io.open_op()?;█let report = request_sync(&mut *io.brain, io.conn_id, &want, open_op, &cs, &self.scratch)?;█(self.hooks.on_pull)(peer_hex, &report);█}█Ok(())█}█}█\u000f█</out>█# Assistant ¶█_**Planning live reconcile process**_█# Tool call ¶█//Reading live host core sweep█read(path=\"crates/spt-daemon/src/livehost.rs\", selector=\"130-360\")█<out>█\u000eimpl LiveSet {█...█fn stop_host(&self, id: &str) {█...█if let Some(h) = handle {█...█}█}█}█/// One reconcile sweep - the brain's live host-set invariant holder, run at boot█/// and every [`LIVE_RECONCILE_INTERVAL_MS`]. The complete set-diff against the█/// on-disk **online** live endpoints (mirror of [`crate::shellwake::reconcile_once`]):█///█/// - **un-host** (tabled ∧ ¬online) - stop the driver + de-table (exit guard: a█/// signed-off / removed endpoint must not keep pulsing - thread + dead-agent leak).█/// - **host** (online ∧ ¬tabled) - spawn the Psyche + start the driver.█/// - **leave-alone** (online ∧ tabled).█///█/// `status` is daemon-authoritative (CONTEXT:194); interim `listen` perches are█/// `status`-ABSENT so they are never hosted here (no double-host) until W0.2.█// [impl->REQ-DAEMON-1]█pub fn reconcile_once(█owlery: &Path,█registered: &[(AdapterRecord, Manifest)],█adapters_dir: &Path,█set: &Arc<LiveSet>,█cfg: &DaemonConfig,█reason: StartReason,█) {█// Stop side first: hosted endpoints that DEFINITIVELY left the online set -█// trip the flag, join, de-table. Un-host on a definitive departure ONLY, never█// on a [...9783ch elided...] resume leg (REQ-WAKE-RESUME-LEG, ADR-0033): a live-agent perch whose█/// rest INTENT is Active but whose harness session is cold (status = online) gets█/// its harness RESUMED from the last ledger session, under the RECORDED adapter█/// (D-2), mirroring `shellwake::resolve_wake`. This is the daemon LIFT of the thin█/// `spt wake` edge (ADR-0033: the CLI writes intent, the daemon does the work). It█/// NEVER stamps `status` - the resumed harness self-binds -> online, and the next█/// reconcile tick hosts its pulse driver. Psyche is untouched (per-event, W3).█// [impl->REQ-WAKE-RESUME-LEG]█fn resume_woken_endpoint(█perch: &Path,█id: &str,█info: &spt_store::info::InfoJson,█registered: &[(AdapterRecord, Manifest)],█...█) {█...█}█[Showing lines 129-363 of 2333. Use :364 to continue]\u000f█</out>█# Tool call ¶█//Reading liveness cleanup sweep█read(path=\"crates/spt-daemon/src/livehost.rs\", selector=\"650-820\")█<out>█\u000e/// (`advertise_local` -> Offline): same crash-robust, self-healing-next-tick shape.█///█/// `live_sessions` is the set of endpoint ids the broker currently hosts a PTY█/// session for ([`crate::msg::SessionsReply`] via `KIND_SESSIONS`). A perch that█/// is online + controllable but ABSENT from it has a dead/exited harness -> mark it█/// offline; the existing [`reconcile_once`] stop-side then un-hosts its driver and█/// the start-side stops re-hosting it.█///█/// **Controllable gate (load-bearing):** only `controllable == Some(true)`█/// (spt-hosted, broker-PTY) perches are reconciled here. A HARNESS-HOSTED relay█/// live agent (`api listen`, `controllable == Some(false)`) is legitimately online█/// with NO broker session (its liveness is the relay + ready marker), so it is█/// NEVER marked offline by this pass. A `controllable == None` perch (legacy /█/// dead-psyche like wall-a) is also exempt here - its liveness/phantom class is█/// not the broker-session arm's concern. (The former residency-confirm arm that█/// once handled it was retired with the resident-Psyche model in F-030; a█/// genuinely stranded pre-upgrade resident is now reaped by the one-shot█/// legacy-resident sweep [...7738ch elided...] t ids it currently hosts a session for█/// (`KIND_SESSIONS`) - the B2 pull signal. `None` when the broker is unreachable█/// (the caller then SKIPS the offline pass this tick rather than mass-offlining).█fn query_live_session_endpoints() -> Option<BTreeSet<String>> {█let mut brain = Brain::cold_start(&crate::endpoint::broker_socket_name(), now_ms()).ok()?;█let reply = brain.sessions().ok()?;█Some(█reply█.sessions█.into_iter()█.map(|s| s.endpoint)█.filter(|e| !e.is_empty())█.collect(),█)█}█/// The normalized program basename a perch's adapter would spawn its Psyche as -█/// the first whitespace token of `psyche_init.command`, file-name only, run through█[Showing lines 649-823 of 2333. Use :824 to continue]\u000f█</out>█# Tool call ¶█//Reading project writer cycle█read(path=\"crates/spt-daemon/src/projwriter.rs\", selector=\"590-690\")█<out>█\u000efn discover_git_marker(dir: &Path) -> Option<PathBuf> {█for anc in dir.ancestors() {█...█if g.is_file() {█...█}█}█None█}█/// (mtime epoch-ms, len) of a marker file - the cheap identity stamp.█fn stamp_of(p: &Path) -> Option<(u64, u64)> {█let meta = std::fs::metadata(p).ok()?;█let mtime = meta█.modified()█.ok()?█.duration_since(std::time::UNIX_EPOCH)█.ok()?█.as_millis() as u64;█Some((mtime, meta.len()))█}█fn env_ms(name: &str, default: u64) -> u64 {█std::env::var(name)█.ok()█.and_then(|v| v.parse().ok())█.unwrap_or(default)█}█/// Spawn the brain's index-writer host: ONE thread (single-flight by█/// construction) that loads the persisted index, runs the boot reconcile█/// (fingerprint-gated: a warm start with an unchanged generation scans█/// nothing), then drains + debounces + coalesces the invalidation queue and█/// runs the periodic full backstop until `stop`. Mirrors█/// `livehost::spawn_live_host`; the thread dies with the brain and the next█/// brain rehydrates from the persisted index (ready without warm).█// [impl->REQ-PROJECT-INDEX-WRITER]█// [impl->REQ-PROJECT-INDEX-IN [...2407ch elided...] );█}█let req = projinval::coalesce(projinval::drain_at(&engine.paths.invalidations_dir));█if due_periodic {█since_periodic = Duration::ZERO;█}█let req = if due_periodic { Coalesced { global: true, ..req } } else { req };█if req.is_empty() && !due_periodic {█continue; // a racer consumed it (never happens in production)█}█if let Err(e) = engine.reconcile(&req, due_periodic) {█engine.record_failure(e);█}█}█})█}█#[cfg(test)]█mod tests {█use super::*;█use spt_store::contextstore::ContextStore;█use spt_store::projinval::InvalScope;█use std::time::Instant;█...█}█[Showing lines 589-693 of 1270. Use :694 to continue]\u000f█</out>█# Tool call ¶█//Finding pulse loop work█grep(pattern=\"DEFAULT_PULSE_PERIOD|pulse_period|run_pulse_loop|thread::spawn\", path=\"crates/spt-daemon/src/livehost.rs;crates/spt-daemon/src/psyche.rs;crates/spt-daemon/src\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## livehost.rs█3|//!█*4|//! This is the production caller `run_pulse_loop` lacked: the brain instantiates█5|//! a [`BrainLifecycle`] per hosted **live** endpoint and drives its config-paced█6|//! pulse loop on a supervised thread. It is the **harness-endpoint mirror** of█7|//! [`crate::shellwake::reconcile_once`] (which re-hosts offline shells from█...█636| let stop = Arc::clone(&stop);█*637| std::thread::spawn(move || {█*638| lifecycle.run_pulse_loop(Some(&session_id), &stop, reason, |_report| {});█639| })█640| };█641| set.insert(id, HostedLife { stop, thread: handle });█...█1037|pub fn spawn_live_host(stop: Arc<AtomicBool>, reason: StartReason) -> JoinHandle<()> {█*1038| std::thread::spawn(move || {█1039| let set = Arc::new(LiveSet::new());█1040| {█1041| // F-030 W5 ONE-SHOT legacy-resident sweep (REQ-PSYCHE-LEGACY-RESIDENT-SWEEP):█...█1159| DaemonConfig {█*1160| pulse_period: Duration::from_millis(15),█1161| ..DaemonConfig::default()█1162| }█1163| }█...█1657| let b2 = Arc::clone(&broker);█*1658| std::thread::spaw [...23334ch elided...] n(move || {█274| let buf = BufReader::new(stdout);█275| for line in buf.lines() {█276| let Ok(line) = line else { break }; // child stdout closed█## pump/█### mod.rs█1261|) -> thread::JoinHandle<()> {█*1262| thread::spawn(move || {█1263| let paths = PumpPaths::production();█1264| supervise_pump(&stop, SUPERVISE_BACKOFF_BASE, || {█1265| run_peer_pump(█...█2023| let serve = std::sync::Arc::clone(&broker);█*2024| std::thread::spawn(move || {█2025| let _ = serve.serve();█2026| });█2027| let mut brain = connect(&name).expect(\"brain connects\");█Showing files 1-20 of 22+. Use skip=20 for the next page, or narrow paths/pattern.█Skipped missing paths: crates/spt-daemon/src/psyche.rs\u000f█</out>█# Assistant ¶█_**Analyzing livehost 5s tick behavior**█**Evaluating 5-second heartbeat clusters**_█# Tool call ¶█//Reading post-refresh cadence window█read(path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-1350\")█<out>█\u000eCONN_LIFECYCLE: conn=7 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=13 role=brain presence-subscriber wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=12 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19... wall_m [...54618ch elided...] art [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█CONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█[Showing lines 999-1353 of 4898. Use :1354 to continue]\u000f█</out>█# Assistant ¶█_**Identifying 5-second singleton connection pattern**█**Confirming Brain connection heartbeat timing**█**Mapping key log line numbers**_█# Tool call ¶█//Anchoring five second connections█grep(pattern=\"conn=(433|434|455|480|481|521|534|538) role=brain .*event=(write-start|transport-close)\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 1069|CONN_LIFECYCLE: conn=431 role=brain stream-subscriber stream=146 wall_ms=1784292562722 mono_ms=148358 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1070|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1071|CONN_LIFECYCLE: conn=433 role=brain wall_ms=1784292565398 mono_ms=151034 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1072|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570430 mono_ms=156067 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1073|CONN_LIFECYCLE: conn=434 role=brain wall_ms=1784292570431 mono_ms=156067 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1074|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█1075|NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)█1076|PAIR_MEET_UP:SPT_DEV step=59476419 id=d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6 addr=EndpointAddr { id: PublicKey(d7ff91784f89fe44aab2cfe8ba9d7dd667998b6a0cf515832530315bddcfccd6), addrs: {Ip(100.68.35.65:59921), Ip(192.168.1.81:59921)} }█...█1123|CONN_LIFECYCLE: conn=454 role=brain wall_ms= [...5234ch elided...] 14f3fef336fca36090b13a2546057db85f5), addrs: {Ip(100.68.35.65:49234), Ip(192.168.1.81:49234)} }█*1348|CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1349|CONN_LIFECYCLE: conn=538 role=brain wall_ms=1784292600631 mono_ms=186267 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1350|CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1351|CONN_LIFECYCLE: conn=540 role=brain wall_ms=1784292601857 mono_ms=187493 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1352|CONN_LIFECYCLE: conn=539 role=brain wall_ms=1784292601857 mono_ms=187494 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Tool call ¶█//Anchoring pump round events█grep(pattern=\"PUMP_PEER_FAIL|PUMP_IPC_READER|BRAIN_NET_CONSUMERS_UP\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-4898\", case=true, gitignore=false, skip=null)█<out>█\u000e 1015|CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1016|BRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) - dispatcher + peer pump started█1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1018|PUMP_IPC_READER: spawned█*1019|PUMP_IPC_READER: spawned█1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]█1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c974 [...6517ch elided...] R_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464█*3625|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480█3626|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█3627|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█3628|CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Tool call ¶█//Anchoring stream release cadence█grep(pattern=\"event=stream-sub-(attach|release)\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1200-1450\", case=true, gitignore=false, skip=null)█<out>█\u000e 1200|CONN_LIFECYCLE: conn=479 role=brain wall_ms=1784292579282 mono_ms=164918 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1201|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173 wall_ms=1784292579666 mono_ms=165302 event=stream-sub-release stream=173 [REQ-CONN-POISON-ATTRIBUTION]█*1202|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173... wall_ms=1784292579675 mono_ms=165311 event=stream-sub-attach stream=176 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█*1203|CONN_LIFECYCLE: conn=409 role=brain stream-subscriber stream=157 stream-subscriber stream=159 stream-subscriber stream=162 stream-subscriber stream=164 stream-subscriber stream=169 stream-subscriber stream=170 stream-subscriber stream=173... wall_ms=1784292579811 mono_ms=165447 event=stream-sub-release stream=176 [REQ-CONN-PO [...20847ch elided...] m-subscriber stream=217 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=217 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█*1446|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617015 mono_ms=202651 event=stream-sub-attach stream=216 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]█1447|CONN_LIFECYCLE: conn=580 role=brain stream-subscriber stream=216 wall_ms=1784292617017 mono_ms=202653 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1448|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1449|CONN_LIFECYCLE: conn=581 role=brain wall_ms=1784292617018 mono_ms=202654 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Assistant ¶█_**Identifying unnamed thread patterns**█**Planning CPU sampling for thread discrimination**█**Analyzing project index timing patterns**█**Assessing CPU burst timing and sampling effects**█**Planning endpoint identity data retrieval**_█# Tool call ¶█//Listing endpoint state records█glob(path=\"C:/Users/decid/AppData/Local/spt-core/identity/owlery/*/info.json\", hidden=true, gitignore=false, limit=100)█<out>█\u000ePath not found: C:/Users/decid/AppData/Local/spt-core/identity/owlery\u000f█</out>█# Tool call ¶█//Finding online live agents█grep(pattern=\"\\\"state\\\"\\\\s*:\\\\s*\\\"live_agent\\\"|\\\"status\\\"\\\\s*:\\\\s*\\\"online\\\"|\\\"session_id\\\"\", path=\"C:/Users/decid/AppData/Local/spt-core/identity/owlery\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000ePath not found: C:/Users/decid/AppData/Local/spt-core/identity/owlery\u000f█</out>█# Tool call ¶█//Reading pulse scheduling path█read(path=\"crates/spt-daemon/src/lifecycle.rs\", selector=\"680-790\")█<out>█\u000e█/// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after█/// each tick (so a caller - or a test - observes cadence and can decide to█/// stop). The period comes from the durable config, never a constant.█///█/// **Restoration D5-2 (ADR-0018 Q4/V4): the cadence is a disk-anchored█/// absolute-deadline grid, not a phase-relative flat sleep.** The old loop█/// `pulse_tick`-then-`sleep(pulse_period)` silently re-phased the grid to the█/// restart instant on every restart. Now the loop rehydrates a█/// [`DeadlineAnchor`](crate::deadline::DeadlineAnchor) keyed by the session█/// (the daemon pulse uses `\"pulse\"`; the live-agent adapter's per-agent█/// drivers pass each agent's id - amd 6, no cross-clobber) and applies the█/// [`StartReason`] rule: an `Update` restart **preserves the grid phase**█/// (lands mid-grid), a `Crash`/`Cold` start re-bases it to now. The fire█/// deadline is derived functionally - **no per-fire write**.█///█/// The loop still holds no work-state beyond the cursor on disk (a fresh loop█/// re-reads the drop dirs and gate), so it is freely killable + respawnable;█/// D5 ma [...4295ch elided...] ///█/// - **active -> (dormant|suspended)**: the transition echo commune█/// ([`fire_echo`](Self::fire_echo) -> [`run_echo_commune`]) capturing the█/// outgoing instance's final context delta, BEFORE the flip persists█/// (KH 3.3) - it syncs to whichever instance activates next.█/// - **wake (-> active)**: re-activation in place catches up immediately -█/// [`crate::notif::resurface_at_boundary`] at the Wake boundary (the D8█/// deferral, real now that the edge exists) + the freshness-pull marker█/// the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not█/// at the next anti-entropy cadence).█///█/// Registry advertisement follows on the pump's next `advertise_local`█[Showing lines 679-793 of 2921. Use :794 to continue]\u000f█</out>█# Tool call ¶█//Reading pulse tick workload█read(path=\"crates/spt-daemon/src/lifecycle.rs\", selector=\"790-920\")█<out>█\u000e /// deferral, real now that the edge exists) + the freshness-pull marker█/// the peer pump consumes (the D9-1 seam: pull the latest mind NOW, not█/// at the next anti-entropy cadence).█///█/// Registry advertisement follows on the pump's next `advertise_local`█/// scan - the persisted record is what it reads, epoch-bumped per row.█// [impl->REQ-INST-3]█// [impl->REQ-INST-4]█pub fn rest_event(█&self,█session_id: Option<&str>,█event: crate::resting::RestEvent,█) -> Result<Option<crate::resting::EdgeReport>, String> {█let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);█let report = crate::resting::apply_event(█&perch_path,█event,█self.cfg.auto_suspend_after_ms,█now_ms(),█|| self.fire_echo(session_id),█|| self.fire_wake_effects(),█)?;█// The shell leg of the edge (M5-D4a): suspend closes online shells,█// wake relaunches persistent ones - same cascade as the daemon-side█// host, so the two transition hosts can never drift.█// [impl->REQ-SHELL-2]█if let Some(r) = [...4643ch elided...] /// The agent's OWN subnet - the parent endpoint's `home_subnet` (info.json),█/// `local` when unhomed. The ONLY subnet a psyche `notify` may land in█/// (ADR-0012's \"own user/subnet\" constraint), resolved DAEMON-SIDE so the child█/// never self-resolves it (F-030 W1 - the direction-(a) churn root). Mirrors the█/// `spt` identity-banner resolver (rc.rs `resolve_identity_line`).█// [impl->REQ-PSYCHE-EPHEMERAL-DRIVER]█fn own_subnet(&self) -> String {█let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);█spt_store::info::read_info(&perch_path)█.and_then(|i| i.home_subnet)█.filter(|s| !s.is_empty())█.unwrap_or_else(|| \"local\".to_string())█}█[Showing lines 789-923 of 2921. Use :924 to continue]\u000f█</out>█# Assistant ¶█_**Confirming owlery home path**_█# Tool call ¶█//Listing live endpoint states█glob(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/*/info.json\", hidden=true, gitignore=false, limit=100)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## lia/█info.json█## webbie/█info.json█## doyle/█info.json█## deployah/█info.json█## mobile-gw/█info.json█## perri/█info.json█## todlando/█info.json█## emphasys/█info.json█## gaki-normal-probe/█info.json█## hertz/█info.json█## flynn/█info.json█## chert/█info.json\u000f█</out>█# Tool call ¶█//Finding online state fields█grep(pattern=\"\\\"state\\\"\\\\s*:\\\\s*\\\"live_agent\\\"|\\\"status\\\"\\\\s*:\\\\s*\\\"online\\\"|\\\"session_id\\\"\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## chert/█### info.json█*1|{\"id\":\"chert\",\"started\":\"1783597509\",\"pid\":27588,\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"state\":\"live_agent\",\"parent_pid\":31012,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":1783630087661,\"controlled\":false,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}█### sessions.log█*1|{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}█*2|{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}█### nested/chert-psyche/█#### psyche-custody.json█*1|{\"session_id\":\"48a88e4c-dab8-4b8f-90c6-571c7a65a4b3\"}█## deployah/█### info.json█*1|{\"id\":\"deployah\",\"started\":\"1784265259\",\"pid\":80200,\"session_id\":\"89cc9038-e5d9-429e-b4a9-40fba8af71ee\",\"state\":\"live_agent\",\"parent_pid\":57992,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"offline\",\"last_active_ms\":178429240897 [...17050ch elided...] 7220-1783656026228588600\",\"trigger\":\"boot\",\"ordinal\":13}█*15|{\"ts\":\"2026-07-10T04:00:37Z\",\"session_id\":\"sess-44820-1783656037158237600\",\"trigger\":\"boot\",\"ordinal\":14}█*16|{\"ts\":\"2026-07-10T04:00:46Z\",\"session_id\":\"sess-47160-1783656046664586700\",\"trigger\":\"boot\",\"ordinal\":15}█*17|{\"ts\":\"2026-07-10T04:03:48Z\",\"session_id\":\"sess-29624-1783656228813745900\",\"trigger\":\"boot\",\"ordinal\":16}█*18|{\"ts\":\"2026-07-10T04:05:04Z\",\"session_id\":\"sess-56784-1783656304075360500\",\"trigger\":\"boot\",\"ordinal\":17}█*19|{\"ts\":\"2026-07-10T04:06:17Z\",\"session_id\":\"sess-75108-1783656377065211600\",\"trigger\":\"boot\",\"ordinal\":18}█*20|{\"ts\":\"2026-07-10T04:09:14Z\",\"session_id\":\"sess-45376-1783656554208398900\",\"trigger\":\"boot\",\"ordinal\":19}█Showing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Listing deadline anchors█glob(path=\"C:/Users/decid/AppData/Local/spt-core/deadline-*.json\", hidden=true, gitignore=false, limit=100)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/█deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json█deadline-e5b62b57-69a0-452c-9c7e-cd3708186344.json█deadline-b155a5e6-a87c-416f-b029-d9cbc4ffd83e.json█deadline-89cc9038-e5d9-429e-b4a9-40fba8af71ee.json█deadline-9183c374-ac41-4e0a-b478-a8b19f32f855.json█deadline-fc582bea-2d15-4077-b21a-086cbcbe3cee.json█deadline-a2fdb848-6643-4e10-b221-6baee7e91b7b.json█deadline-bf353802-556c-46ce-9865-e74a3092bbe9.json█deadline-9e0df17e-f217-4446-97a4-f528a56024ba.json█deadline-7818eabc-d26c-4a0b-965c-b600016f1cea.json█deadline-e9bf2ff3-a7f6-4bd2-8db8-a49a984f852b.json█deadline-c1427211-6e8d-4571-aeb8-30d36fa816a6.json█deadline-6389a46d-930f-4662-b560-293532307149.json█deadline-cba24f1d-3cea-4b6f-bd92-a08ff1b8cdde.json█deadline-058dcb6f-1586-47a0-a0cd-0a4a085881ca.json█deadline-b4fe0587-e19f-4b78-81a8-c97931c52126.json█deadline-59cfcf11-f9d7-4967-a9bc-8892efb0f320.json█deadline-019f656e-6a10-7000-8949-19c300a9ae4a.json█deadline-019f6560-0096-7000-b53f-7ab1ea3d2bcf.json█deadline-3d75265c-0071-44a0-98fa-3d748c66b87f.json█deadline-1fae2b4c-9daf-44fc-afe5-06c410ac69b8.json█deadline-f4df7cba-aae5-46c6-aa4f-50d2fb874894.json█deadline-48d40117-34b1-4da6-b8ca-d86b [...3153ch elided...] -d070-4f7e-b04f-a9be62c4068a.json█deadline-6db151cc-515e-4fdf-8fe7-9f98697b588b.json█deadline-72f89cf6-7ec0-450a-b68c-4f401db59a61.json█deadline-5edb9f02-51b0-448b-a2d3-e3276fe31482.json█deadline-b1edf63f-df6b-4d11-bcd7-baa881670279.json█deadline-2571ac9e-b6f0-4497-87fc-03f60226b670.json█deadline-d5b46b36-ff77-4131-a774-17f6caa2ff35.json█deadline-8f826b4f-918e-401c-9a34-b55939a457d1.json█deadline-3014282c-3a92-4ee1-a957-3da91c655988.json█deadline-4ed5d2c7-d7c7-4752-88b9-e2641eb5fd33.json█deadline-05d5e489-e4de-4da7-a6b5-196fcf255595.json█deadline-cfe4ff51-5063-4d00-9082-b4ef0a4f0055.json█deadline-38fd4368-0e40-4529-9873-7e2689ec742c.json█deadline-e253b012-99d0-4d6a-90ed-e355ba7aa943.json█deadline-26c873b1-8e04-4115-914c-01b58ea5eb1d.json█[100 results limit reached. Use limit=200 for more]\u000f█</out>█# Tool call ¶█//Locating pulse tick function█grep(pattern=\"pub fn pulse_tick|fn pulse_tick|TickReport\", path=\"crates/spt-daemon/src/lifecycle.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 295|#[derive(Debug, Clone, Default)]█*296|pub struct TickReport {█297| pub ingested: Vec<Ingested>,█298| pub echo_fired: bool,█299| /// F-030 W1: the per-event psyche-turn outcome when the echo-gate fired this█...█592| /// echo-commune (T3).█*593| pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {█594| let now = now_ms();█595| // Recency follows the resting model (D9-2 - the D8 gap closed): only█596| // an ACTIVE (or pre-D9-2 recordless) instance refreshes█...█672| };█*673| Ok(TickReport {█674| ingested,█675| echo_fired,█676| turn_outcome,█...█699| // [impl->REQ-DAEMON-1]█*700| pub fn run_pulse_loop<F: FnMut(&TickReport)>(█701| &self,█702| session_id: Option<&str>,█703| stop: &AtomicBool,█...█1571| #[test] // [unit->REQ-DAEMON-1] a daemon-hosted pulse tick ingests a commune drop.█*1572| fn pulse_tick_ingests_drop() {█1573| with_home(|_| {█1574| let drops = tempfile::tempdir().unwrap();█1575| let manifest = live_manifest(drops.path());\u000f█</out>█# Assistant ¶█_**Fetching individual JSON states in parallel**_█# Tool call ¶█//Reading lia state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/lia/info.json\", selector=\"raw\")█<out>█\u000e{\"id\":\"lia\",\"started\":\"1784292418\",\"pid\":41160,\"session_id\":\"5106270b-52d7-4a87-b78c-4edc06911b25\",\"state\":\"live_agent\",\"parent_pid\":26608,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"status\":\"online\",\"last_active_ms\":1784293270723,\"driven_by\":\"14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d\",\"controlled\":true,\"rest_state\":\"active\",\"resources\":\"Multipurpose subnet liaison for user Reavo.\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt\",\"controllable\":true}\u000f█</out>█# Tool call ¶█//Reading webbie state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/webbie/info.json\", selector=\"raw\")█<out>█\u000e{\"id\":\"webbie\",\"started\":\"1784265259\",\"pid\":74252,\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"state\":\"live_agent\",\"parent_pid\":81332,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"status\":\"offline\",\"last_active_ms\":1784292409012,\"controlled\":false,\"rest_state\":\"suspended\",\"home_subnet\":\"BIGNET\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\u000f█</out>█# Tool call ¶█//Reading perri state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/perri/info.json\", selector=\"raw\")█<out>█\u000e{\"id\":\"perri\",\"started\":\"1784197646\",\"pid\":47752,\"session_id\":\"64b3da58-2f28-4411-9c1c-6cc102b8a1c8\",\"state\":\"live_agent\",\"parent_pid\":55836,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"status\":\"offline\",\"last_active_ms\":1784211191867,\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\u000f█</out>█# Tool call ¶█//Reading todlando state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/info.json\", selector=\"raw\")█<out>█\u000e{\"id\":\"todlando\",\"started\":\"1784272381\",\"pid\":63588,\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"state\":\"ready_agent\",\"parent_pid\":77228,\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"status\":\"online\",\"controlled\":false,\"rest_state\":\"active\",\"home_subnet\":\"SPT_DEV\",\"adapter\":\"claude-spt:ccs\",\"controllable\":true,\"read_env\":{\"CLAUDE_CONFIG_DIR\":\"C:\\\\Users\\\\decid\\\\.ccs\\\\instances\\\\bigscreen\"}}\u000f█</out>█# Tool call ¶█//Reading mobile gateway state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/info.json\", selector=\"raw\")█<out>█\u000e{\"id\":\"mobile-gw\",\"started\":\"1784292416\",\"pid\":82604,\"session_id\":\"spt-mobile-host-75468\",\"state\":\"gateway\",\"parent_pid\":75468,\"cwd\":\"C:/Users/decid/Documents/projects\",\"controlled\":false,\"rest_state\":\"dormant\",\"dormant_since_ms\":1784185232433,\"home_subnet\":\"SPT_DEV\",\"adapter\":\"mobile\",\"controllable\":false}\u000f█</out>█# Tool call ¶█//Reading live pulse work█read(path=\"crates/spt-daemon/src/lifecycle.rs\", selector=\"580-680\")█<out>█\u000e /// Stamp this endpoint's `last_active_ms` recency marker (REQ-UPD-4) - the█/// signal the consent gate resolves \"most-recently-active live session\"█/// against ([`crate::consent::most_recently_active`]). Best-effort: a hosted█/// perch that has not been bound yet (no `info.json`) is silently skipped, so█/// a pre-bind tick never errors. Stamps the Self perch for this brain's id.█// [impl->REQ-UPD-4]█pub fn touch_active(&self) {█let perch_path = perch::resolve_perch_path(&self.id, ParentHint::Infer);█let _ = spt_store::info::set_last_active(&perch_path, now_ms());█}█/// One pulse tick (T5): refresh the activity stamp (REQ-UPD-4), ingest drops█/// from the watched dirs (T4), then if the echo-gate is armed fire exactly one█/// echo-commune (T3).█pub fn pulse_tick(&self, session_id: Option<&str>) -> Result<TickReport, String> {█let now = now_ms();█// Recency follows the resting model (D9-2 - the D8 gap closed): only█// an ACTIVE (or pre-D9-2 recordless) instance refreshes█// `last_active_ms` - a resting seat ticking its pulse must never win█// a \"most-recently-active\" resolution (R [...3874ch elided...] of the commune.█let outcome = match (turn_res, commune_res) {█(Ok(()), Ok(())) => Ok(()),█(Err(e), _) => Err(format!(\"turn: {e}\")),█(Ok(()), Err(e)) => Err(format!(\"commune-sync: {e}\")),█};█(true, Some(outcome))█} else {█(false, None)█};█Ok(TickReport {█ingested,█echo_fired,█turn_outcome,█})█}█/// Run the scheduled pulse loop until `stop` is set, calling `on_tick` after█/// each tick (so a caller - or a test - observes cadence and can decide to█/// stop). The period comes from the durable config, never a constant.█///█[Showing lines 579-683 of 2921. Use :684 to continue]\u000f█</out>█# Assistant ¶█_**Analyzing periodic agent pulse behavior**█**Investigating brain pump periodic CPU bursts**_█# Tool call ¶█//Reading lia pulse anchor█read(path=\"C:/Users/decid/AppData/Local/spt-core/deadline-5106270b-52d7-4a87-b78c-4edc06911b25.json\", selector=\"raw\")█<out>█\u000e{\"anchor_ms\":1784292415570,\"interval_ms\":5000}\u000f█</out>█# Tool call ¶█//Finding lia pulse events█grep(pattern=\"lia|PSYCHE|INGEST|COMMUNE|last_active\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-4898\", case=false, gitignore=false, skip=null)█<out>█\u000e 1002|CONN_LIFECYCLE: conn=23 role=brain wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1003|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560268 mono_ms=145905 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]█1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19... wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1005|BRAIN_RESTART: planned update respawn (generation 1)█*1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON [...1628ch elided...] NN-POISON-ATTRIBUTION]█*1028|CONN_LIFECYCLE: conn=412 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560835 mono_ms=146471 event=writer-exit role=controller session=1 reason=channel-closed [REQ-CONN-POISON-ATTRIBUTION]█1029|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1030|CONN_LIFECYCLE: conn=414 role=brain wall_ms=1784292562220 mono_ms=147856 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1031|CONN_LIFECYCLE: conn=415 role=brain stream-subscriber stream=140 wall_ms=1784292562220 mono_ms=147856 event=stream-sub-attach stream=140 from_seq=0 [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Tool call ¶█//Locating manifest hash reload█grep(pattern=\"manifest_disk_hash|reload_manifest_if_changed|drop_dirs\\\\(\", path=\"crates/spt-daemon/src/lifecycle.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 451| /// Refresh this endpoint's manifest + runtime in place - a thin delegate to█*452| /// the shared cell. The production trigger is [`reload_manifest_if_changed`]█453| /// (the brain pulling an on-disk swap); this direct entry exists for tests and█454| /// any in-process caller. Brain-parity: nothing else cycles. (W3c)█455| // [impl->REQ-ADAPTER-LIVE-UPDATE]█...█463| // [impl->REQ-ADAPTER-LIVE-UPDATE]█*464| fn manifest_disk_hash(&self) -> Option<String> {█465| let dir = self.install_dir.as_ref()?;█466| let bytes = std::fs::read(dir.join(\"manifest.toml\")).ok()?;█467| Some(crate::release::sha256_hex(&bytes))█...█482| // [impl->REQ-ADAPTER-LIVE-UPDATE]█*483| fn reload_manifest_if_changed(&self, last: &mut Option<String>) {█484| let Some(dir) = self.install_dir.as_ref() else {█485| return;█486| };█...█540| /// The unique watched drop dirs (commune + signoff; usually the same dir).█*541| fn drop_dirs(&self) -> Vec<PathBuf> {█542| let mut dirs: Vec<PathBuf> = Vec::new();█543| for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]█544| .into_iter()█...█632| [...2270ch elided...] (install.path(), drops.path(), \"2\");█*2875| host.reload_manifest_if_changed(&mut last);█2876| assert_eq!(█2877| host.cell.manifest_snapshot().adapter.version,█2878| \"2\",█...█2880| );█*2881| assert_eq!(last, host.manifest_disk_hash(), \"and `last` finally advances\");█2882| });█2883| }█2884|█...█2897| assert!(█*2898| host.manifest_disk_hash().is_none(),█2899| \"no install dir => no disk hash\"█2900| );█2901|█2902| let mut last: Option<String> = None;█*2903| host.reload_manifest_if_changed(&mut last);█2904|█2905| assert_eq!(last, None, \"no install dir => `last` stays None (clean no-op)\");█2906| assert_eq!(\u000f█</out>█# Tool call ¶█//Locating ingest drops complexity█grep(pattern=\"pub fn ingest_drops|fn ingest_drops|read_dir|for entry|walk\", path=\"crates/spt-daemon/src;crates/spt-live/src;crates/spt-store/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/█## spt-daemon/src/█### autostart.rs█45| let node_label = spt_store::hostlabel::node_fill_label(None);█*46| for entry in entries {█47| // Re-resolve the adapter option fresh (an adapter updated between█48| // restarts is honored; an uninstalled one is a loud skip, never a wedge).█49| let (record, manifest) =█### broker.rs█284|/// The impure probe feeding [`zombie_verdict`] for a claimed live session -█*285|/// runs OFF every broker lock (a process-table walk is real work; KH 7.12).█286|/// `spawned_ms_ago` comes from the session's `spawned_at`; callers on the█287|/// KIND_SESSIONS reply use the additive `SessionInfo` fields, so the CLI█288|/// preflight and the broker gate consult the SAME authority.█### crc_swap.rs█31|█*32|/// Walk `staging` and return the files whose content differs from their█33|/// `install_dir` counterpart - or that are absent in `install_dir`. Files whose█34|/// content is byte-identical are skipped, so a still-running unchanged binary is█35|/// never disturbed. Read-only: does not mutate either tree. The returned plan is█...█52|) -> std::io::Result<()> {█*53| for entry in std::fs::read_dir(dir)? {█54| [...14817ch elided...] DY-SQUAT-GUARD] the bind-time squat scan: given a█*217| // sid, walk owlery/<parent>/nested/<child>/psyche-custody.json and return the█218| // psyche's dir name whose OWN custody sid matches; a sid no psyche holds returns█219| // None. This is exactly what `establish_perch` reads to refuse a seat-theft bind.█220| #[test]█...█250| let owlery = d.path();█*251| // A parent with no nested/ dir at all -> read_dir(nested) errs -> skipped.█252| std::fs::create_dir_all(owlery.join(\"lonely\")).unwrap();█253| // A parent whose nested child carries an unparseable custody file -> reads None.█254| let corrupt = owlery.join(\"wrecked\").join(\"nested\").join(\"wrecked-psyche\");█Showing files 1-20 of 23. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Assistant ¶█_**Identifying need for targeted ingest**_█# Tool call ¶█//Reading drop ingestion scan█read(path=\"crates/spt-live/src/ingest.rs\", selector=\"180-300\")█<out>█\u000e/// `id`: route each into the two-tier context store (precedence-guarded, llm█/// source) and **delete** it (spt-core single-writer; the mind never deletes).█///█/// A drop is deleted whether its writes `Written` or `Suppressed` - both mean█/// \"consumed\" (a suppressed drop was a stale snapshot, correctly discarded). A█/// read/write *error* leaves the drop in place to retry on the next pass.█///█/// **Commit-before-delete (F-032, KNOWN-HAZARDS 7.40):** a non-empty█/// `<project-context>` slice with an EMPTY `project_id` (the endpoint's anchor█/// cwd unresolved/owlery-internal at ingest time) was never committed anywhere█/// - deleting the drop would black-hole it. That slice is instead **preserved█/// as a project-only pending slice under the COMMUNE suffix** (whatever the█/// source drop's kind - a signoff-suffix pending would be reaped by the█/// stale-signoff sweep on the next listener start): the live slice (just█/// committed) is dropped from the pending so a retry never re-commits it, and█/// the next ingest with a resolvable `project_id` commits + deletes. The█/// rewrite is idempotent (the pending form re-parses to itself - no churn on█/// steady retries), and a NEWER com [...3934ch elided...] writes,█drop_path,█preserved: true,█});█continue;█}█// [impl->REQ-HAZARD-DROP-FILE-SINGLE-WRITER] spt-core deletes the drop█// after consuming it; the mind never does.█std::fs::remove_file(&drop_path)?;█out.push(Ingested {█kind,█writes,█drop_path,█preserved: false,█});█}█Ok(out)█}█#[cfg(test)]█mod tests {█use super::*;█use crate::context::DEFAULT_PROTECTION_WINDOW_MS;█use crate::test_support::with_home;█use spt_store::contextstore::{live_context_file, project_context_file};█use spt_store::perch::tracked_dir;█fn read_live(id: &str) -> String {█...█}█...█}█[Showing lines 179-303 of 889. Use :304 to continue]\u000f█</out>█# Tool call ¶█//Reading manifest reload poll█read(path=\"crates/spt-daemon/src/lifecycle.rs\", selector=\"440-560\")█<out>█\u000e pub fn with_config_in(█...█) -> Option<BrainLifecycle> {█...█Some(BrainLifecycle {█cell: ManifestCell::new(manifest.clone(), install_dir),█install_dir: install_dir.map(Path::to_path_buf),█id: id.to_string(),█commune_dir,█signoff_dir: manifest.session.signoff_dir.as_ref().map(PathBuf::from),█cfg,█// Resolve the advertised label once, here (brain startup), not per fill.█node_label: spt_store::hostlabel::node_fill_label(None),█})█}█/// Refresh this endpoint's manifest + runtime in place - a thin delegate to█/// the shared cell. The production trigger is [`reload_manifest_if_changed`]█/// (the brain pulling an on-disk swap); this direct entry exists for tests and█/// any in-process caller. Brain-parity: nothing else cycles. (W3c)█// [impl->REQ-ADAPTER-LIVE-UPDATE]█pub fn refresh_manifest(&self, new: Manifest, install_dir: Option<&Path>) {█self.cell.refresh(new, install_dir);█}█/// The sha256 of this endpoint's on-disk manifest (`<install_dir>/manifest.toml`),█/// or `None` when there is no pinned install dir / the file can [...3990ch elided...] uf> = Vec::new();█for d in [self.commune_dir.as_ref(), self.signoff_dir.as_ref()]█.into_iter()█.flatten()█{█if !dirs.contains(d) {█dirs.push(d.clone());█}█}█dirs█}█/// Sweep a stale signoff sentinel on start (3.2). No-op without a signoff dir.█pub fn sweep_on_start(&self) {█if let Some(dir) = &self.signoff_dir {█let _ = sweep_stale_signoff(dir, &self.id);█}█}█/// Mark a daemon-hosted perch `offline` - the teardown counterpart of the█/// `online` stamp a daemon-hosted perch carries (a hosted psyche perch, an█/// spt-hosted Self). From this point the single liveness resolver reports the█[Showing lines 439-563 of 2921. Use :564 to continue]\u000f█</out>█# Tool call ¶█//Reading daemon config live cadence█read(path=\"C:/Users/decid/AppData/Local/spt-core/daemon.json\", selector=\"raw\")█<out>█\u000e{█\"pulse_period_ms\": 5000,█\"protection_window_ms\": 2000,█\"crash_grace_ms\": 2000,█\"full_auto_update\": false,█\"relay\": \"n0\",█\"peer_pump\": true,█\"registry_pump_period_ms\": 30000,█\"registry_evict_after_ms\": 300000,█\"notif_pump_period_ms\": 15000,█\"sync_pull_period_ms\": 60000,█\"update_check_period_ms\": 3600000,█\"detached_subnets\": [],█\"worker_reap_ttl_secs\": 86400,█\"startup_endpoints\": [█{█\"id\": \"mobile-gw\",█\"adapter\": \"mobile\",█\"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"█},█{█\"id\": \"lia\",█\"adapter\": \"claude-spt\",█\"cwd\": \"C:\\\\Users\\\\decid\\\\Documents\\\\projects\"█}█]█}\u000f█</out>█# Tool call ¶█//Reading project index status█read(path=\"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json\", selector=\"raw\")█<out>█\u000e{\"generated_ms\":1784293163753,\"source_generation\":\"ce5e2369c6924262\",\"pending_refresh\":false,\"last_run_ms\":1784293163753,\"last_duration_ms\":549,\"endpoints\":12,\"projects\":5,\"cwds\":11,\"cwd_cache_hits\":37,\"cwd_cache_misses\":11,\"stale_reads\":0,\"repairs\":0,\"last_cycle\":{\"branch_enumerations\":1,\"tree_scans\":0,\"derivations\":0},\"cumulative\":{\"branch_enumerations\":3,\"tree_scans\":8,\"derivations\":11}}\u000f█</out>█# Assistant ¶█_**Assessing pump CPU usage impact**█**Analyzing pump periodic failure cadence**█**Tracing failure handling timing clusters**█**Verifying feed batch processing**_█# Tool call ¶█//Reading registry dispatcher worker█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"960-1085\")█<out>█\u000e let outcome = match family {█...█StreamFamily::Attach => {█...█// `endpoint` is the gate subject; `remote_session` carries the█// dispatcher-resolved session id on the cross-node leg (resolved HERE,█// before serve_attach subscribes - never mid-serve, which would swallow█// interleaved attach records) and `None` on the local path.█let (endpoint, remote_session) = match line█.get(\"endpoint_id\")█.and_then(|v| v.as_str())█.filter(|e| !e.is_empty())█{█Some(ep) => match crate::attach::resolve_local_session(&mut brain, ep) {█Some(sid) => (Some(ep.to_string()), Some(sid)),█None => (None, None),█},█None => {█let session_id = line.get(\"session_id\").and_then(|v| v.as_u64());█let endpoint = session_id.and_then(|sid| {█brain.sessions().ok().and_then(|reply| {█reply█.sessions█.iter()█.find(|s| s.se [...4915ch elided...] // frame the serve loop sent (same serial IPC handler) - the late-reply█// overtake race that forced ADR-0038's eligibility-only retire cannot█// happen here. Without it, every completed serve on the long-lived pump█// carrier retains its row + reply ring until a conn-close sweep that█// never comes (the hertz census's 524->6411 stream growth). ATTACH is█// excluded: attach rows are Durable-class (brain-swap re-attach█// continuity) - they keep the completion-closure's eligibility-only█// retire exactly as before.█// [impl->REQ-SEAT-LIFETIME-BOUNDED]█if matches!(outcome, DispatchOutcome::Served(_)) && family != StreamFamily::Attach {█let _ = brain.net_stream_retire_terminal(stream_id);█}█[Showing lines 959-1088 of 1920. Use :1089 to continue]\u000f█</out>█# Tool call ¶█//Reading registry apply transaction█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"1050-1210\")█<out>█\u000epub struct RekeyNotice {█...█/// The superseded key (the one last seen for this machine).█pub old_hex: String,█/// The fresh key the machine now presents (the joiner).█pub new_hex: String,█}█/// The re-pair overwrite's effect leg (M8 decision 13, REQ-SUBNET-7), run█/// by the pairing host AFTER a completed ceremony: resolve the superseded█/// identities from the subnet's snapshot, tombstone their roster entries (this█/// subnet's scope - the ceremony proved control of THIS subnet's code, nothing█/// about others), rewrite the disk snapshot, and note the hexes in the eviction█/// marker so the pump clears the in-memory rows on its next tick. The caller█/// persists `roster`. Returns one [`RekeyNotice`] per superseded identity (the█/// demoted warn-on-change, REQ-MESH-5) - empty when nothing supersedes.█///█/// The roster tombstone is the load-bearing eviction since Mesh-D5a: the█/// inbound gates authorize on [`RosterStore::is_member`], so a re-keyed identity█/// that kept its roster entry would stay a member. Tombstone (not a bare remove)█/// because the roster is a grow-set: a plain delete re-merges from any peer█/// that still lists the dead key. The D3 tombstone p [...5630ch elided...] y() {█let tmp = tempfile::tempdir().unwrap();█let root = tmp.path();█let owlery = root.join(\"owlery\");█let perch = owlery.join(\"hall-a\");█std::fs::create_dir_all(&perch).unwrap();█// Real project dirs OUTSIDE any repo -> project_id_for_dir falls back to the█// folder name (no remote, no git toplevel).█let work = root.join(\"work\");█for p in [\"alpha\", \"beta\", \"gamma\"] {█std::fs::create_dir_all(work.join(p)).unwrap();█}█let psyche = owlery.join(\"hall-a/hall-a-psyche\"); // owlery-internal -> excluded█std::fs::create_dir_all(&psyche).unwrap();█let cwd = |p: &std::path::Path| p.to_string_lossy().replace('\\\\', \"/\");█...█}█...█}█[Showing lines 1049-1213 of 2429. Use :1214 to continue]\u000f█</out>█# Tool call ¶█//Reading registry advertise scan█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"430-600\")█<out>█\u000e fn merge_labels_locked(█...█) -> Vec<RegistryApplyVerdict> {█updates█...█.map(|u| {█...█let reg = regs.entry(u.subnet.clone()).or_default();█RegistryApplyVerdict::Merged(reg.merge_node_label(█&u.node,█u.label.clone(),█u.epoch,█))█})█.collect()█}█/// Record an admitted inbound feed (any origin) for the health surface.█// [impl->REQ-PUMP-STAGE-TRUTH]█fn stamp_admit(&self) {█self.last_admit_ms█.store(wall_ms(), std::sync::atomic::Ordering::Relaxed);█}█/// Wall-clock ms of the last admitted inbound registry/label feed, if any█/// this process lifetime (ADR-0039 Decision 5 status field).█// [impl->REQ-PUMP-STAGE-TRUTH]█pub fn last_admit_ms(&self) -> Option<u64> {█match self█.last_admit_ms█.load(std::sync::atomic::Ordering::Relaxed)█{█0 => None,█ms => Some(ms),█}█}█/// Scan the owlery and (re-)advertise every self perch into every member█/// subnet it is visible in, each row stamped with a fresh [...8191ch elided...] resources: resources.clone(),█last_active_ms,█shell_adapters: shell_adapters.clone(),█// The node label rides every row this node authors█// (REQ-SUBNET-3) - set from the OS hostname at daemon█// startup, so a rename converges by re-advertisement.█// [impl->REQ-SUBNET-3]█node_label: self.node_label.clone(),█// The hashed machine id rides beside it (M8 decision█// 13/22) - the re-pair overwrite anchor.█// [impl->REQ-SUBNET-7]█machine_id: self.machine_id.clone(),█...█};█...█}█}█...█}█[Showing lines 429-603 of 2429. Use :604 to continue]\u000f█</out>█# Tool call ¶█//Reading pump constants█read(path=\"crates/spt-daemon/src/pump/mod.rs\", selector=\"85-125\")█<out>█\u000epub mod health;█use health::PumpHealth;█mod notif;█mod registry;█mod sync;█mod update;█use notif::NotifWorker;█use registry::RegistryWorker;█use sync::SyncWorker;█use update::UpdateWorker;█/// The pump's tick granularity - each cadence fires when its period elapsed.█const TICK: Duration = Duration::from_millis(200);█/// Heartbeat write throttle (M8 decision 23, REQ-DAEMON-5): the stall█/// warning reads 3-cadence staleness, so a few seconds of heartbeat█/// granularity is invisible to it - and 5 writes/sec of disk churn is not.█const HEARTBEAT_PERIOD: Duration = Duration::from_secs(5);█/// Per-call deadline budget for the pump's brain-IPC reads (REQ-HAZARD-PUMP-█/// IPC-DEADLINE). Far above any legitimate stream-open / sync round-trip, below█/// the 60s QUIC idle timeout (we fire first; recovery is idempotent either█/// way). A read that exceeds this is treated as a poisoned client and█/// escalated to a supervised restart, NEVER a per-peer retry.█const PUMP_PEER_IO_TIMEOUT: Duration = Duration::from_secs(30);█/// Supervisor backoff floor: the first restart after a pump death.█const SUPERVISE_BACKOFF_BASE: Duration = Duration::from_secs(5);█/// Supervisor backoff cap (M8 deci [...92ch elided...] d, never silent.█const SUPERVISE_BACKOFF_CAP: Duration = Duration::from_secs(300);█/// A run that survived this long before dying counts as healthy - the next█/// backoff resets to the floor instead of doubling (a once-a-day panic must█/// not ratchet the pump toward permanent 5-minute outages).█const SUPERVISE_HEALTHY_RUN: Duration = Duration::from_secs(60);█/// Per-peer dial-backoff floor (PUMP-TRUTH W2, REQ-PUMP-PEER-ISOLATION, G5): the█/// first failed dial to a peer waits this long before the pump re-dials THAT█/// peer. Scoped to the peer - a dead peer backs off while live peers stay hot.█const PEER_BACKOFF_BASE: Duration = Duration::from_secs(5);█/// Per-peer dial-backoff cap (G5): a persistently-dead peer is re-dialed at most█[Showing lines 84-128 of 2054. Use :129 to continue]\u000f█</out>█# Tool call ¶█//Reading pump configuration constants█read(path=\"crates/spt-daemon/src/config.rs\", selector=\"15-50\")█<out>█\u000euse std::path::{Path, PathBuf};█use std::time::Duration;█use serde::{Deserialize, Serialize};█/// The interim default pulse period carried forward as the config default. The█/// daemon now treats this as a *fallback*, not a constant: `daemon.json` may█/// override it per machine.█pub const DEFAULT_PULSE_PERIOD: Duration = Duration::from_secs(5);█/// Default drop-file precedence protection window (epoch-ms), mirroring the█/// interim `spt_live` guard. Surfaced here so the one config source owns it.█pub const DEFAULT_PROTECTION_WINDOW_MS: u64 = 2_000;█/// Default orphan-watch grace window (B7): how long the supervised-crash teardown█/// waits after observing a hosted Self's harness owner gone before it rechecks█/// liveness and signs off (KNOWN-HAZARDS 1.1). Sized to cover a transient recovery█/// - a binary handoff relaunch or a brief stale poll - without delaying a real█/// teardown for long. Configurable per machine via `crash_grace_ms`.█pub const DEFAULT_CRASH_GRACE: Duration = Duration::from_secs(2);█/// Default peer-pump cadences (D9-1): how often the daemon pushes its█/// registry/notif feeds to trusted peers and pulls context syncs from them.█/// Conservative defaults - [...341ch elided...] st DEFAULT_UPDATE_CHECK_PERIOD: Duration = Duration::from_secs(3_600);█/// Default silent-peer registry eviction window (KNOWN-HAZARDS 4.10): rows█/// authored by a node not heard within this window are evicted on the next█/// registry pump tick. Sized to ~10 default pump cadences - generous against█/// transient drops (a peer re-advertises every cadence, so one admitted feed█/// inside the window keeps its rows), short enough that a dead node identity█/// stops poisoning bare-id resolution within minutes.█pub const DEFAULT_REGISTRY_EVICT_AFTER: Duration = Duration::from_secs(300);█/// Which relay stance the broker's net endpoint runs (ADR-0002 / REQ-NET-2) -█/// the `\"relay\"` knob in `daemon.json`. Maps onto `spt-net`'s `RelayPolicy` in█[Showing lines 14-53 of 652. Use :54 to continue]\u000f█</out>█# Assistant ¶█_**Searching for serve_registry_feed definition**_█# Tool call ¶█//Locating registry feed transaction█grep(pattern=\"fn serve_registry_feed|FeedAccumulator|apply_feed_batch|commit_feed_batch\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 1117|// [impl->REQ-INST-7]█*1118|fn serve_registry_feed(█1119| brain: &mut Brain,█1120| stream_id: u64,█1121| origin: &str,█...█1128| let mut decoder = RegistryDecoder::new();█*1129| let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);█1130| let mut merged = 0usize;█1131| let mut shifted: Vec<String> = Vec::new();█1132| // One commit per BATCH, never per chunk × record-kind (ADR-0040█...█1147| if let Some(batch) = acc.push(decoder.push(&bytes)) {█*1148| merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);█1149| }█1150| }█1151| Ok(BrokerEvent::NetStreamEof { stream_id: sid, .. }) if sid == stream_id => {█1152| if let Some(batch) = acc.finish() {█*1153| merged += commit_feed_batch(registry, origin, &policy, batch, &mut shifted);█1154| }█1155| return DispatchOutcome::Served(format!(\"registry feed: {merged} record(s)\"));█1156| }█...█1167|// [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]█*1168|fn commit_feed_batch(█1169| registry: &RegistryHost,█1170| origin: &str, [...992ch elided...] othing\");█1899| assert!(acc.push(vec![inst(\"b\")]).is_none(), \"chunk 3: pooled\");█...█1905| // batches, memory stays bounded.█*1906| let mut acc = FeedAccumulator::new(3);█1907| assert!(acc.push(vec![inst(\"a\"), inst(\"b\")]).is_none());█1908| let full = acc.push(vec![inst(\"c\"), inst(\"d\")]).expect(\"bound tripped\");█1909| assert_eq!(full.len(), 4, \"the tripped batch carries what pooled\");█...█1913| // An EMPTY feed commits nothing at all (zero snapshot writes ride on█*1914| // this: apply_feed_batch is never called with an empty remainder).█*1915| let mut acc = FeedAccumulator::new(10);█1916| assert!(acc.push(vec![]).is_none());█1917| assert!(acc.finish().is_none(), \"an empty feed commits nothing\");█1918| }\u000f█</out>█# Tool call ¶█//Reading registry feed transaction█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"1100-1280\")█<out>█\u000efn worker(█...█) -> WorkerReport {█...█WorkerReport {█...█family: Some(family),█endpoint,█}█}█/// Registry feed arm: decode `RegistryUpdate` lines, merge each batch into█/// the daemon's [`RegistryHost`] under the fail-closed gate (member subnet ∧█/// origin trusted in that subnet), until the peer finishes.█///█/// An admitted batch may carry **attention flips** (REQ-INST-3): a peer█/// instance of an id observed transitioning to `Active` - its node's daemon█/// just gave it a driver, so a *locally hosted* instance of the same id█/// rests warm (CONTEXT: driving `ling@laptop` makes `ling@desktop`█/// dormant). The rest edge's transition echo is gate-armed█/// ([`crate::resting::arm_transition_echo`]) - the endpoint's own pulse█/// loop runs the bounded summarizer call, never this worker (the KH 7.4█/// non-blocking posture: N flips in one feed are N gate files, not N LLM█/// calls serialized here).█// [impl->REQ-INST-7]█fn serve_registry_feed(█brain: &mut Brain,█stream_id: u64,█origin: &str,█registry: &RegistryHost,█) -> DispatchOutcome {█let policy = RegistryGatePolicy::load();█if let Err(e) = brain.net_stream_subscribe(stream_id, 0) {█[...5541ch elided...] eed█/// (not per record) - the same freshness the other arms get per request.█///█/// A **freshly inserted** undismissed row additionally gets a first-fire here█/// (REQ-PRES-1, the convergent cross-node redirect's receiving half): the█/// producing node skipped its local surface because the MRA winner lives█/// here - this node's own presence resolution surfaces it. A row this node's█/// MRA also calls remote stays unmarked and rides on (someone else's█/// feed-apply surfaces it); replays merge `Unchanged` and never re-fire.█// [impl->REQ-NOTIF-1]█// [impl->REQ-PRES-1]█fn serve_notif_feed(brain: &mut Brain, stream_id: u64, origin: &str) -> DispatchOutcome {█let store = match NotifStore::open() {█Ok(s) => s,█...█};█...█}█[Showing lines 1099-1283 of 1920. Use :1284 to continue]\u000f█</out>█# Tool call ¶█//Locating registry batch size█grep(pattern=\"REGISTRY_APPLY_BATCH_RECORDS\", path=\"crates/spt-daemon/src/dispatch.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 1128| let mut decoder = RegistryDecoder::new();█*1129| let mut acc = FeedAccumulator::new(REGISTRY_APPLY_BATCH_RECORDS);█1130| let mut merged = 0usize;█1131| let mut shifted: Vec<String> = Vec::new();█1132| // One commit per BATCH, never per chunk × record-kind (ADR-0040█...█1202|/// per-chunk. Generous: a real advertisement round is a few records per peer.█*1203|const REGISTRY_APPLY_BATCH_RECORDS: usize = 4096;█1204|█1205|/// One accumulated (pre-commit) slice of a registry feed, split by record█1206|/// kind for the two gated merge paths (REQ-SUBNET-3).\u000f█</out>█# Tool call ¶█//Locating batch snapshot writer█grep(pattern=\"pub fn apply_feed_batch|fn apply_feed_batch|write_snapshots\", path=\"crates/spt-daemon/src/registryhost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 124| snapshot_dir: PathBuf,█*125| /// How many times [`write_snapshots`](Self::write_snapshots) ran this█126| /// process - the REQ-REGISTRY-APPLY-TRANSACTIONAL observable: a feed█127| /// applied transactionally writes ONCE per feed (bounded batches: once█128| /// per batch), never once per chunk × record-kind (the KH 7.44 write█...█275| }█*276| self.write_snapshots();█277| (verdicts, flips)█278| }█279|█...█346| // [impl->REQ-REGISTRY-APPLY-TRANSACTIONAL]█*347| pub fn apply_feed_batch(█348| &self,█349| origin_node: &str,█350| labels: &[NodeLabelUpdate],█...█375| }█*376| self.write_snapshots();█377| (merged, flips)█378| }█379|█...█401| }█*402| self.write_snapshots();█403| verdicts█404| }█405|█...█724| drop(regs);█*725| self.write_snapshots();█726| out█727| }█728|█...█769| if evicted > 0 {█*770| self.write_snapshots();█771| }█772| evicted█773| }█...█805| if evicted > 0 {█*806| self.write_snapshots();█807| }█808| evicted█809| }█...█830| /// that triggered it (readers tolerate staleness by contract).█*831| fn write_snapshots(&self) {█832| self.snapshot_writes█833| .fetch_add(1, std::sync::atomic::Ordering::Relaxed);█834| let regs = self.regs.lock().unwrap();█...█913| if evicted > 0 {█*914| self.write_snapshots();█915| }█916| evicted█917| }█...█1803| #[test]█*1804| fn apply_feed_batch_writes_snapshots_once_with_per_kind_semantics_parity() {█1805| let dir = tempfile::tempdir().unwrap();█1806| let h = host(&dir.path().join(\"batch\"));█1807| let twin_dir = tempfile::tempdir().unwrap();\u000f█</out>█# Tool call ¶█//Reading registry snapshot writes█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"200-360,720-780\")█<out>█\u000e pub fn instances_of(&self, endpoint_id: &str) -> Vec<Instance> {█self.regs█.lock()█.unwrap()█.values()█.flat_map(|reg| reg.instances(endpoint_id).iter().cloned())█.collect()█}█/// Run `f` with this host's **canonical per-node epoch** - the ONE█/// monotonic counter (identity/epoch.json) behind every locally-authored█/// registry row. Every other per-node-id producer on this node MUST mint█/// from the same source, or `node:epoch`-shaped ids collide: a notif_id is█/// `node_hex:epoch`, so the pump's consent-notif producer and the CLI█/// notify front door (which loads this same canonical source) would█/// otherwise issue the same id from independent counters. (Field bug: the█/// pump minted consent notif_ids from the stream-open op counter█/// `pump-ops.json` - a different file - so on a node whose two counters█/// were both low the consent notif and a presence/notify notif collided on█/// `node:1`. The rig's presence-redirect rung caught it: `UNIQUE█/// constraint failed: notifs.notif_id`.) Locks the shared cursor so the█/// dispatcher's registry arm and [...8319ch elided...] let n = reg.evict_nodes(silent);█if n > 0 {█eprintln!(\"REGISTRY_EVICT:{subnet}: {n} row(s) from silent node(s)\");█}█evicted += n;█}█drop(regs);█drop(heard);█if evicted > 0 {█self.write_snapshots();█}█evicted█}█/// Evict per-row **aged-Offline ghosts** across every subnet registry█/// (REQ-HAZARD-REGISTRY-GHOST-ROWS trigger (b), #2-secondary): a row that has█/// been non-routable (`Offline`) on this receiver beyond `ttl` is removed even█/// while its author node is alive - the decay [`evict_silent_peers`] (node█/// silence) cannot give, so a `purge`/`erase` Offline ghost (ghost-heal█/// re-advertises Offline once, whole-node eviction never fires) stops\u000f█</out>█# Assistant ¶█_**Planning batch calls for snapshots**_█# Tool call ¶█//Reading snapshot write complexity█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"820-870\")█<out>█\u000e pub fn rows(&self, subnet: &str, endpoint_id: &str) -> Vec<Instance> {█self.regs█...█.unwrap_or_default()█}█/// A point-in-time clone of one subnet's registry (resolution input).█pub fn snapshot(&self, subnet: &str) -> Option<SubnetRegistry> {█self.regs.lock().unwrap().get(subnet).cloned()█}█/// Mirror every subnet's registry to `identity/registry/<subnet>.json`█/// (tmp-write + atomic rename - KNOWN-HAZARDS 5.2) for out-of-process█/// readers. Best-effort: a failed snapshot write must not fail the merge█/// that triggered it (readers tolerate staleness by contract).█fn write_snapshots(&self) {█self.snapshot_writes█.fetch_add(1, std::sync::atomic::Ordering::Relaxed);█let regs = self.regs.lock().unwrap();█if regs.is_empty() {█return;█}█if std::fs::create_dir_all(&self.snapshot_dir).is_err() {█return;█}█for (subnet, reg) in regs.iter() {█let Ok(json) = serde_json::to_vec_pretty(reg) else {█continue;█};█let _ = atomic_write(&self.snapshot_dir.join(format!(\"{subnet}.json\")), &j [...396ch elided...] let _ = atomic_write(&Self::heard_path(&self.snapshot_dir), &json);█}█}█}█/// The snapshot path for one subnet (the CLI reader's contract).█pub fn snapshot_path(dir: &Path, subnet: &str) -> PathBuf {█dir.join(format!(\"{subnet}.json\"))█}█/// The heard-map mirror's path (the CLI reader's contract): `node hex ->█/// last admitted-feed wall ms`.█// [impl->REQ-SUBNET-1]█pub fn heard_path(dir: &Path) -> PathBuf {█dir.join(\"heard.meta\")█}█/// The re-pair eviction marker's path (M8 decision 13, REQ-SUBNET-7):█/// a JSON array of superseded node hexes the pairing host noted -█/// consumed by the pump's registry tick so the IN-MEMORY rows go too█[Showing lines 819-873 of 2429. Use :874 to continue]\u000f█</out>█# Assistant ¶█_**Analyzing recent_projects_for performance impact**_█# Tool call ¶█//Locating recent project scan█grep(pattern=\"fn recent_projects_for|recent_projects_for\", path=\"crates/spt-daemon/src/registryhost.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 583| let controlled = info.as_ref().is_some_and(|i| i.controlled);█*584| let recent_projects = recent_projects_for(&perch_path, owlery);█585| let last_active_ms = info.and_then(|i| i.last_active_ms);█586| for sub in &subnets.subnets {█587| let Ok(ep) = epoch.next_epoch() else { continue };█...█987|// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]█*988|fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {█989| let entries = spt_store::sessions::read_all(perch_path);█990| let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();█991| let mut out: Vec<String> = Vec::new();█...█1193|█*1194| // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped█1195| // project IDs from the session ledger newest->oldest, excludes owlery-internal cwds█1196| // (a psyche-host session is not a project), dedups (a project's newest occurrence█1197| // wins its slot), and bounds the count. Project IDs only - no dirs on the wire.█1198| #[test]█*1199| fn recent_projects_for_dedups_newest_first_excludes_owlery() {█1200| let tmp = tempfile::tempdir().unwrap();█1201| let root = tmp.path();█1202| let owlery = root.join(\"owlery\");█...█1229|█*1230| let got = recent_projects_for(&perch, &owlery);█1231| // newest-first, owlery excluded, alpha deduped to its newest slot.█1232| assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");█1233| }\u000f█</out>█# Tool call ¶█//Reading registry project scan█read(path=\"crates/spt-daemon/src/registryhost.rs\", selector=\"960-1050\")█<out>█\u000e/// A REMOTE controller keeps its own `driven_by` origin. A LOCAL controller (the█/// separate `controlled` flag, with `driven_by` = None per KH 7.15) is driven from█/// THIS node, so it gossips `self_node`. An undriven endpoint gossips `None`. Pure█/// over its inputs so the any-controller mapping is unit-tested.█// [impl->REQ-GOSSIP-CONTROLLED-ANY]█fn gossip_controller_node(█driven_by: Option<&str>,█controlled: bool,█self_node: &str,█) -> Option<String> {█match driven_by {█Some(remote) => Some(remote.to_string()),█None if controlled => Some(self_node.to_string()),█None => None,█}█}█/// Bound on the recent-project IDs a single instance gossips - newest-first, so the█/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can█/// accumulate many cwds); the picker's project pane never needs more.█const MAX_GOSSIPED_PROJECTS: usize = 8;█/// The endpoint's recent project IDs newest->oldest for gossip (#4,█/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,█/// owlery-internal cwds excluded (a psyche-host session is not a project - mirrors the█/// picker + `REQ-STORE-CONTEXT-BRANCH-FI [...2131ch elided...] `new_hex`. The DEMOTED█/// form of the former label-anchored warn-on-change - anchored on the hashed█/// `machine_id` (not the spoofable label), surfaced as a non-blocking notice at█/// the same event as the REQ-SUBNET-7 eviction, **never a gate**. Absent a█/// machine id the superseded match never fires, so no false notice is raised.█#[derive(Debug, Clone, PartialEq, Eq)]█pub struct RekeyNotice {█/// The machine's advertised node label (display only).█pub label: String,█/// The hashed machine id the match anchored on.█pub machine_id: String,█/// The superseded key (the one last seen for this machine).█pub old_hex: String,█/// The fresh key the machine now presents (the joiner).█pub new_hex: String,█}█[Showing lines 959-1053 of 2429. Use :1054 to continue]\u000f█</out>█# Tool call ¶█//Locating session log reads█grep(pattern=\"fn read_all|sessions.log|read_sessions|session.*entries|SessionEntry\", path=\"crates/spt-store/src/sessions.rs\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e*1|//! Per-endpoint **session ledger** - `<perch>/sessions.log` (ADR-0019 /█2|//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/█*3|//! sessions.log`.█4|//!█5|//! A live agent that `/clear`s or `/compact`s keeps its perch identity but█6|//! rotates its harness `session_id` (a new transcript file). The single█...█26|/// The ledger filename under a perch.█*27|pub const LEDGER_FILE: &str = \"sessions.log\";█28|█29|/// On-disk row cap. The ledger is a rolling tail - older rows rotate out on█30|/// append so the file can never grow without bound (risk #2).█...█58|#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]█*59|pub struct SessionEntry {█60| /// RFC3339-UTC instant (see [`crate::timefmt`]).█61| pub ts: String,█62| /// The harness session id that became active.█...█98|/// line is skipped, the rest still load (the degrade-don't-crash store stance).█*99|pub fn read_all(perch: &Path) -> Vec<SessionEntry> {█100| let Ok(s) = std::fs::read_to_string(perch.join(LEDGER_FILE)) else {█101| return Vec::new();█102| };█...█109|/// The last `k` rows (oldest->newest within the tail). `k == 0` => empty.█*110|pub fn last_k(perch [...1560ch elided...] let row = SessionEntry {█310| ts: \"t\".to_string(),█311| session_id: \"s\".to_string(),█312| trigger: SessionTrigger::Boot,█...█321| );█*322| let back: SessionEntry = serde_json::from_str(&json).unwrap();█323| assert_eq!(row, back, \"a no-cwd row round-trips identically\");█324| }█325|█...█354| fn adapter_field_roundtrips_and_survives_append() {█*355| let none_row = SessionEntry {█356| ts: \"t\".to_string(),█357| session_id: \"s\".to_string(),█358| trigger: SessionTrigger::Boot,█...█374| &perch,█*375| &SessionEntry {█376| ts: \"t2\".to_string(),█377| session_id: \"s2\".to_string(),█378| trigger: SessionTrigger::Clear,\u000f█</out>█# Tool call ¶█//Reading session store scan█read(path=\"crates/spt-store/src/sessions.rs\", selector=\"1-180\")█<out>█\u000e//! Per-endpoint **session ledger** - `<perch>/sessions.log` (ADR-0019 /█//! REQ-TERM-6), heir to the sister project's `psyches/tracked/agents/<id>/█//! sessions.log`.█//!█//! A live agent that `/clear`s or `/compact`s keeps its perch identity but█//! rotates its harness `session_id` (a new transcript file). The single█//! `{session_id}` a `[history]`/`[digest]` source resolves therefore *follows*█//! the thread but cannot *span* it. This ledger records each rotation so the█//! digest can enumerate the **last K sessions** and bridge a boundary█//! (ADR-0019 §thread-spanning).█//!█//! One JSONL row per rotation: `{ts, session_id, trigger}`. The ledger is█//! **bounded** ([`MAX_LEDGER`]) - the sister project's seal-on-boot failure grew█//! its equivalent unboundedly (DIGEST-MILESTONE-PLAN risk #2); appending rotates█//! the oldest rows out. A re-bind of the *same* session is not a new boundary and█//! is deduped.█// [impl->REQ-TERM-6]█use std::io;█use std::path::Path;█use serde::{Deserialize, Serialize};█use crate::atomic::atomic_write_string;█/// The ledger filename under a perch.█pub const LEDGER_FILE: &str = \"sessions.log\";█/// On-disk row cap. The ledger is a rolling tail - [...6045ch elided...] new row's ordinal is one past the highest existing (monotonic, persisted).█// With the backfill above every existing row is now Some, so `last()` carries█// the max; an empty ledger starts at 0.█let next = entries█.last()█.and_then(|e| e.ordinal)█.map(|o| o + 1)█.unwrap_or(0);█let mut entry = entry.clone();█entry.ordinal = Some(next);█entries.push(entry);█let start = entries.len().saturating_sub(MAX_LEDGER);█let body: String = entries[start..]█.iter()█.map(|e| serde_json::to_string(e).unwrap_or_default())█.map(|l| l + \"\\n\")█.collect();█std::fs::create_dir_all(perch)?;█atomic_write_string(&perch.join(LEDGER_FILE), &body)?;█Ok(true)█}█[Showing lines 1-183 of 478. Use :184 to continue]\u000f█</out>█# Assistant ¶█_**Investigating git command usage in project_id_for_dir**_█# Tool call ¶█//Locating project id resolution█grep(pattern=\"pub fn project_id_for_dir|fn project_id_for_dir|git\", path=\"crates/spt-store/src/project.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 3|//!█*4|//! Derived **from the project's git remote URL** when it has one: stable and█5|//! path-independent, so the same project at `/home/x/proj` and█6|//! `C:\\Users\\x\\proj` resolves to the same id (which is what lets D6's█*7|//! `p-<project_id>` branches line up across nodes). A git repo without a█*8|//! remote falls back to its toplevel **folder name**; a non-git dir falls back█9|//! to its own folder name (documented limitation: folder names are not█10|//! guaranteed path-independent across machines).█11|//!█...█14|//! name everywhere, and two URL spellings of one remote (SSH vs HTTPS,█*15|//! trailing `.git`, case) normalize to one id.█16|// [impl->REQ-STORE-1]█17|█18|use std::path::Path;█...█20|█*21|use crate::gitrun::run_git;█22|█*23|/// Budget for the (local, fast) `git remote get-url` / `rev-parse` reads.█24|const PROJECT_GIT_TIMEOUT: Duration = Duration::from_secs(10);█25|█26|/// Slug a remote URL (or any name) into the project-id charset: lowercase,█*27|/// scheme/credentials/`.git` stripped, every non-`[a-z0-9]` run collapsed to█28|/// one `-`, trimmed of leading/trailing `-`.█29|fn slug(raw: &str) -> String {█30| let mut s = raw.trim().to_ascii_l [...4507ch elided...] lay_from_url(\"https://example.com/Team/Repo/\"), \"Repo\");█200|█201| // One-pass derivation: id keys on the slug, display stays recognizable.█...█204| std::fs::create_dir_all(root.join(\"nested\")).unwrap();█*205| run_git_ok(&[\"init\", &root.to_string_lossy()], None, None).unwrap();█206| // No remote -> display = toplevel folder.█207| let (id, disp) = project_id_and_display_for_dir(&root.join(\"nested\"));█208| assert_eq!((id.as_str(), disp.as_str()), (\"proj-x\", \"proj-x\"));█209| // With a remote -> id slugged, display = URL tail (case preserved).█*210| run_git_ok(█*211| &[\"-C\", &root.to_string_lossy(), \"remote\", \"add\", \"origin\", \"git@example.com:Team/CoolRepo.git\"],█212| None,█213| None,█214| )\u000f█</out>█# Assistant ¶█_**Identifying excessive git process spawning**█**Quantifying session log sizes and process overhead**_█# Tool call ¶█//Sizing endpoint ledgers█glob(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\", hidden=true, gitignore=false, limit=100)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## mobile-gw/█sessions.log█## todlando/█sessions.log█## doyle/█sessions.log█## lia/█sessions.log█## webbie/█sessions.log█## gaki-normal-probe/█sessions.log█## perri/█sessions.log█## hertz/█sessions.log█## emphasys/█sessions.log█## deployah/█sessions.log█## flynn/█sessions.log█## chert/█sessions.log█## wakep9/█sessions.log\u000f█</out>█# Tool call ¶█//Counting ledger rows█grep(pattern=\"^\\\\{\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## chert/█### sessions.log█*1|{\"ts\":\"2026-07-09T08:22:57Z\",\"session_id\":\"4bc2e259-0e4a-4331-be30-6e6b8230bf2a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt\"}█*2|{\"ts\":\"2026-07-09T08:23:13Z\",\"session_id\":\"ef8f1a4c-b80c-4d35-991d-adeffbad8cd0\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt\"}█## deployah/█### sessions.log█*1|{\"ts\":\"2026-07-07T05:12:52Z\",\"session_id\":\"8f826b4f-918e-401c-9a34-b55939a457d1\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-07T05:57:29Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-07T10:22:44Z\",\"session_id\":\"2592511f-8de4-4da3-bbe8-764cffdff6ec\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-07T10:22:49Z\",\"session_id\":\"72f89cf6-7ec0-450a-b68c-4f401db59a61\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\User [...27975ch elided...] ssions.log█*1|{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}█*2|{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}█## webbie/█### sessions.log█*1|{\"ts\":\"2026-07-16T23:51:06Z\",\"session_id\":\"e5b62b57-69a0-452c-9c7e-cd3708186344\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\website\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Reading project id subprocess path█read(path=\"crates/spt-store/src/project.rs\", selector=\"55-135\")█<out>█\u000efn slug(raw: &str) -> String {█...█while out.ends_with('-') {█out.pop();█}█out█}█/// Derive the `project_id` for a directory inside (or being) a project.█/// Remote-URL first, then git-toplevel folder name, then the dir's own name;█/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring -█/// a broken repo must not stall context routing.█// [impl->REQ-STORE-1]█pub fn project_id_for_dir(dir: &Path) -> String {█project_id_and_display_for_dir(dir).0█}█/// The human-recognizable DISPLAY name for a remote URL: the last path segment,█/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/█/// spt-core.git` -> `spt-core`; `git@github.com:SaberMage/spt-core.git` -> `spt-core`.█/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging -█/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.█fn display_from_url(url: &str) -> String {█let s = url.trim().trim_end_matches('/');█let s = s.strip_suffix(\".git\").unwrap_or(s);█// Last segment after a `/` (path) or `:` (scp-style `host:org/repo`).█let tail = s.rsplit(['/', ':']).next().unwrap_or(s);█if tail.is [...1402ch elided...] , &dir_arg, \"rev-parse\", \"--show-toplevel\"],█None,█None,█PROJECT_GIT_TIMEOUT,█) {█if out.success() {█if let Some(name) = Path::new(&out.stdout_trimmed())█.file_name()█.map(|n| n.to_string_lossy().to_string())█{█let id = slug(&name);█if !id.is_empty() {█return (id, name);█}█}█}█}█// 3. The directory's own folder name.█let name = dir█.file_name()█.map(|n| n.to_string_lossy().to_string())█.unwrap_or_default();█let id = if name.is_empty() { String::new() } else { slug(&name) };█if id.is_empty() {█...█} else {█...█}█}█[Showing lines 54-138 of 220. Use :139 to continue]\u000f█</out>█# Tool call ¶█//Finding git invocation telemetry█grep(pattern=\"git\\\\.exe|project_id|fatal: not a git|cannot change|spawn\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-4898\", case=false, gitignore=false, skip=null)█<out>█\u000e 1004|CONN_LIFECYCLE: conn=14 role=brain stream-subscriber stream=5 stream-subscriber stream=6 stream-subscriber stream=9 stream-subscriber stream=11 stream-subscriber stream=14 stream-subscriber stream=15 stream-subscriber stream=18 stream-subscriber stream=19... wall_ms=1784292560268 mono_ms=145905 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1005|BRAIN_RESTART: planned update respawn (generation 1)█1006|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560288 mono_ms=145924 event=session-detach session=1 was_controller=true viewers_dropped=0 [REQ-CONN-POISON-ATTRIBUTION]█1007|CONN_LIFECYCLE: conn=22 role=brain stream-subscriber stream=1 controller session=1 endpoint=lia by=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d... wall_ms=1784292560288 mono_ms=145924 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█1008|=== spt brain stderr - generation 1 - pid 76764 ===█...█1017|CONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█*1018|PUMP_IPC_READER: spawned█*1019|PUMP_IPC_READER: spawned█1020|CONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]█1021|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560815 mono_ms=146452 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1022|CONN_LIFECYCLE: conn=411 role=brain wall_ms=1784292560816 mono_ms=146452 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Assistant ¶█_**Estimating row count from grep output limits**█**Analyzing git spawn overhead and recent_projects regression**_█# Tool call ¶█//Finding recent project feature release█grep(pattern=\"recent_projects|GOSSIP-ADAPTER-PROJECTS|gossiped.*project|project IDs\", path=\"CHANGELOG.md;docs;.claude/reports\", selector=null, case=false, gitignore=false, skip=null)█<out>█\u000e# CHANGELOG.md█600|█*601|- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.█602|- **A controlled endpoint now reads as CONTROLLED accurately - and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.█603|- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.█604|- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.█# docs/█## NEXT-MILESTONE-PICKER-TRIAGE.md█149|**Fix shape:** additive gossip fields, N-1-safe exac [...1449ch elided...] r+recent_projects | #1/#4 share the history/gossip seams; #5/#8 depend on both |█287|| W3 surfaces | #8 project column (list + --json additive); #7 `spt api endpoint-info` | Consume W1 stamps + W2 sources; xtask docs regen both |█288|| W4 UX | #5 choose-project step; #6 resume panel retention; **#10 BrokenPipe (micro)** | Build on W2's dir-carrying history model; #10 slots anywhere cheap |█289|█## PROJECT-INDEX-TRIAGE.md█47|- **Behavioral parity is binding**: precedence session-cwd -> origin-cwd ->█*48| context-recency; rendered project IDs/display names must not change.█49|█50|## Waves█51|█# .claude/reports/2026-07-10-hertz-session/█## 03-cli-project-index-latency-rca.md█117|█*118|Optimization must not change rendered project IDs/display names.█119|█120|## Regression tests█121|\u000f█</out>█# Tool call ¶█//Reading project index cache rationale█read(path=\"crates/spt-daemon/src/projwriter.rs\", selector=\"100-240\")█<out>█\u000epub struct IndexWriterStats {█...█pub last_duration_ms: u64,█/// The last cycle failure, if the most recent cycle failed (`None` = last█/// cycle succeeded). While set, readers are on last-known-good.█#[serde(default, skip_serializing_if = \"Option::is_none\")]█pub last_error: Option<String>,█/// Row counts of the published snapshot.█#[serde(default)]█pub endpoints: u64,█#[serde(default)]█pub projects: u64,█/// Distinct cwds in the derivation cache.█#[serde(default)]█pub cwds: u64,█/// Cumulative cwd-cache hit/miss census.█#[serde(default)]█pub cwd_cache_hits: u64,█#[serde(default)]█pub cwd_cache_misses: u64,█/// Cycles that FAILED to publish - every read until the next success is a█/// stale (last-known-good) read by contract.█#[serde(default)]█pub stale_reads: u64,█/// Publishes that REPLACED an unreadable / schema-mismatched index file█/// (the writer repairing a torn or foreign snapshot).█#[serde(default)]█pub repairs: u64,█/// The most recent cycle's complexity counters (the CI-gate surface).█#[serde(default)]█pub last_cycle: CycleCounters,█/// Lifetime totals (t [...3796ch elided...] s job).█// [impl->REQ-PROJECT-INDEX-WRITER]█pub fn new(paths: WriterPaths) -> WriterEngine {█let (current, repair_pending) = match projindex::read_index_at(&paths.index_path) {█IndexRead::Snapshot(idx) => (Some(idx), false),█IndexRead::Absent(AbsentReason::Missing) => (None, false),█// Torn/corrupt/foreign file present: readers are degrading to `-`;█// our next publish REPAIRS it (and is counted as such).█IndexRead::Absent(_) => (None, true),█};█let last_fingerprint = current█.as_ref()█.map(|i| i.source_generation.clone())█.unwrap_or_default();█let mut stats = IndexWriterStats {█...█};█...█}█...█}█[Showing lines 99-243 of 1270. Use :244 to continue]\u000f█</out>█# Tool call ¶█//Locating project cwd cache█grep(pattern=\"cwd_cache|project_id_and_display_for_dir|project_id_for_dir\", path=\"crates/spt-daemon/src/projwriter.rs\", selector=null, case=true, gitignore=true, skip=null)█<out>█\u000e 113| #[serde(default)]█*114| pub cwd_cache_hits: u64,█115| #[serde(default)]█*116| pub cwd_cache_misses: u64,█117| /// Cycles that FAILED to publish - every read until the next success is a█118| /// stale (last-known-good) read by contract.█119| #[serde(default)]█...█218| /// normalized cwd -> stamped derivation (the C term's cross-cycle cache).█*219| cwd_cache: HashMap<String, CwdDerivation>,█220| /// Pending repair: the on-disk index was unreadable/foreign at load; the█221| /// next successful publish counts as a repair.█222| repair_pending: bool,█...█259| branch_order: Vec::new(),█*260| cwd_cache: HashMap::new(),█261| repair_pending,█262| stats,█263| }█...█282| for cwd in &req.cwds {█*283| self.cwd_cache.remove(&projderive::normalize_path(Path::new(cwd)));█284| }█285|█286| // -- 1. ONE branch enumeration -> fingerprint ----------------------█...█374| // cwd cache: one real derivation per distinct normalized cwd.█*375| let cache = std::cell::RefCell::new(&mut self.cwd_cache);█376| let hits = std::cell::Cell::new(0u64);█377| [...1426ch elided...] EAL git█*1123| // `project_id_and_display_for_dir`. Fixture mixes every leg: a git repo█1124| // WITH a remote (slug = folder name - the display-parity hard case), a█1125| // plain dir, an origin-only endpoint, branch-only membership, and the█1126| // per-cwd map the resume pane reads.█...█1193| &owlery,█*1194| spt_store::project::project_id_and_display_for_dir,█1195| )█1196| .into_iter()█1197| .map(|d| (d.id, d.dir, d.display))█...█1239| let (want_id, want_display) =█*1240| spt_store::project::project_id_and_display_for_dir(cwd);█1241| let got = idx█1242| .project_for_cwd(cwd)█1243| .unwrap_or_else(|| panic!(\"cwd map must hold {cwd:?}\"));\u000f█</out>█# Tool call ¶█//Finding registry round log markers█grep(pattern=\"SEED_ROTATED|REGISTRY_EVICT|REGISTRY_OFFLINE_EVICT|PUMP_PEER_FAIL\", path=\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\", selector=\"1000-4898\", case=true, gitignore=false, skip=null)█<out>█\u000e 1253|CONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1254|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0█*1255|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0█1256|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1257|CONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█1258|CONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█...█1423|CONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█*1424|PUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe0785 [...5541ch elided...] R_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979374 mono_ms=392464█*3625|PUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292979389 mono_ms=392480█3626|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=write-start [REQ-CONN-POISON-ATTRIBUTION]█3627|CONN_LIFECYCLE: conn=1478 role=brain wall_ms=1784292981128 mono_ms=566763 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]█3628|CONN_LIFECYCLE: conn=1479 role=brain wall_ms=1784292981129 mono_ms=566764 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\u000f█</out>█# Assistant ¶█_**Clarifying performance issue origin**█**Analyzing registry round timing and CPU bursts**█**Inspecting registry JSON file timestamps**█**Counting ledger entries for sessions 50-64**█**Planning grep search for external cwd paths**_█# Tool call ¶█//Counting Doyle project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}█6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}█7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}█8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}█...█46|{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d [...2962ch elided...] |{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}█*62|{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}█*63|{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}█*64|{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting Flynn project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/flynn/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-06T06:35:03Z\",\"session_id\":\"cfe4ff51-5063-4d00-9082-b4ef0a4f0055\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0}█*2|{\"ts\":\"2026-07-06T08:50:07Z\",\"session_id\":\"05d5e489-e4de-4da7-a6b5-196fcf255595\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1}█*3|{\"ts\":\"2026-07-06T10:06:56Z\",\"session_id\":\"43ef615c-d87f-4e9c-993b-fa8725e7ee44\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2}█*4|{\"ts\":\"2026-07-06T11:01:50Z\",\"session_id\":\"7ceef955-c1e4-4c41-80c5-b8e797f0d66e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3}█*5|{\"ts\":\"2026-07-06T11:24:07Z\",\"session_id\":\"6558286a-778d-41bd-a3f2-d503b33f4fa2\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4}█*6|{\"ts\":\"2026-07-06T11:42:24Z\",\"session_id\":\"eed0772b-2fa3-497b-a561-0a9073e1f4d1\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5}█*7|{\"ts\":\"2026-07-06T11:57:15Z\",\"session_id\":\"712eecc8-1f8f-46d1-9be0-6c87d251249f\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordin [...4978ch elided...] |{\"ts\":\"2026-07-09T23:28:04Z\",\"session_id\":\"b20becd2-4961-4419-956b-fd8b43ca727c\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}█*34|{\"ts\":\"2026-07-09T23:57:53Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}█*35|{\"ts\":\"2026-07-10T04:24:34Z\",\"session_id\":\"a2476c7e-db88-40fa-9ec3-ce902985829a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}█*36|{\"ts\":\"2026-07-10T04:25:21Z\",\"session_id\":\"f4c1fc0e-de8e-4df0-8416-f01761a944cb\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":35,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting Perri project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/perri/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-07T05:13:29Z\",\"session_id\":\"d5b46b36-ff77-4131-a774-17f6caa2ff35\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-07T06:07:05Z\",\"session_id\":\"6db151cc-515e-4fdf-8fe7-9f98697b588b\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-07T07:42:34Z\",\"session_id\":\"4c5e8257-ef66-4c12-a154-a6f83bdab25a\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-07T10:23:14Z\",\"session_id\":\"13712404-60aa-4dc9-957b-9e854ac0f73d\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-08T06:53:12Z\",\"session_id\":\"efdcbb37-8805-4cc2-9d17-ecc2f85984ce\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}█*6|{\"ts\":\"2026-07-08T09:40:38Z\",\"session_id\":\"6ea67f9d-c88a-454a-b88a-a0e4add41ba8\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-claude-code\",\"ordinal\":5, [...3040ch elided...] adapter\":\"claude-spt:ccs\"}█*22|{\"ts\":\"2026-07-15T00:20:50Z\",\"session_id\":\"b4fe0587-e19f-4b78-81a8-c97931c52126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":21,\"adapter\":\"claude-spt:ccs\"}█*23|{\"ts\":\"2026-07-16T01:39:08Z\",\"session_id\":\"058dcb6f-1586-47a0-\u000ea0cd-0a4a085881ca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}█*24|{\"ts\":\"2026-07-16T08:22:01Z\",\"session_id\":\"c1427211-6e8d-4571-aeb8-30d36fa816a6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}█*25|{\"ts\":\"2026-07-16T10:27:26Z\",\"session_id\":\"anchor-int-proof\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting Todlando project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}█*6|{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}█*7|{\"ts\":\"2026-07 [...4955ch elided...]█*32|{\"ts\":\"2026-07-17T01:30:24Z\",\"session_id\":\"75f8fe4c-b308-426d-8625-1f1c21e90a16\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}█*33|{\"ts\":\"2026-07-17T07:15:50Z\",\"session_id\":\"06a08dcc-5f8a-4ff9-bfd4-a428722081b3\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}█*34|{\"ts\":\"2026-07-17T08:41:43Z\",\"session_id\":\"a9315053-ac8e-4ef2-a769-aab81d8e5835\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}█*35|{\"ts\":\"2026-07-17T11:39:02Z\",\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting mobile project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}█*2|{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}█*3|{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}█*4|{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}█*5|{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}█*6|{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}█*7|{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-m [...6230ch elided...] 4Z\",\"session_id\":\"spt-mobile-host-46564\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":43,\"adapter\":\"mobile\"}█*45|{\"ts\":\"2026-07-17T01:13:12Z\",\"session_id\":\"spt-mobile-host-93200\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":44,\"adapter\":\"mobile\"}█*46|{\"ts\":\"2026-07-17T01:15:58Z\",\"session_id\":\"spt-mobile-host-82128\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":45,\"adapter\":\"mobile\"}█*47|{\"ts\":\"2026-07-17T05:14:03Z\",\"session_id\":\"spt-mobile-host-86180\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":46,\"adapter\":\"mobile\"}█*48|{\"ts\":\"2026-07-17T12:46:55Z\",\"session_id\":\"spt-mobile-host-75468\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":47,\"adapter\":\"mobile\"}\u000f█</out>█# Tool call ¶█//Counting Hertz project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 26|{\"ts\":\"2026-07-15T03:20:08Z\",\"session_id\":\"sess-45312-1784085608400930900\",\"trigger\":\"boot\",\"ordinal\":25}█*27|{\"ts\":\"2026-07-16T08:00:33Z\",\"session_id\":\"019f69f1-0d18-7000-9d01-44e3ec52844a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":26,\"adapter\":\"omp-spt\"}█*28|{\"ts\":\"2026-07-16T08:01:29Z\",\"session_id\":\"019f69f1-ea23-7000-95cb-ee768a4c7126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":27,\"adapter\":\"omp-spt\"}█29|{\"ts\":\"2026-07-16T08:13:34Z\",\"session_id\":\"sess-34280-1784189614810498300\",\"trigger\":\"boot\",\"ordinal\":28,\"adapter\":\"omp-spt\"}\u000f█</out>█# Assistant ¶█_**Summarizing external match counts**█**Analyzing git process frequency and failure timing**█**Noting pump round scheduling interval**█**Distinguishing failure sources by process timestamps**█**Identifying live pulse discriminator and gating release**_█# Tool call ¶█//Reporting registry CPU root cause█irc(op=\"send\", to=\"Main\", message=\"Highest-confidence residual brain burst source: registry pump's recent-project gossip. Every 30s (`config.rs:39`, live daemon.json=30000), RegistryWorker pre_round calls `advertise_local` (`pump/registry.rs:141-162`). For each of 12 perches, `registryhost.rs:488-1009` reads full bounded sessions.lo [...672ch elided...] a last_active/info writes. Gate: lifecycle poison/thread fix can pass (post-gen1 zero poison/dispatch failure), but CPU-to-noise gate HOLD/FAIL until this is measured/removed; 8.39% mean isn't noise.\", replyTo=null, await=false, from=null, timeoutMs=null, peek=null)█<out>█\u000eDelivered to 1 peer(s):█- Main: injected\u000f█</out>█# Assistant ¶█_**Refining exact count calculations**█**Verifying external line counts per project**_█# Tool call ¶█//Reading self perch enumeration█read(path=\"crates/spt-store/src/perch.rs\", selector=\"410-450\")█<out>█\u000e/// `<perch_path>/info.json` from an already-resolved path.█pub fn info_file_at(perch_path: &Path) -> PathBuf {█perch_path.join(\"info.json\")█}█/// Enumerate the **top-level `Self_` perch ids** in `owlery` - every immediate█/// subdirectory that carries an `info.json` (a bound perch). Pure dir scan,█/// tolerant: a missing/unreadable owlery, or an entry without `info.json`, is█/// silently skipped (never panics, never hard-fails). Nested Psyche/Worker█/// perches live under `<self>/nested/` and are deliberately excluded - the█/// consent-target resolver wants the user's *agent* sessions, not their hosted█/// children. Order is unspecified (the caller ranks by recency).█// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]█pub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {█let Ok(entries) = std::fs::read_dir(owlery) else {█return Vec::new();█};█let mut ids = Vec::new();█for entry in entries.flatten() {█if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {█continue;█}█if !info_file_at(&entry.path()).is_file() {█continue; // a dir without info.json is not a bound perch█}█if let Some(name) = e [...261ch elided...] nt>/nested/<child>/`), any dir that carries an `info.json`.█/// Unlike [`list_self_perch_ids`] (which deliberately excludes children for the█/// consent-target roster), this is the identity-truth enumerator: self-detection█/// by session_id and the cross-perch bind-honesty guard MUST see the nested█/// level, or a psyche-hosted session never resolves to its OWN perch and a█/// foreign perch can be silently rebound to it (F028 C2 contamination,█/// REQ-BIND-HONEST-SELF-STAMP). Pure dir scan, tolerant: a missing/unreadable█/// owlery or nested dir, or a dir without `info.json`, is silently skipped█/// (never panics). Order is unspecified.█// [impl->REQ-BIND-HONEST-SELF-STAMP]█pub fn list_all_perch_dirs(owlery: &Path) -> Vec<PathBuf> {█...█}█[Showing lines 409-453 of 695. Use :454 to continue]\u000f█</out>█# Tool call ¶█//Reading Wakep9 state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json\", selector=\"raw\")█<out>█\u000ePath 'C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json' not found\u000f█</out>█# Tool call ¶█//Counting Doyle external rows exactly█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log\", selector=\"1-64\", case=true, gitignore=false, skip=null)█<out>█\u000e 4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}█6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}█7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}█8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}█...█46|{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d [...2962ch elided...] |{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}█*62|{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}█*63|{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}█*64|{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting nonproject ledger rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Windows|\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\AppData\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## doyle/█### sessions.log█*1|{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}█5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}█*6|{\"ts\": [...5173ch elided...] ojects\",\"ordinal\":36,\"adapter\":\"mobile\"}█38|{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}█## wakep9/█### sessions.log█*1|{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}█*2|{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}\u000f█</out>","textHead":"# User ¶█Complete the assignment below, thoroughly:█# Target█Inspect v0.37 brain pump/registry/dispatcher execution paths that can create periodic CPU bursts; correlate expected cadence with the observed clustered one-second samples. Non-goal: self-hash, already proven fixed by read I/O.█# Change█Read source and current daemon log timing. Identify the highest-confidence periodic work loop and whether the measured duty cycle is expected steady-state or a regression.█# Acceptance█Report exact source locations, cadence, workload complexity, and a concrete field measurement that distinguishes candidates. No project-wide commands.█# Assistant ¶█_**Planning performance regression diagnosis**_█# Tool call ¶█//Reading diagnosis workflow█read(path=\"skill://diagnose\", selector=null)█<out>█\u000e---█name: diagnose█description: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce -> minimise -> hypothesise -> instrument -> fix -> regression-test. Use when user says \"diagnose this\" / \"debug this\", reports a bug, says something is broken/throwing/failing, or describes a performance regression.█---█# Diagnose█A discipline for hard bugs. Skip phases only when explicitly justified.█When exploring the codebase, use the project's domain glossary to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.█## Phase 1 - Build a feedback loop█**This is the skill.** Everything else is mechanical. If you have a fast, deterministic, agent-runnable pass/fail signal for the bug, you will find the cause - bisection, hypothesis-testing, and instrumentation all just consume that signal. If you don't have one, no amount of staring at code will save you.█Spend disproportionate effort here. **Be aggressive. Be creative. Refuse to give up.**█### Ways to construct one - try them in roughly this order█1. **Failing test** at whatever seam reaches the bug - unit, integration, e2e.█2. **Curl / HTTP script** against a running dev server [...5116ch elided...] # Phase 6 - Cleanup + post-mortem█Required before declaring done:█- [ ] Original repro no longer reproduces (re-run the Phase 1 loop)█- [ ] Regression test passes (or absence of seam is documented)█- [ ] All `[DEBUG-...]` instrumentation removed (`grep` the prefix)█- [ ] Throwaway prototypes deleted (or moved to a clearly-marked debug location)█- [ ] The hypothesis that turned out correct is stated in the commit / PR message - so the next debugger learns█**Then ask: what would have prevented this bug?** If the answer involves architectural change (no good test seam, tangled callers, hidden coupling) hand off to the `/improve-codebase-architecture` skill with the specifics. Make the recommendation **after** the fix is in, not before - you have more information now than when you started.█\u000f█</out>█# Tool call ¶█//Mapping brain source files█glob(path=\"**/*brain*\", hidden=true, gitignore=true, limit=200)█<out>█\u000e# crates/█## spt-daemon/█### src/█brain.rs█brainproc.rs█### tests/█brain_decouple.rs█brain_resume_conn_deadlock.rs█daemon_lifecycle_real_brain.rs█brain_swap.rs█## spt/tests/█brain_survive.rs█brain_split.rs█brain_respawn_rename.rs█# docs/adr/█0018-broker-brain-process-isolation-restoration.md█0004-single-daemon-broker-brain-split-and-self-update.md\u000f█</out>█# Tool call ¶█//Locating daemon logs█glob(path=\"**/*.log; **/logs/**; .spt/**; .planning/**\", hidden=true, gitignore=false, limit=200)█<out>█\u000e# .worktrees/r4-stale-guard/█gate.log█# .gstack/█browse-console.log█browse-network.log█Skipped missing paths: .spt/**, .planning/**\u000f█</out>█# Assistant ¶█_**Planning log and source path discovery**_█# Tool call ¶█//Mapping repository root█read(path=\".\", selector=null)█<out>█\u000e.█- .worktrees/ 9m ago█- gate-f4727cd/ 8h ago█- gate-73b29b8/ 9h ago█- gate-ad7fde8/ 22h ago█- pi-w1-main-check/ 1d ago█- gate-a841f5a/ 2d ago█- gate-w6/ 6d ago█- gate-w5/ 6d ago█- gate-w4/ 6d ago█- r4-stale-guard/ 6d ago█- rca-capture/ 1w ago█- f-035/ 1w ago█- ... 1 more█- docs-reorg/ 1w ago█- .claude/ 34m ago█- todlando-commune.md 5.6KB 1h ago█- reports/ [...13509ch elided...] CATION.md 3.0KB 1mo ago█- CI-SELFHOST-PLAN.md 3.8KB 1mo ago█- .github/ 1mo ago█- workflows/ 1h ago█- .gitattributes 363B 1mo ago█- .gstack/ 1mo ago█- browse-console.log 230B 1mo ago█- browse-network.log 2.1KB 1mo ago█- src/ 1mo ago█- .gitkeep 51B 1mo ago█[1 results limit reached. Use limit=2 for more]\u000f█</out>█# Tool call ¶█//Mapping brain module█read(path=\"crates/spt-daemon/src/brain.rs\", selector=null)█<out>█\u000e//! The brain (B2) - the restartable logic half that attaches to the broker.█//!█//! The brain holds all the volatile logic; it may be killed and restarted at█//! any moment (a routine self-update swaps it; a crash kills it). It connects to█//! the stable [`crate::broker::Broker`] over the versioned IPC, drives sessions█//! (spawn / input / resize / kill), and consumes their output. Two invariants█//! this type encodes:█//!█//! - **`gen_start = now()` on cold-start *and* handoff (KNOWN-HAZARDS 2.4).**█//! The wall-clock generation stamp is taken fresh on every start. A handed-off█//! brain rehydrates its resume cursor and generation *counter* from prior█//! state, but its `gen_start` is `now()`, **never** the stale value from that█//! state - a rehydrated `gen_start` would fire time-based discriminators on█//! the new generation. [`Brain::handoff`] takes the prior state by value yet█//! ignores its `gen_start_ms`.█//! - **Gapless, exactly-once resume.** The brain tracks `next_seq` - the next█//! output sequence it still needs. On handoff it `subscribe`s from that cursor;█//! the broker replays buffered output from there. [`Brain::read_event`] accepts█//! only the [...13265ch elided...] vent`] under the same accept/dedup/gap discipline.█/// Durability across a handoff is the logic layer's job (a re-attaching█/// brain queries `net-streams` and re-subscribes from its durable cursors).█net_cursors: std::collections::HashMap<u64, u64>,█/// The presence resume cursor (D4c) - the conn-liveness sibling of█/// `net_cursors`, set by [`Brain::net_presence_subscribe`] and advanced by█/// [`Brain::read_event`] under the same accept/dedup/gap discipline.█/// `None` until subscribed (or the first event arrives).█presence_cursor: Option<u64>,█/// Per-session **resume** output cursors (restoration D4-2): the multi-session█/// continuity state a cold-started brain rebuilds from the broker via█...█}█[Showing lines 1-300 of 2370. Use :301 to continue]\u000f█</out>█# Tool call ¶█//Mapping brain process module█read(path=\"crates/spt-daemon/src/brainproc.rs\", selector=null)█<out>█\u000e//! The brain **process** + its broker-side supervisor (ADR-0018 Q2/Q3 - the█//! broker/brain process-isolation restoration, D1 skeleton).█//!█//! ADR-0004 specified the broker/brain split as two **processes**; production█//! drifted to an in-process thread (`daemon.rs`), so `spt update apply` swaps█//! the binary on disk but never restarts the running code (the regression█//! ADR-0018 corrects). D1 restores the process boundary as a *true minimal█//! skeleton*: `spt daemon run` is the broker process and spawns a supervised█//! `spt daemon brain` child. The child connects over the existing broker socket█//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2█//! migrates the broker-resident loops here one per commit; **D2-1 moved the net█//! consumers** (inbound dispatcher + outbound peer pump - pure IPC clients, no█//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`█//! verb. The digest hub serve + seed-control stay broker-side continuity█//! resources (ADR-0018 Q2/Q5); later D2 commits move the digest parse + psyche█//! loops.█//!█//! What D1 proves (de-risk spike #1, the design's hardest invariant): the█//! broker spawns + supervises a [...14712ch elided...] // rollback (the 2026-07-09 field freeze), AND the same wedge black-holes recovery█// (the late `BRAIN_SUBSCRIBER_STALL_EVICT`). Driven on the FIRST heartbeat and on█// BOTH the trial candidate AND the rollback/recovery brain (one loop covers both);█// best-effort - a transient sessions error must never fell the heartbeat (the█// net_status probe above already owns broker-liveness). Self-applies: it drives█// the CURRENT (older) broker's already-shipped reap verb, so a new brain un-strands█// its own trial against a live older broker - no coordinated broker restart.█// [impl->REQ-UPDATE-TRIAL-DRAIN-DRIVE]█let _ = brain.sessions();█write_ready(generation);█}█}█[Showing lines 1-300 of 2165. Use :301 to continue]\u000f█</out>█# Tool call ¶█//Finding periodic Rust work█grep(pattern=\"interval|sleep|tick|recv_timeout|select!|poll|refresh|registry|dispatch|pump\", path=\"crates/spt-daemon/src;crates/spt-core/src;crates/spt/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## access.rs█4|//! order: subnet *visibility* (is the endpoint routable here at all? -█*5|//! `spt_store::visibility`, applied inside registry resolution) -> the█6|//! **endpoint access whitelist** (may *your node* remotely reach it? - THIS█7|//! module) -> *capability grants* (may this agent do this high-risk thing? -█8|//! [`crate::consent`], default-deny). The whitelist is the outer gate before█## adapter_update.rs█7|//! its manifest `[update]` block ([`Update`]); this module turns that directive█*8|//! into a per-adapter [`AdapterUpdateOutcome`], dispatched by avenue:█9|//!█10|//! - **`file_pull`** - spt-core controls the bytes, so it *verifies* them: the█11|//! pulled payload is checked against the adapter's **own** Ed25519 key (declared█...█163|/// is complete here. Soft-deregistered adapters are excluded by█*164|/// [`spt_runtime::registry::registered`].█165|// [impl->REQ-INSTALL-4]█166|pub fn ripple_registered(adapters_dir: &std::path::Path) -> Vec<(String, AdapterUpdateOutcome)> {█*167| let mut set = spt_runtime::registry::registered(adapters_dir);█168| set.sort_by_key(|(r, _)| r.registered_at_ms);█169| set.iter()█170| [...48998ch elided...] rite(\"doyle\", \"mock-shell-0\", \"old-token\", \"stale-frame\");█*351| // Relink minted \"new-token\"; the shell polls with it.█352| assert_eq!(█353| hub.take(\"doyle\", \"mock-shell-0\", \"new-token\"),█354| None,█...█359| !hub.has_slot(\"doyle\", \"mock-shell-0\"),█*360| \"the dead frame is cleared by the mismatching poll\"█361| );█362| }█363|█## effect.rs█7|//! kills it. Effects it drives cross the broker<->brain boundary - a PTY write, a█*8|//! spool row, a registry update. A brain that crashes *around* one of those█9|//! effects must, on restart, neither duplicate it (a re-injected keystroke, a█10|//! double-written row) nor drop it (a lost delivery).█11|//!█...█[Showing lines 1-965 of 1129 (50.0KB limit). Use :966 to continue]\u000f█</out>█# Assistant ¶█_**Planning environment variable and path inspection**█**Reviewing default SPT_HOME location**_█# Tool call ¶█//Locating runtime home paths█grep(pattern=\"SPT_HOME|stderrlog|logs_dir|\\\\.log|brain-.*log|daemon.*log\", path=\"crates/spt-daemon/src;crates/spt-runtime/src;crates/spt/src\", selector=null, case=false, gitignore=true, skip=null)█<out>█\u000e# crates/spt-daemon/src/█## brainproc.rs█9|//! `spt daemon brain` child. The child connects over the existing broker socket█*10|//! IPC, signals `ready`, hosts the brain-side logic loops, and idles. D2█11|//! migrates the broker-resident loops here one per commit; **D2-1 moved the net█12|//! consumers** (inbound dispatcher + outbound peer pump - pure IPC clients, no█13|//! shared `Arc<Broker>`) into the brain, gated on the existing `net-status`█...█138|/// The `spt daemon brain` child entry. Connect to the broker over the existing█*139|/// socket IPC, signal readiness, host the brain-side logic loops, and idle -█140|/// holding the connection and probing broker liveness each heartbeat. A dropped█141|/// connection (broker gone, or a future planned snapshot+self-exit, ADR-0018 Q3)█142|/// returns `Err`, exiting the process so the broker-side supervisor respawns it█...█159|pub fn run_brain(generation: u64, reason: StartReason) -> io::Result<()> {█*160| // Persist this brain generation's stderr to the rotating SPT_HOME/logs sink█161| // (REQ-DAEMON-STDERR-PERSIST) - a detached brain's stdio is /dev/null, so every█162| // diagnostic below would otherwise vanish (the [...37609ch elided...] AIL`), and the█1208|/// body restarts after a capped, doubling backoff - a 5.9-class pump death█1209|/// self-heals visibly instead of silently halving the daemon for 24 h.█...█1389| fn pre_round(&mut self, _ctx: &RoundCtx) {█*1390| self.log.borrow_mut().push(format!(\"pre:{}\", self.tag));█1391| }█1392| fn peer_step(█1393| &mut self,█...█2020| let name = format!(\"spt-pump-pushfeed-{}.sock\", std::process::id());█*2021| let broker = Broker::bind_in_with_net(&name, dir.path().join(\"effects.log\"), Some(host))█2022| .expect(\"bind broker\");█2023| let serve = std::sync::Arc::clone(&broker);█2024| std::thread::spawn(move || {█Showing files 1-20 of 36+. Use skip=20 for the next page, or narrow paths/pattern.\u000f█</out>█# Tool call ¶█//Mapping periodic modules█glob(path=\"crates/spt-daemon/src/{pump,dispatch,registryhost,livehost,projwriter,shellwake}*.rs\", hidden=false, gitignore=true, limit=100)█<out>█\u000e# crates/spt-daemon/src/█livehost.rs█registryhost.rs█dispatch.rs█projwriter.rs█shellwake.rs\u000f█</out>█# Tool call ¶█//Reading dispatcher loop█read(path=\"crates/spt-daemon/src/dispatch.rs\", selector=\"160-360\")█<out>█\u000e#[derive(Debug)]█pub enum DispatchOutcome {█/// The family's serve loop ran to its own outcome (rendered for the log).█Served(String),█/// The first line never arrived / didn't parse - dropped.█Unknown,█/// The worker failed (IO against broker or store).█Failed(String),█}█/// A claimed stream's dispatch lifecycle (ADR-0038 C,█/// REQ-DISPATCH-CLAIM-RETRY). The pre-fix `claimed` was a one-shot `HashSet`█/// insert performed BEFORE worker spawn and never cleared - one transient█/// worker-setup failure ","textTail":"\u000ea0cd-0a4a085881ca\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":22,\"adapter\":\"claude-spt:ccs\"}█*24|{\"ts\":\"2026-07-16T08:22:01Z\",\"session_id\":\"c1427211-6e8d-4571-aeb8-30d36fa816a6\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":23,\"adapter\":\"claude-spt:ccs\"}█*25|{\"ts\":\"2026-07-16T10:27:26Z\",\"session_id\":\"anchor-int-proof\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\omp-spt\",\"ordinal\":24,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting Todlando project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/todlando/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-07T05:11:41Z\",\"session_id\":\"3014282c-3a92-4ee1-a957-3da91c655988\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":0,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-07T05:56:33Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":1,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-07T08:46:36Z\",\"session_id\":\"24991e23-40f2-45a0-8b01-dfb8c95cf193\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":2,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-07T08:46:40Z\",\"session_id\":\"ee9948ab-41dc-4cb3-9c09-29a503c96934\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":3,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-07T08:58:57Z\",\"session_id\":\"34b67d21-7425-4a6c-b18e-9dd297fde48d\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":4,\"adapter\":\"claude-spt:ccs\"}█*6|{\"ts\":\"2026-07-07T11:48:26Z\",\"session_id\":\"08736d23-8a33-4d5f-8f04-a4a8b0d8d3ab\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":5,\"adapter\":\"claude-spt:ccs\"}█*7|{\"ts\":\"2026-07 [...4955ch elided...]█*32|{\"ts\":\"2026-07-17T01:30:24Z\",\"session_id\":\"75f8fe4c-b308-426d-8625-1f1c21e90a16\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":31,\"adapter\":\"claude-spt:ccs\"}█*33|{\"ts\":\"2026-07-17T07:15:50Z\",\"session_id\":\"06a08dcc-5f8a-4ff9-bfd4-a428722081b3\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":32,\"adapter\":\"claude-spt:ccs\"}█*34|{\"ts\":\"2026-07-17T08:41:43Z\",\"session_id\":\"a9315053-ac8e-4ef2-a769-aab81d8e5835\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":33,\"adapter\":\"claude-spt:ccs\"}█*35|{\"ts\":\"2026-07-17T11:39:02Z\",\"session_id\":\"817eb49c-8887-473a-9562-cb47b9c347e9\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":34,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting mobile project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/mobile-gw/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e*1|{\"ts\":\"2026-07-07T02:08:06Z\",\"session_id\":\"spt-mobile-host-335160\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":0,\"adapter\":\"mobile\"}█*2|{\"ts\":\"2026-07-07T06:11:20Z\",\"session_id\":\"spt-mobile-host-197968\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":1,\"adapter\":\"mobile\"}█*3|{\"ts\":\"2026-07-07T08:56:11Z\",\"session_id\":\"spt-mobile-host-297232\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":2,\"adapter\":\"mobile\"}█*4|{\"ts\":\"2026-07-07T09:02:44Z\",\"session_id\":\"spt-mobile-host-398064\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":3,\"adapter\":\"mobile\"}█*5|{\"ts\":\"2026-07-07T09:05:21Z\",\"session_id\":\"spt-mobile-host-222288\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":4,\"adapter\":\"mobile\"}█*6|{\"ts\":\"2026-07-07T09:05:58Z\",\"session_id\":\"spt-mobile-host-381556\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-mobile\",\"ordinal\":5,\"adapter\":\"mobile\"}█*7|{\"ts\":\"2026-07-07T09:07:15Z\",\"session_id\":\"spt-mobile-host-141212\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-m [...6230ch elided...] 4Z\",\"session_id\":\"spt-mobile-host-46564\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":43,\"adapter\":\"mobile\"}█*45|{\"ts\":\"2026-07-17T01:13:12Z\",\"session_id\":\"spt-mobile-host-93200\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":44,\"adapter\":\"mobile\"}█*46|{\"ts\":\"2026-07-17T01:15:58Z\",\"session_id\":\"spt-mobile-host-82128\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":45,\"adapter\":\"mobile\"}█*47|{\"ts\":\"2026-07-17T05:14:03Z\",\"session_id\":\"spt-mobile-host-86180\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":46,\"adapter\":\"mobile\"}█*48|{\"ts\":\"2026-07-17T12:46:55Z\",\"session_id\":\"spt-mobile-host-75468\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":47,\"adapter\":\"mobile\"}\u000f█</out>█# Tool call ¶█//Counting Hertz project rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/hertz/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e 26|{\"ts\":\"2026-07-15T03:20:08Z\",\"session_id\":\"sess-45312-1784085608400930900\",\"trigger\":\"boot\",\"ordinal\":25}█*27|{\"ts\":\"2026-07-16T08:00:33Z\",\"session_id\":\"019f69f1-0d18-7000-9d01-44e3ec52844a\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":26,\"adapter\":\"omp-spt\"}█*28|{\"ts\":\"2026-07-16T08:01:29Z\",\"session_id\":\"019f69f1-ea23-7000-95cb-ee768a4c7126\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":27,\"adapter\":\"omp-spt\"}█29|{\"ts\":\"2026-07-16T08:13:34Z\",\"session_id\":\"sess-34280-1784189614810498300\",\"trigger\":\"boot\",\"ordinal\":28,\"adapter\":\"omp-spt\"}\u000f█</out>█# Assistant ¶█_**Summarizing external match counts**█**Analyzing git process frequency and failure timing**█**Noting pump round scheduling interval**█**Distinguishing failure sources by process timestamps**█**Identifying live pulse discriminator and gating release**_█# Tool call ¶█//Reporting registry CPU root cause█irc(op=\"send\", to=\"Main\", message=\"Highest-confidence residual brain burst source: registry pump's recent-project gossip. Every 30s (`config.rs:39`, live daemon.json=30000), RegistryWorker pre_round calls `advertise_local` (`pump/registry.rs:141-162`). For each of 12 perches, `registryhost.rs:488-1009` reads full bounded sessions.lo [...672ch elided...] a last_active/info writes. Gate: lifecycle poison/thread fix can pass (post-gen1 zero poison/dispatch failure), but CPU-to-noise gate HOLD/FAIL until this is measured/removed; 8.39% mean isn't noise.\", replyTo=null, await=false, from=null, timeoutMs=null, peek=null)█<out>█\u000eDelivered to 1 peer(s):█- Main: injected\u000f█</out>█# Assistant ¶█_**Refining exact count calculations**█**Verifying external line counts per project**_█# Tool call ¶█//Reading self perch enumeration█read(path=\"crates/spt-store/src/perch.rs\", selector=\"410-450\")█<out>█\u000e/// `<perch_path>/info.json` from an already-resolved path.█pub fn info_file_at(perch_path: &Path) -> PathBuf {█perch_path.join(\"info.json\")█}█/// Enumerate the **top-level `Self_` perch ids** in `owlery` - every immediate█/// subdirectory that carries an `info.json` (a bound perch). Pure dir scan,█/// tolerant: a missing/unreadable owlery, or an entry without `info.json`, is█/// silently skipped (never panics, never hard-fails). Nested Psyche/Worker█/// perches live under `<self>/nested/` and are deliberately excluded - the█/// consent-target resolver wants the user's *agent* sessions, not their hosted█/// children. Order is unspecified (the caller ranks by recency).█// [impl->REQ-HAZARD-SINGLE-PATH-SOURCE]█pub fn list_self_perch_ids(owlery: &Path) -> Vec<String> {█let Ok(entries) = std::fs::read_dir(owlery) else {█return Vec::new();█};█let mut ids = Vec::new();█for entry in entries.flatten() {█if !entry.file_type().map(|t| t.is_dir()).unwrap_or(false) {█continue;█}█if !info_file_at(&entry.path()).is_file() {█continue; // a dir without info.json is not a bound perch█}█if let Some(name) = e [...261ch elided...] nt>/nested/<child>/`), any dir that carries an `info.json`.█/// Unlike [`list_self_perch_ids`] (which deliberately excludes children for the█/// consent-target roster), this is the identity-truth enumerator: self-detection█/// by session_id and the cross-perch bind-honesty guard MUST see the nested█/// level, or a psyche-hosted session never resolves to its OWN perch and a█/// foreign perch can be silently rebound to it (F028 C2 contamination,█/// REQ-BIND-HONEST-SELF-STAMP). Pure dir scan, tolerant: a missing/unreadable█/// owlery or nested dir, or a dir without `info.json`, is silently skipped█/// (never panics). Order is unspecified.█// [impl->REQ-BIND-HONEST-SELF-STAMP]█pub fn list_all_perch_dirs(owlery: &Path) -> Vec<PathBuf> {█...█}█[Showing lines 409-453 of 695. Use :454 to continue]\u000f█</out>█# Tool call ¶█//Reading Wakep9 state█read(path=\"C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json\", selector=\"raw\")█<out>█\u000ePath 'C:/Users/decid/AppData/Local/spt-core/owlery/wakep9/info.json' not found\u000f█</out>█# Tool call ¶█//Counting Doyle external rows exactly█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\Documents\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/doyle/sessions.log\", selector=\"1-64\", case=true, gitignore=false, skip=null)█<out>█\u000e 4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}█*5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}█6|{\"ts\":\"2026-07-10T03:17:08Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":301,\"adapter\":\"claude-spt:ccs\"}█7|{\"ts\":\"2026-07-10T03:28:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":302,\"adapter\":\"claude-spt:ccs\"}█8|{\"ts\":\"2026-07-10T03:28:43Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":303,\"adapter\":\"claude-spt:ccs\"}█...█46|{\"ts\":\"2026-07-10T04:55:04Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d [...2962ch elided...] |{\"ts\":\"2026-07-16T10:18:09Z\",\"session_id\":\"4dde7e91-7aad-4d84-a82f-94dc770588b4\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":356,\"adapter\":\"claude-spt:ccs\"}█*62|{\"ts\":\"2026-07-16T12:42:01Z\",\"session_id\":\"a2fdb848-6643-4e10-b221-6baee7e91b7b\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":357,\"adapter\":\"claude-spt:ccs\"}█*63|{\"ts\":\"2026-07-17T00:28:59Z\",\"session_id\":\"9183c374-ac41-4e0a-b478-a8b19f32f855\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":358,\"adapter\":\"claude-spt:ccs\"}█*64|{\"ts\":\"2026-07-17T05:27:57Z\",\"session_id\":\"b155a5e6-a87c-416f-b029-d9cbc4ffd83e\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":359,\"adapter\":\"claude-spt:ccs\"}\u000f█</out>█# Tool call ¶█//Counting nonproject ledger rows█grep(pattern=\"\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Windows|\\\"cwd\\\":\\\"C:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\decid\\\\\\\\\\\\\\\\AppData\", path=\"C:/Users/decid/AppData/Local/spt-core/owlery/*/sessions.log\", selector=null, case=true, gitignore=false, skip=null)█<out>█\u000e# C:/Users/decid/AppData/Local/spt-core/owlery/█## doyle/█### sessions.log█*1|{\"ts\":\"2026-07-10T03:10:19Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":296,\"adapter\":\"claude-spt:ccs\"}█*2|{\"ts\":\"2026-07-10T03:10:35Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":297,\"adapter\":\"claude-spt:ccs\"}█*3|{\"ts\":\"2026-07-10T03:15:30Z\",\"session_id\":\"d42c9d7f-ed19-4667-94c6-29f346e7b357\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\lia\\\\nested\\\\lia-psyche\",\"ordinal\":298,\"adapter\":\"claude-spt:ccs\"}█*4|{\"ts\":\"2026-07-10T03:15:49Z\",\"session_id\":\"a5918ea9-d5bf-4657-a6d3-159f6d6634c4\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\spt-core\\\\owlery\\\\doyle\\\\nested\\\\doyle-psyche\",\"ordinal\":299,\"adapter\":\"claude-spt:ccs\"}█5|{\"ts\":\"2026-07-10T03:17:02Z\",\"session_id\":\"d1a6c133-f9dc-4619-b4e7-1573677ac68f\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\\\\spt-core\",\"ordinal\":300,\"adapter\":\"claude-spt:ccs\"}█*6|{\"ts\": [...5173ch elided...] ojects\",\"ordinal\":36,\"adapter\":\"mobile\"}█38|{\"ts\":\"2026-07-15T03:20:17Z\",\"session_id\":\"spt-mobile-host-42740\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\Documents\\\\projects\",\"ordinal\":37,\"adapter\":\"mobile\"}█## wakep9/█### sessions.log█*1|{\"ts\":\"2026-07-04T05:21:37Z\",\"session_id\":\"5732bc46-a91e-4765-ab85-757840c94e2e\",\"trigger\":\"boot\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":0}█*2|{\"ts\":\"2026-07-04T05:22:04Z\",\"session_id\":\"eba399a4-4fbd-48b1-bfa8-70a43d2dd3e0\",\"trigger\":\"clear\",\"cwd\":\"C:\\\\Users\\\\decid\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\C--Users-decid-Documents-projects-spt-claude-code\\\\fd0a5f34-2e68-404b-b6f6-e440c02f0a22\\\\scratchpad\\\\wakep9-cwd\",\"ordinal\":1}\u000f█</out>"}}}
{"type":"message","id":"0a59d6c1","parentId":"336cf0d4","timestamp":"2026-07-17T13:07:04.399Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Verifying active session counts**\n\n**Analyzing project ledger performance regression**"},{"type":"toolCall","id":"call_KS4prXqgrx3K2oRMvlQEImuG|fc_04b15dc90dfe1c93016a5a28f850dc8195a4775cb114f1546f","name":"read","arguments":{"i":"Reading release history context","path":"CHANGELOG.md","selector":"530-625"}},{"type":"toolCall","id":"call_i4fdKVRpSme9cQKMJObCgm77|fc_04b15dc90dfe1c93016a5a28f851488195810cf19b02a7523b","name":"grep","arguments":{"i":"Locating release headings","pattern":"^## \\[?0\\.3[567]\\.0|^## 0\\.3[567]\\.0","path":"CHANGELOG.md","selector":null,"case":true,"gitignore":true,"skip":null}},{"type":"toolCall","id":"call_qRxp5UTFBRkCv076AMmdJFaA|fc_04b15dc90dfe1c93016a5a28f851a881958d703ac8261da6a9","name":"grep","arguments":{"i":"Locating recent projects requirement","pattern":"REQ-GOSSIP-ADAPTER-PROJECTS|recent_projects","path":"docs;crates","selector":null,"case":true,"gitignore":true,"skip":null}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":64946,"output":630,"cacheRead":12800,"cacheWrite":0,"totalTokens":78376,"reasoningTokens":453,"cost":{"input":0.32473,"output":0.0189,"cacheRead":0.0063999999999999994,"cacheWrite":0,"total":0.35003}},"stopReason":"toolUse","timestamp":1784293603907,"responseId":"resp_04b15dc90dfe1c93016a5a28e4c4c0819587b992df462a43a8","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_04b15dc90dfe1c93016a5a28e71eb88195b5b156f65de99ac0","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWij4H_QUoinfPW10dLgOpj3KE4UZWtpHdLc8AN223iU2962ZWuQSYC503DwsIskrsuFKgfp7gTNvvyd_txux6BApXP9NcQGv5PB4h1ACMdJoPbBgekMmDy_HXinsiyQrWop0Erv_MmHspKqr3apSeWue-XOxQot2gVlzD8xErMdCIv54f5RrKJZGUTcdIThY6WzfC9dsG2X4C3IK_7dtGlWswmS_v5XwitTiifJbO5G1gB3Cc23Loiz7xzWYY5-hJfZDjZLmhG7UUJsiOMIK_bYsESmm8jtxVsVssh22yFm8PjEwe47Pqywe6cjaYuF_D3YxNgdMzkHgK8CzOfUfWD6S_m5U18sHZn10vDrDkNp8WvgQff7zpgRoho-GsgiZMfLx_wMzg_EyQjuHBkNIH0at83poRghWf_nAzPjGMIY1PecsS5QWSC94PQgpRhvFm0gAo70NF1a-7AUNUgh6fucdHU2pkaKMGBqcCo7NUgqP25_2maHe9ojYpG50CZx4ghr2RAdhwci74NSA8__cw9WIm3sgSgsxwGuj8le2q9f9R9lbSN59VVC2YUh0LeSOwXLO6wn9NBVkblvYxRUE_k0eXY2mDSa2FxSqDOu8ccdXxTaKzVUVj4oWlFD7X3lbW4wmdmZa4r4n2f-DZ0GglLOPW2OytOIGQp50lYd2CXXyr5fDBruAdUnBVM8N1FjWWkpYOOKYWl5cYeqdxpQp6VDQVCeL1uXWK5bkQWJSkicY-zSsw8Uiq5Adj333dVePCwbsTbRjO0ZVxSD7WbeXlz3RVNmwNLObU7FlI-tVw9w3DEEaGCxgtwcDGNxuAhzdfUtp6f9LTHfFgfF2AwRrVJm1JisLM5ashDHQoWnybW82xMzM_ClYdVfQEWtZ75N5DPQxMJXyZ-6xurQb5u15Yq6flJOdpoDNzKjbifwTzmYxpUtw0BzQ0q-7awJm1ncN9kmaFTSt_ZtqzD-HEgDyofCmbZ7ZuGSlrb3eT4VaBtiLint2h9nq9RUAPIj7uvraNZCHNDitDwdQx-Ra8igJdkyCSbExPwU1ap43djRJQgdiXXtKqKztetbBlnp_NlxrFxTnekcyhjvlcLPB2OJxke7gZzd_MyhsYe7uyO8KrynKaGycxbQ2n7Zj0hr8qJ5mtVESzS1kVmZuN9fI02T_A37cgAVb0wK2diHP76-FUHhAPznFgXiiUzavtjIYJ1uAJPfLCb7Cs4ijVmpEbjluYwl93NRVO-DT0WXd3s_Gd__CDhLS4-LBgsnfV4Q1wwRb9uMEL-q_C_w6zIUUsg0vCIZtQp7DF2NxvIQ4vAY07qiv_zjtT-bJawDPV4Ru_L3E3xsDGHusnSvj3ALQoLprKfEMYrJmQRjY9VAzREX9KhGonJdkHYDCxK-MVSSHhPMk8r16DuQKkm6e3YuYv6JufZx1X1u4kCwf8T6ZIMqhZOIC1Li0j-tP-G9K9L1f9f7O4umOSU2r3fRnAosXarsVSdcNllACfNne3VPd42nkeFYknL5CXE8KmnvbjBXCNuADONfn3H7Y2ozcPEmxzyMrxHplKSJuma79SQ0Rt3FNGlEieWnvsuT8QLy-8t69xk6koxWqp5O0qkRfvWyLNJY_rd7seAfy199JpBgmFfIqOqTKaAaOs2DwWeVz8l_q4Ud7Nb_uBCHK_pl5fvx7xO9Wbl5P4-fJ154WEd_w2zk4-wFJRQsW9hnhri579CgKFFv0YyBuPgbOzOtH6M7HEKN6_6JtcL-kiiuWqEfUUg8VctO6y-lXKA_tQGVbb41ImFAYXb2Lu1ZIH8wKWsOF5HqQXu1KZFOyZmfeiVXYq_lVXEvHRtT2Fj7gW51qxZB_XcQKWrm09soq1uxNFVyO81ciAoDz7xy2olhDC5agy12Z8zVBA3Y995OXM2XhqpSFpc00i1Qa9S7V0yY6lChA-OpWlAxJzRiK__bq8uAr3HwJEfLqY8F6qIbvSgzqJ1FNSy15oYhPZzQN_s5y80dHj8ZFkabG0MzIv8EboiVV1lsnuVBxaafNmi62gpDGaBEQ0Uo3N9DElNEZ8swtewf5FbSXHLYAMd9flLfNYYb0UAJyOjeiGDRKuz55ssIoA4AM2pvDH0niD7FSt_vneO_Zaq0qcQIvAk8P7atoHPMm1aDYs4Nzd2k_LMiZcprC6lVu1NweWFHhm4gQy6X7fO4YOXYX8desLw1yKZgUzYRIMLvTDf3H-KguIRRiqpNZppvfp_eBiFJVJW3VTrLien7HhZDIOdnICCWr0mp1q5wDrigSbP9vYxxY9Nt-mbjAIa3JUGxwxhAbMU0g-HKaSFkOAGZuGCCmG0IrB5bnqpHv3FFDraPBCBiqij0q-YQlYM9-tgp5rayZ3knjvdBoFL4WpJdyGdJPLpUIjWsyDoEiZQxg34TJlmp19qw2ubmVfwAtfLCauhUmrVf9p1-WHQVfInO2QGOtL058aGj7LXHVKirEJBjCqB-OX9LPqJbnYdx41deWQWyys8MS_oU4F_ySz-DkNCGJs6gP41x2IpB13z6xV75vw-t129SHCDDsgqPe4Z_vXstn-iip7Gab90yn3ahOfm0OFUgYAxZglPVCS8koplv4xX9TC_Jx0a2jaK22zh8b72OiL8wkuITC8lpRWM1VpFt4B3UnUV8gYqHe387mQvw3M2qLhAAKgRtO_ovQsnjZdYPnqmpoMTSb9-sJrM4POUQwK7H32QqUSgjkL6BYU070PzcCN7ebc8u_iOjpfxUsAT2PIqBe9ja8x7qvsyxIXonqZIFs4EqYtxsXUnHtwymV3lekJyw8rOVwPTojSbVi442FvQIyx6VT-ogk9hPW5m3QqkJ1Du82y3Gy7hNgnvKwEM46Ai4RnUvwURpXhdXsbV7bL6I7-fFW8GBp7SElFg7F-lyLAwRoHntxWrOsfo4QkNc0pFIwvBR2NAAesLBWWlYyFIH0GoF0nw295_Nj4y0-l7iC-MqU4PAHNRZhI8XaKHoYRWmebiooW-P6a-tQxR5hWo__5a1PB2PRqtFvYY0Zhq2Vsq33MlJtkUXouzS0FdpXkZ4kHITerQCXauL6pONv3PqFLe4lOan9m3E9MEuO--eYQow7q2PQpl-GrxZs7GzwlTB-ftUV6XuPRsIMhs8XNdtShdq1r1589EVJRUZgPFCczvjKOm3HTUN5rkuxZ5tri66Yt0PnCXv-CvKJJMr73clpBG0Od6t47pqUby8NUnI71vC5aZ8j7tPojJuYGl8tzsBmoDMq9z7paHtKwGDtkdoEr0uYD4HiJgZ4WxI52jl910k5svR-roxHiBSLuGxkF2mlP16-7MtVNBeVsVXMwreNHBhaWCfXk2d6Sdz0fCTkG23bDlHuf3cCOXUrR_wVoUoqHKfrWVyeqIWgvgVJWkmFOVjdg-3cqMCdFrQwIJU_8KMBgqLkTT7soB2GTbhZE9yuQ9c1WAV-_zdyOy1F","summary":[{"type":"summary_text","text":"**Verifying active session counts**"},{"type":"summary_text","text":"**Analyzing project ledger performance regression**"}]},{"id":"fc_04b15dc90dfe1c93016a5a28f850dc8195a4775cb114f1546f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading release history context\",\"path\":\"CHANGELOG.md\",\"selector\":\"530-625\"}","call_id":"call_KS4prXqgrx3K2oRMvlQEImuG","name":"read"},{"id":"fc_04b15dc90dfe1c93016a5a28f851488195810cf19b02a7523b","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating release headings\",\"pattern\":\"^## \\\\[?0\\\\.3[567]\\\\.0|^## 0\\\\.3[567]\\\\.0\",\"path\":\"CHANGELOG.md\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_i4fdKVRpSme9cQKMJObCgm77","name":"grep"},{"id":"fc_04b15dc90dfe1c93016a5a28f851a881958d703ac8261da6a9","type":"function_call","status":"completed","arguments":"{\"i\":\"Locating recent projects requirement\",\"pattern\":\"REQ-GOSSIP-ADAPTER-PROJECTS|recent_projects\",\"path\":\"docs;crates\",\"selector\":null,\"case\":true,\"gitignore\":true,\"skip\":null}","call_id":"call_qRxp5UTFBRkCv076AMmdJFaA","name":"grep"}]},"duration":20490.873999997973,"ttft":3246.0699999928474,"contextSnapshot":{"promptTokens":77746,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_KS4prXqgrx3K2oRMvlQEImuG|fc_04b15dc90dfe1c93016a5a28f850dc8195a4775cb114f1546f","toolName":"read","startedAt":"2026-07-17T13:07:04.399Z","args":{"path":"CHANGELOG.md"},"intent":"Reading release history context"},"id":"7c9dbf9c","parentId":"0a59d6c1","timestamp":"2026-07-17T13:07:04.399Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_i4fdKVRpSme9cQKMJObCgm77|fc_04b15dc90dfe1c93016a5a28f851488195810cf19b02a7523b","toolName":"grep","startedAt":"2026-07-17T13:07:04.399Z","args":{"path":"CHANGELOG.md"},"intent":"Locating release headings"},"id":"d8b75e83","parentId":"7c9dbf9c","timestamp":"2026-07-17T13:07:04.399Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_qRxp5UTFBRkCv076AMmdJFaA|fc_04b15dc90dfe1c93016a5a28f851a881958d703ac8261da6a9","toolName":"grep","startedAt":"2026-07-17T13:07:04.399Z","args":{"path":"docs;crates"},"intent":"Locating recent projects requirement"},"id":"0f688e74","parentId":"d8b75e83","timestamp":"2026-07-17T13:07:04.399Z"}
{"type":"message","id":"2a39df8b","parentId":"0f688e74","timestamp":"2026-07-17T13:07:04.401Z","message":{"role":"toolResult","toolCallId":"call_i4fdKVRpSme9cQKMJObCgm77|fc_04b15dc90dfe1c93016a5a28f851488195810cf19b02a7523b","toolName":"grep","content":[{"type":"text","text":" 11|\n*12|## [0.37.0] - 2026-07-17\n 13|\n 14|A stability and lifecycle release. It ends the steady background CPU use on every\n 15|node, stops attached endpoints from stalling, and makes stopping, starting, and\n...\n 50|\n*51|## [0.36.0] - 2026-07-16\n 52|\n 53|A stability release for attached sessions. A daemon update no longer disrupts\n 54|active sessions, and a session stuck by a bad connection now recovers on its own.\n...\n 71|\n*72|## [0.35.0] - 2026-07-16\n 73|\n 74|A subnet resilience and visibility release. A node that briefly cannot reach a\n 75|peer no longer isolates itself, and node status now shows whether your peers are"}],"details":{"scopePath":"CHANGELOG.md","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core\\CHANGELOG.md","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":3,"fileCount":1,"files":["CHANGELOG.md"],"fileMatches":[{"path":"CHANGELOG.md","count":3}],"truncated":false,"displayContent":" 11│\n*12│## [0.37.0] - 2026-07-17\n 13│\n 14│A stability and lifecycle release. It ends the steady background CPU use on every\n 15│node, stops attached endpoints from stalling, and makes stopping, starting, and\n   │...\n 50│\n*51│## [0.36.0] - 2026-07-16\n 52│\n 53│A stability release for attached sessions. A daemon update no longer disrupts\n 54│active sessions, and a session stuck by a bad connection now recovers on its own.\n   │...\n 71│\n*72│## [0.35.0] - 2026-07-16\n 73│\n 74│A subnet resilience and visibility release. A node that briefly cannot reach a\n 75│peer no longer isolates itself, and node status now shows whether your peers are"},"isError":false,"timestamp":1784293624401}}
{"type":"message","id":"3f9c8625","parentId":"2a39df8b","timestamp":"2026-07-17T13:07:04.425Z","message":{"role":"toolResult","toolCallId":"call_KS4prXqgrx3K2oRMvlQEImuG|fc_04b15dc90dfe1c93016a5a28f850dc8195a4775cb114f1546f","toolName":"read","content":[{"type":"text","text":"## [0.25.0] - 2026-07-04\n…\n### Changed\n…\n- **A live agent's Psyche no longer runs as a resident background process.** Instead of one long-lived Psyche process per live agent, each pulse or event now runs a single bounded Psyche turn. Liveness is measured by turns succeeding, not by a process staying resident — nothing lingers between events.\n…\n- **Nested agent ids resolve without `--subnet` on multi-subnet nodes.** Referring to a `parent/nested` agent on a node that belongs to more than one subnet no longer requires an explicit `--subnet`; resolution finds the agent locally. This also clears the Psyche-poll refusal that a prior version surfaced loudly.\n- **Harness-contract manifest keys added.** Adapter manifests can now use `{parent_session_id}` (the hosting agent's session), `{subnet}`, and `{psyche_context_file}` — the last replaces the inline `{psyche_context}` key, passing the Psyche's mind as a file path rather than inline on the command line, so large contexts no longer risk overrunning the operating system's argument-length limit.\n\n### Fixed\n\n- **A failing Psyche no longer takes your endpoint offline.** When a Psyche turn fails, the live endpoint stays ready and keeps delivering messages. A gone-session condition triggers a loud reseed with a fresh start; any other failure counts against a small strike budget and is recorded as an endpoint error status — the parent agent is never taken offline, and the older machinery that could disrupt delivery is gone.\n- **Upgrading now cleans up stranded Psyche processes and leftover binary copies automatically.** Upgrading from an older version sweeps away a Psyche process left resident by the previous daemon and removes leftover own-copy binary files at daemon start, instead of leaving them for manual cleanup.\n\n## [0.24.0] - 2026-07-03\n\nA picker-polish release: the endpoint picker's labels, keys, and flows now tell the truth about what each action does and where it acts — and message delivery no longer breaks after a context reset, with a dropped adapter profile fixed along the way.\n\n### Added\n\n- **The choose-project panel now marks your current directory.** A history entry whose folder is your current working directory is tagged `(CURRENT DIR)`; if your current directory isn't already in the history, a `CURRENT DIR --> <folder>` row is offered so you can start there directly.\n- **The interactive endpoint picker now titles its terminal window.** The window or tab is set to `SPT Endpoint Picker` when the picker opens interactively.\n\n### Changed\n\n- **Two picker action labels now name their target.** \"Fork endpoint here --> <current dir>\" states the directory the fork will run in, and \"Set shortcut here --> <current dir>/<file>\" names the exact shortcut file that will be written, so the label cannot drift from what actually happens.\n- **The translation-binary protocol now requires an explicit commit terminator.** Every `{\"type\":\"event\"}` a translation binary receives must be answered with a trailing `{\"commit\":true}` — including an event with nothing to inject, which must still answer with a bare commit. The harness-contract docs also correct the missed-commit consequence: a missed commit no longer permanently kills the binary — it is tolerated and the envelope is re-spooled once.\n\n### Fixed\n\n- **The picker's confirm panel now shows the readable project name.** The one remaining place that still displayed a raw project slug now shows the friendly name, matching the rest of the picker and `spt endpoint list`.\n- **The picker's `h` and `s` keys now work only where they can launch, and the footer only hints them there.** Headless-start (`h`) and shortcut (`s`) previously fired from rows that could not launch anything, and the footer advertised them where they were dead; both are now live only on a highlighted row that can actually start the endpoint, and the footer hint matches.\n- **\"Change harness adapter\" now only changes the adapter.** Choosing it no longer re-prompts for an id and home directory and then starts a session — it picks a new adapter, applies it to the endpoint, and returns to the confirm panel.\n- **An endpoint's adapter profile is no longer dropped on reconnect.** An endpoint created with an adapter profile (e.g. `claude-spt:ccs`) keeps that profile; re-binding no longer strips it back to the bare adapter.\n- **A missed commit no longer stops idle message delivery.** Previously an event that armed nothing (such as a context reset) could make the translation binary miss its commit and permanently stop delivering that session's idle messages until it was restarted. A single miss is now tolerated — the healthy binary is kept and the next message delivers through it; only repeated misses or a genuine crash fault it, triggering a bounded automatic respawn and recording a fault status on the endpoint instead of failing silently.\n- **Message delivery and scheduled wake-ups now survive a context reset.** After a context reset, an idle agent could stop receiving messages and scheduled wake-ups until its session was restarted; the session boundary now re-stamps its readiness in the correct order across the reset, so messages and wakes right after a reset are delivered instead of dropped.\n- **A `--force-native` send that cannot be delivered now says why.** The failure message distinguishes its cause — empty message, no daemon running, endpoint active mid-turn, no working translation binary, or not a controllable endpoint — instead of a single identical message for every case.\n\n## [0.23.0] - 2026-07-03\n\nA run-truth release: starting, resuming, and shutting down agent sessions now behave honestly — no duplicate sessions, no stale \"controlled\" markers, no orphaned processes — alongside picker and listing display polish and a fix for adapter updates that could get permanently stuck on a machine running an agent.\n\n### Changed\n\n- **Projects now display a recognizable name.** Across the agent picker (history, the choose-project panel, resume titles) and the `spt endpoint list` project column, a project shows a readable name (e.g. `spt-core`) instead of a raw slug; two projects with the same name are told apart by their folder.\n- **`spt endpoint list` output refreshed.** The shared-subnet and total lines are dimmed, the status glyph now sits beside the endpoint name, and the status word is colored.\n- **The agent picker no longer offers \"View\" for an offline endpoint.** An offline endpoint has no live session to view, so only Start is offered.\n- **`spt daemon status` now warns about a stale at-logon task registration.** If the auto-start task was registered by an older installer in an unsafe form, `spt daemon status` flags it with guidance to re-register via the current installer; the daemon self-protects either way.\n- **Piping `spt daemon run` to another command now discards its output by design.** A piped launch is treated as a detached one and its console output is dropped; to capture the daemon's output, redirect it to a file (e.g. `spt daemon run 2>daemon.log`) instead.\n\n### Fixed\n\n- **Colored CLI output on Windows consoles no longer garbles.** On a raw Windows console, `spt endpoint list` and `--help` no longer print raw escape sequences; when the console cannot render color, the output is cleanly stripped instead.\n- **Resume-from-history now labels each session with its own project.** Past sessions no longer all read as the newest project, and internal or host sessions no longer appear as unresumable rows.\n- **The Start-now project chooser no longer lists the same project twice.**\n- **A dead or offline endpoint no longer reads as \"controlled.\"** The controlled/viewer marking is cleared once the session is gone — including across a daemon restart — instead of lingering.\n- **`spt endpoint run` over an already-live endpoint no longer duplicates the session.** It attaches to the running session (or, when headless, reports that the endpoint is already live) instead of silently starting a second session with a crossed view.\n- **Resuming a session no longer hangs at \"No sessions match.\"** Resume — including after a daemon restart — now restores the real recorded session, or starts fresh with a clear notice when there is nothing to resume.\n- **`spt endpoint shutdown` now fully tears down a wedged or crash-looping Psyche.** Its child processes are killed too, instead of being left orphaned for a manual cleanup.\n- **A crash-looping Psyche is now detected and stopped.** Instead of silently respawning several times a second, the loop is halted, backed off, and surfaced as an error.\n- **Adapter updates no longer get permanently stuck on a machine running an agent.** Leftover files from a prior update no longer make every later `spt adapter update` fail and roll back; update errors now name the file and operation involved.\n- **One agent can no longer corrupt another agent's session identity.** An agent's endpoint identity and presence are no longer overwritten by another agent's Psyche, and a dead endpoint can no longer be silently re-bound to a different agent's session.\n\n## [0.22.0] - 2026-07-03\n\nA picker-and-presence truth release: the endpoint picker and listing show real project, type, and control state — including for endpoints on other machines — and a few rough edges around piping and cross-node display are fixed.\n\n### Added\n\n- **`spt api endpoint-info`.** A new command that emits, as JSON, which node an endpoint is attached to — for harnesses that need to resolve the node from which a controller is attached.\n\n### Changed\n\n- **`spt endpoint list` now shows a project column.** Each row reads id / project / type / status, so you can see at a glance which project an endpoint belongs to.\n- **The endpoint picker got two UX fixes.** Starting an endpoint now opens a choose-project panel, and the resume view keeps the top endpoint details panel visible.\n\n### Fixed\n\n- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.\n- **A controlled endpoint now reads as CONTROLLED accurately — and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.\n- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.\n- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.\n\n## [0.21.0] - 2026-07-02\n\nA visibility + update-honesty release: the endpoint list is reorganized around machines, and `spt update apply` / `spt daemon status` are clearer about which version is actually running.\n\n### Added\n\n- **`spt endpoint list --show-all`.** Suspended (resting) endpoints are now hidden by default to cut clutter; `--show-all` reveals them. Each machine's total discloses how many were hidden (nothing silently vanishes), and a corrupt record always shows regardless.\n- **`spt daemon status` now reports the running daemon's version.** It shows the version the running daemon was built from beside the installed version and flags a mismatch — so you can tell when an update is on disk but the daemon still needs a restart to fully load it. The `--json` output gains matching `broker_image` / `broker_stale` fields.\n\n### Changed\n\n- **`spt endpoint list` (and `spt whoami`) is now grouped by machine, not by subnet.** Your own node comes first, then each remote machine alphabetically — every endpoint appears once per machine (no more duplicate rows for a machine reachable through several subnets), with a per-machine total and the subnets it shares with you. The old `ENDPOINTS:` summary line (which counted a machine once per subnet) is removed.\n- **`spt update apply` now tells you when a daemon restart is needed.** On a successful update it notes that daemon-coordinated features keep running the previous version until you restart the daemon, and points you at `spt daemon status` to confirm which version is live.\n- **`spt endpoint list --json` gains a per-endpoint `endpoint_type` field.** Additive — the existing JSON shape is otherwise unchanged.\n\n### Fixed\n\n- **`spt update apply` when already up to date no longer errors.** Re-running apply on a version that is already installed used to fail with an \"access denied\" error; it now recognizes the up-to-date state and exits cleanly with a clear message.\n- **Concurrent first-time store initialization no longer fails.** Two spt processes initializing the same fresh data store at once (for example the daemon and a command racing on first use) could fail with a \"could not lock config file\" error; initialization is now race-tolerant.\n\n## [0.20.0] - 2026-07-02\n\nA cross-node delivery release: messages to a remote, idle spt-hosted endpoint now arrive immediately, alongside adapter-update, sender-labeling, and auth-recovery fixes.\n…\n\n\n[Showing lines 529-628 of 1186. Use :629 to continue]"}],"details":{"truncation":{"content":"- **Nested agent ids resolve without `--subnet` on multi-subnet nodes.** Referring to a `parent/nested` agent on a node that belongs to more than one subnet no longer requires an explicit `--subnet`; resolution finds the agent locally. This also clears the Psyche-poll refusal that a prior version surfaced loudly.\r\n- **Harness-contract manifest keys added.** Adapter manifests can now use `{parent_session_id}` (the hosting agent's session), `{subnet}`, and `{psyche_context_file}` — the last replaces the inline `{psyche_context}` key, passing the Psyche's mind as a file path rather than inline on the command line, so large contexts no longer risk overrunning the operating system's argument-length limit.\r\n\r\n### Fixed\r\n\r\n- **A failing Psyche no longer takes your endpoint offline.** When a Psyche turn fails, the live endpoint stays ready and keeps delivering messages. A gone-session condition triggers a loud reseed with a fresh start; any other failure counts against a small strike budget and is recorded as an endpoint error status — the parent agent is never taken offline, and the older machinery that could disrupt delivery is gone.\r\n- **Upgrading now cleans up stranded Psyche processes and leftover binary copies automatically.** Upgrading from an older version sweeps away a Psyche process left resident by the previous daemon and removes leftover own-copy binary files at daemon start, instead of leaving them for manual cleanup.\r\n\r\n## [0.24.0] - 2026-07-03\r\n\r\nA picker-polish release: the endpoint picker's labels, keys, and flows now tell the truth about what each action does and where it acts — and message delivery no longer breaks after a context reset, with a dropped adapter profile fixed along the way.\r\n\r\n### Added\r\n\r\n- **The choose-project panel now marks your current directory.** A history entry whose folder is your current working directory is tagged `(CURRENT DIR)`; if your current directory isn't already in the history, a `CURRENT DIR --> <folder>` row is offered so you can start there directly.\r\n- **The interactive endpoint picker now titles its terminal window.** The window or tab is set to `SPT Endpoint Picker` when the picker opens interactively.\r\n\r\n### Changed\r\n\r\n- **Two picker action labels now name their target.** \"Fork endpoint here --> <current dir>\" states the directory the fork will run in, and \"Set shortcut here --> <current dir>/<file>\" names the exact shortcut file that will be written, so the label cannot drift from what actually happens.\r\n- **The translation-binary protocol now requires an explicit commit terminator.** Every `{\"type\":\"event\"}` a translation binary receives must be answered with a trailing `{\"commit\":true}` — including an event with nothing to inject, which must still answer with a bare commit. The harness-contract docs also correct the missed-commit consequence: a missed commit no longer permanently kills the binary — it is tolerated and the envelope is re-spooled once.\r\n\r\n### Fixed\r\n\r\n- **The picker's confirm panel now shows the readable project name.** The one remaining place that still displayed a raw project slug now shows the friendly name, matching the rest of the picker and `spt endpoint list`.\r\n- **The picker's `h` and `s` keys now work only where they can launch, and the footer only hints them there.** Headless-start (`h`) and shortcut (`s`) previously fired from rows that could not launch anything, and the footer advertised them where they were dead; both are now live only on a highlighted row that can actually start the endpoint, and the footer hint matches.\r\n- **\"Change harness adapter\" now only changes the adapter.** Choosing it no longer re-prompts for an id and home directory and then starts a session — it picks a new adapter, applies it to the endpoint, and returns to the confirm panel.\r\n- **An endpoint's adapter profile is no longer dropped on reconnect.** An endpoint created with an adapter profile (e.g. `claude-spt:ccs`) keeps that profile; re-binding no longer strips it back to the bare adapter.\r\n- **A missed commit no longer stops idle message delivery.** Previously an event that armed nothing (such as a context reset) could make the translation binary miss its commit and permanently stop delivering that session's idle messages until it was restarted. A single miss is now tolerated — the healthy binary is kept and the next message delivers through it; only repeated misses or a genuine crash fault it, triggering a bounded automatic respawn and recording a fault status on the endpoint instead of failing silently.\r\n- **Message delivery and scheduled wake-ups now survive a context reset.** After a context reset, an idle agent could stop receiving messages and scheduled wake-ups until its session was restarted; the session boundary now re-stamps its readiness in the correct order across the reset, so messages and wakes right after a reset are delivered instead of dropped.\r\n- **A `--force-native` send that cannot be delivered now says why.** The failure message distinguishes its cause — empty message, no daemon running, endpoint active mid-turn, no working translation binary, or not a controllable endpoint — instead of a single identical message for every case.\r\n\r\n## [0.23.0] - 2026-07-03\r\n\r\nA run-truth release: starting, resuming, and shutting down agent sessions now behave honestly — no duplicate sessions, no stale \"controlled\" markers, no orphaned processes — alongside picker and listing display polish and a fix for adapter updates that could get permanently stuck on a machine running an agent.\r\n\r\n### Changed\r\n\r\n- **Projects now display a recognizable name.** Across the agent picker (history, the choose-project panel, resume titles) and the `spt endpoint list` project column, a project shows a readable name (e.g. `spt-core`) instead of a raw slug; two projects with the same name are told apart by their folder.\r\n- **`spt endpoint list` output refreshed.** The shared-subnet and total lines are dimmed, the status glyph now sits beside the endpoint name, and the status word is colored.\r\n- **The agent picker no longer offers \"View\" for an offline endpoint.** An offline endpoint has no live session to view, so only Start is offered.\r\n- **`spt daemon status` now warns about a stale at-logon task registration.** If the auto-start task was registered by an older installer in an unsafe form, `spt daemon status` flags it with guidance to re-register via the current installer; the daemon self-protects either way.\r\n- **Piping `spt daemon run` to another command now discards its output by design.** A piped launch is treated as a detached one and its console output is dropped; to capture the daemon's output, redirect it to a file (e.g. `spt daemon run 2>daemon.log`) instead.\r\n\r\n### Fixed\r\n\r\n- **Colored CLI output on Windows consoles no longer garbles.** On a raw Windows console, `spt endpoint list` and `--help` no longer print raw escape sequences; when the console cannot render color, the output is cleanly stripped instead.\r\n- **Resume-from-history now labels each session with its own project.** Past sessions no longer all read as the newest project, and internal or host sessions no longer appear as unresumable rows.\r\n- **The Start-now project chooser no longer lists the same project twice.**\r\n- **A dead or offline endpoint no longer reads as \"controlled.\"** The controlled/viewer marking is cleared once the session is gone — including across a daemon restart — instead of lingering.\r\n- **`spt endpoint run` over an already-live endpoint no longer duplicates the session.** It attaches to the running session (or, when headless, reports that the endpoint is already live) instead of silently starting a second session with a crossed view.\r\n- **Resuming a session no longer hangs at \"No sessions match.\"** Resume — including after a daemon restart — now restores the real recorded session, or starts fresh with a clear notice when there is nothing to resume.\r\n- **`spt endpoint shutdown` now fully tears down a wedged or crash-looping Psyche.** Its child processes are killed too, instead of being left orphaned for a manual cleanup.\r\n- **A crash-looping Psyche is now detected and stopped.** Instead of silently respawning several times a second, the loop is halted, backed off, and surfaced as an error.\r\n- **Adapter updates no longer get permanently stuck on a machine running an agent.** Leftover files from a prior update no longer make every later `spt adapter update` fail and roll back; update errors now name the file and operation involved.\r\n- **One agent can no longer corrupt another agent's session identity.** An agent's endpoint identity and presence are no longer overwritten by another agent's Psyche, and a dead endpoint can no longer be silently re-bound to a different agent's session.\r\n\r\n## [0.22.0] - 2026-07-03\r\n\r\nA picker-and-presence truth release: the endpoint picker and listing show real project, type, and control state — including for endpoints on other machines — and a few rough edges around piping and cross-node display are fixed.\r\n\r\n### Added\r\n\r\n- **`spt api endpoint-info`.** A new command that emits, as JSON, which node an endpoint is attached to — for harnesses that need to resolve the node from which a controller is attached.\r\n\r\n### Changed\r\n\r\n- **`spt endpoint list` now shows a project column.** Each row reads id / project / type / status, so you can see at a glance which project an endpoint belongs to.\r\n- **The endpoint picker got two UX fixes.** Starting an endpoint now opens a choose-project panel, and the resume view keeps the top endpoint details panel visible.\r\n\r\n### Fixed\r\n\r\n- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.\r\n- **A controlled endpoint now reads as CONTROLLED accurately — and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.\r\n- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.\r\n- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.\r\n\r\n## [0.21.0] - 2026-07-02\r\n\r\nA visibility + update-honesty release: the endpoint list is reorganized around machines, and `spt update apply` / `spt daemon status` are clearer about which version is actually running.\r\n\r\n### Added\r\n\r\n- **`spt endpoint list --show-all`.** Suspended (resting) endpoints are now hidden by default to cut clutter; `--show-all` reveals them. Each machine's total discloses how many were hidden (nothing silently vanishes), and a corrupt record always shows regardless.\r\n- **`spt daemon status` now reports the running daemon's version.** It shows the version the running daemon was built from beside the installed version and flags a mismatch — so you can tell when an update is on disk but the daemon still needs a restart to fully load it. The `--json` output gains matching `broker_image` / `broker_stale` fields.\r\n\r\n### Changed\r\n\r\n- **`spt endpoint list` (and `spt whoami`) is now grouped by machine, not by subnet.** Your own node comes first, then each remote machine alphabetically — every endpoint appears once per machine (no more duplicate rows for a machine reachable through several subnets), with a per-machine total and the subnets it shares with you. The old `ENDPOINTS:` summary line (which counted a machine once per subnet) is removed.\r\n- **`spt update apply` now tells you when a daemon restart is needed.** On a successful update it notes that daemon-coordinated features keep running the previous version until you restart the daemon, and points you at `spt daemon status` to confirm which version is live.\r\n- **`spt endpoint list --json` gains a per-endpoint `endpoint_type` field.** Additive — the existing JSON shape is otherwise unchanged.\r\n\r\n### Fixed\r\n\r\n- **`spt update apply` when already up to date no longer errors.** Re-running apply on a version that is already installed used to fail with an \"access denied\" error; it now recognizes the up-to-date state and exits cleanly with a clear message.\r\n- **Concurrent first-time store initialization no longer fails.** Two spt processes initializing the same fresh data store at once (for example the daemon and a command racing on first use) could fail with a \"could not lock config file\" error; initialization is now race-tolerant.\r\n\r\n## [0.20.0] - 2026-07-02\r\n\r\nA cross-node delivery release: messages to a remote, idle spt-hosted endpoint now arrive immediately, alongside adapter-update, sender-labeling, and auth-recovery fixes.\r","truncated":true,"truncatedBy":"lines","totalLines":658,"totalBytes":13153,"outputLines":100,"outputBytes":13153,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"## [0.25.0] - 2026-07-04\n…\n### Changed\n…\n- **A live agent's Psyche no longer runs as a resident background process.** Instead of one long-lived Psyche process per live agent, each pulse or event now runs a single bounded Psyche turn. Liveness is measured by turns succeeding, not by a process staying resident — nothing lingers between events.\n…\n- **Nested agent ids resolve without `--subnet` on multi-subnet nodes.** Referring to a `parent/nested` agent on a node that belongs to more than one subnet no longer requires an explicit `--subnet`; resolution finds the agent locally. This also clears the Psyche-poll refusal that a prior version surfaced loudly.\r\n- **Harness-contract manifest keys added.** Adapter manifests can now use `{parent_session_id}` (the hosting agent's session), `{subnet}`, and `{psyche_context_file}` — the last replaces the inline `{psyche_context}` key, passing the Psyche's mind as a file path rather than inline on the command line, so large contexts no longer risk overrunning the operating system's argument-length limit.\r\n\r\n### Fixed\r\n\r\n- **A failing Psyche no longer takes your endpoint offline.** When a Psyche turn fails, the live endpoint stays ready and keeps delivering messages. A gone-session condition triggers a loud reseed with a fresh start; any other failure counts against a small strike budget and is recorded as an endpoint error status — the parent agent is never taken offline, and the older machinery that could disrupt delivery is gone.\r\n- **Upgrading now cleans up stranded Psyche processes and leftover binary copies automatically.** Upgrading from an older version sweeps away a Psyche process left resident by the previous daemon and removes leftover own-copy binary files at daemon start, instead of leaving them for manual cleanup.\r\n\r\n## [0.24.0] - 2026-07-03\r\n\r\nA picker-polish release: the endpoint picker's labels, keys, and flows now tell the truth about what each action does and where it acts — and message delivery no longer breaks after a context reset, with a dropped adapter profile fixed along the way.\r\n\r\n### Added\r\n\r\n- **The choose-project panel now marks your current directory.** A history entry whose folder is your current working directory is tagged `(CURRENT DIR)`; if your current directory isn't already in the history, a `CURRENT DIR --> <folder>` row is offered so you can start there directly.\r\n- **The interactive endpoint picker now titles its terminal window.** The window or tab is set to `SPT Endpoint Picker` when the picker opens interactively.\r\n\r\n### Changed\r\n\r\n- **Two picker action labels now name their target.** \"Fork endpoint here --> <current dir>\" states the directory the fork will run in, and \"Set shortcut here --> <current dir>/<file>\" names the exact shortcut file that will be written, so the label cannot drift from what actually happens.\r\n- **The translation-binary protocol now requires an explicit commit terminator.** Every `{\"type\":\"event\"}` a translation binary receives must be answered with a trailing `{\"commit\":true}` — including an event with nothing to inject, which must still answer with a bare commit. The harness-contract docs also correct the missed-commit consequence: a missed commit no longer permanently kills the binary — it is tolerated and the envelope is re-spooled once.\r\n\r\n### Fixed\r\n\r\n- **The picker's confirm panel now shows the readable project name.** The one remaining place that still displayed a raw project slug now shows the friendly name, matching the rest of the picker and `spt endpoint list`.\r\n- **The picker's `h` and `s` keys now work only where they can launch, and the footer only hints them there.** Headless-start (`h`) and shortcut (`s`) previously fired from rows that could not launch anything, and the footer advertised them where they were dead; both are now live only on a highlighted row that can actually start the endpoint, and the footer hint matches.\r\n- **\"Change harness adapter\" now only changes the adapter.** Choosing it no longer re-prompts for an id and home directory and then starts a session — it picks a new adapter, applies it to the endpoint, and returns to the confirm panel.\r\n- **An endpoint's adapter profile is no longer dropped on reconnect.** An endpoint created with an adapter profile (e.g. `claude-spt:ccs`) keeps that profile; re-binding no longer strips it back to the bare adapter.\r\n- **A missed commit no longer stops idle message delivery.** Previously an event that armed nothing (such as a context reset) could make the translation binary miss its commit and permanently stop delivering that session's idle messages until it was restarted. A single miss is now tolerated — the healthy binary is kept and the next message delivers through it; only repeated misses or a genuine crash fault it, triggering a bounded automatic respawn and recording a fault status on the endpoint instead of failing silently.\r\n- **Message delivery and scheduled wake-ups now survive a context reset.** After a context reset, an idle agent could stop receiving messages and scheduled wake-ups until its session was restarted; the session boundary now re-stamps its readiness in the correct order across the reset, so messages and wakes right after a reset are delivered instead of dropped.\r\n- **A `--force-native` send that cannot be delivered now says why.** The failure message distinguishes its cause — empty message, no daemon running, endpoint active mid-turn, no working translation binary, or not a controllable endpoint — instead of a single identical message for every case.\r\n\r\n## [0.23.0] - 2026-07-03\r\n\r\nA run-truth release: starting, resuming, and shutting down agent sessions now behave honestly — no duplicate sessions, no stale \"controlled\" markers, no orphaned processes — alongside picker and listing display polish and a fix for adapter updates that could get permanently stuck on a machine running an agent.\r\n\r\n### Changed\r\n\r\n- **Projects now display a recognizable name.** Across the agent picker (history, the choose-project panel, resume titles) and the `spt endpoint list` project column, a project shows a readable name (e.g. `spt-core`) instead of a raw slug; two projects with the same name are told apart by their folder.\r\n- **`spt endpoint list` output refreshed.** The shared-subnet and total lines are dimmed, the status glyph now sits beside the endpoint name, and the status word is colored.\r\n- **The agent picker no longer offers \"View\" for an offline endpoint.** An offline endpoint has no live session to view, so only Start is offered.\r\n- **`spt daemon status` now warns about a stale at-logon task registration.** If the auto-start task was registered by an older installer in an unsafe form, `spt daemon status` flags it with guidance to re-register via the current installer; the daemon self-protects either way.\r\n- **Piping `spt daemon run` to another command now discards its output by design.** A piped launch is treated as a detached one and its console output is dropped; to capture the daemon's output, redirect it to a file (e.g. `spt daemon run 2>daemon.log`) instead.\r\n\r\n### Fixed\r\n\r\n- **Colored CLI output on Windows consoles no longer garbles.** On a raw Windows console, `spt endpoint list` and `--help` no longer print raw escape sequences; when the console cannot render color, the output is cleanly stripped instead.\r\n- **Resume-from-history now labels each session with its own project.** Past sessions no longer all read as the newest project, and internal or host sessions no longer appear as unresumable rows.\r\n- **The Start-now project chooser no longer lists the same project twice.**\r\n- **A dead or offline endpoint no longer reads as \"controlled.\"** The controlled/viewer marking is cleared once the session is gone — including across a daemon restart — instead of lingering.\r\n- **`spt endpoint run` over an already-live endpoint no longer duplicates the session.** It attaches to the running session (or, when headless, reports that the endpoint is already live) instead of silently starting a second session with a crossed view.\r\n- **Resuming a session no longer hangs at \"No sessions match.\"** Resume — including after a daemon restart — now restores the real recorded session, or starts fresh with a clear notice when there is nothing to resume.\r\n- **`spt endpoint shutdown` now fully tears down a wedged or crash-looping Psyche.** Its child processes are killed too, instead of being left orphaned for a manual cleanup.\r\n- **A crash-looping Psyche is now detected and stopped.** Instead of silently respawning several times a second, the loop is halted, backed off, and surfaced as an error.\r\n- **Adapter updates no longer get permanently stuck on a machine running an agent.** Leftover files from a prior update no longer make every later `spt adapter update` fail and roll back; update errors now name the file and operation involved.\r\n- **One agent can no longer corrupt another agent's session identity.** An agent's endpoint identity and presence are no longer overwritten by another agent's Psyche, and a dead endpoint can no longer be silently re-bound to a different agent's session.\r\n\r\n## [0.22.0] - 2026-07-03\r\n\r\nA picker-and-presence truth release: the endpoint picker and listing show real project, type, and control state — including for endpoints on other machines — and a few rough edges around piping and cross-node display are fixed.\r\n\r\n### Added\r\n\r\n- **`spt api endpoint-info`.** A new command that emits, as JSON, which node an endpoint is attached to — for harnesses that need to resolve the node from which a controller is attached.\r\n\r\n### Changed\r\n\r\n- **`spt endpoint list` now shows a project column.** Each row reads id / project / type / status, so you can see at a glance which project an endpoint belongs to.\r\n- **The endpoint picker got two UX fixes.** Starting an endpoint now opens a choose-project panel, and the resume view keeps the top endpoint details panel visible.\r\n\r\n### Fixed\r\n\r\n- **Endpoints on other machines now show truthful details.** A remote machine's rows previously displayed faked adapter, history, and control information; the gossiped rows now carry the real adapter, project history, and whether the endpoint is being controlled.\r\n- **A controlled endpoint now reads as CONTROLLED accurately — and stops reading CONTROLLED once control ends.** An endpoint being driven shows as controlled both in its own machine's picker and from other nodes; when the controller detaches or exits, the stale controlled/viewer marking is now cleared instead of lingering.\r\n- **`spt send` from inside an agent's hosted session no longer mis-stamps the sender.** The sender could be stamped as `cli@<node>`, causing replies to bounce; sender identity now falls back to process ancestry when the session's environment variables are absent.\r\n- **Piping `spt` output to a command that closes early no longer errors.** Sending output to something like `| head` that closes the pipe now exits cleanly (0) instead of failing with a broken-pipe error.\r\n\r\n## [0.21.0] - 2026-07-02\r\n\r\nA visibility + update-honesty release: the endpoint list is reorganized around machines, and `spt update apply` / `spt daemon status` are clearer about which version is actually running.\r\n\r\n### Added\r\n\r\n- **`spt endpoint list --show-all`.** Suspended (resting) endpoints are now hidden by default to cut clutter; `--show-all` reveals them. Each machine's total discloses how many were hidden (nothing silently vanishes), and a corrupt record always shows regardless.\r\n- **`spt daemon status` now reports the running daemon's version.** It shows the version the running daemon was built from beside the installed version and flags a mismatch — so you can tell when an update is on disk but the daemon still needs a restart to fully load it. The `--json` output gains matching `broker_image` / `broker_stale` fields.\r\n\r\n### Changed\r\n\r\n- **`spt endpoint list` (and `spt whoami`) is now grouped by machine, not by subnet.** Your own node comes first, then each remote machine alphabetically — every endpoint appears once per machine (no more duplicate rows for a machine reachable through several subnets), with a per-machine total and the subnets it shares with you. The old `ENDPOINTS:` summary line (which counted a machine once per subnet) is removed.\r\n- **`spt update apply` now tells you when a daemon restart is needed.** On a successful update it notes that daemon-coordinated features keep running the previous version until you restart the daemon, and points you at `spt daemon status` to confirm which version is live.\r\n- **`spt endpoint list --json` gains a per-endpoint `endpoint_type` field.** Additive — the existing JSON shape is otherwise unchanged.\r\n\r\n### Fixed\r\n\r\n- **`spt update apply` when already up to date no longer errors.** Re-running apply on a version that is already installed used to fail with an \"access denied\" error; it now recognizes the up-to-date state and exits cleanly with a clear message.\r\n- **Concurrent first-time store initialization no longer fails.** Two spt processes initializing the same fresh data store at once (for example the daemon and a command racing on first use) could fail with a \"could not lock config file\" error; initialization is now race-tolerant.\r\n\r\n## [0.20.0] - 2026-07-02\r\n\r\nA cross-node delivery release: messages to a remote, idle spt-hosted endpoint now arrive immediately, alongside adapter-update, sender-labeling, and auth-recovery fixes.\r\n…\n","startLine":521,"lineNumbers":[521,null,525,null,527,null,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,null,644]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\CHANGELOG.md"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1186,"totalBytes":13153,"outputLines":100,"outputBytes":13153,"shownRange":{"start":529,"end":628},"nextOffset":629}}},"isError":false,"timestamp":1784293624425}}
{"type":"message","id":"6789a64e","parentId":"3f9c8625","timestamp":"2026-07-17T13:07:04.443Z","message":{"role":"toolResult","toolCallId":"call_qRxp5UTFBRkCv076AMmdJFaA|fc_04b15dc90dfe1c93016a5a28f851a881958d703ac8261da6a9","toolName":"grep","content":[{"type":"text","text":"# docs/\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 149|**Fix shape:** additive gossip fields, N-1-safe exactly like `endpoint_type`:\n*150|`Instance.adapter` (composite `<adapter>[:profile]`) + `Instance.recent_projects`\n 151|(bounded, newest-first) → thread to `ResourceRow` → `from_resource_row` stops faking.\n 152|\n 153|**Project representation ruling (operator 2026-07-03): project IDs only, EVERYWHERE —\n...\n 229|(sessions.log-derived, owlery-excluded). Remote rows: head of #4's gossiped\n*230|`recent_projects`. Project IDs only + #4's disambiguation rule; `-` when unknown\n 231|(pre-field remote rows). Extends the fresh v0.21.0 node-grouped renderer\n 232|(`format_instance_rows` — additive column, alignment already char-width-safe).\n 233|`--json`: additive `project` field on the row DTO (skip-if-none, N-1 safe).\n...\n 285|| W1 presence-truth | #2 reap-clears + REQ-HAZARD-CONTROL-STAMP-LIFETIME mint; #3 local controlled-display; **#9 self-id PID-ancestry (rolled in — field-active)** | Field-visible lies about control/identity state; smallest, highest confidence; #7 depends on honest stamps |\n*286|| W2 history+details-truth | #1 sessions.log-derived history + owlery exclusion + project-ID display w/ disambiguation; SI-1 branchless-store RCA (full item); #4 gossip adapter+recent_projects | #1/#4 share the history/gossip seams; #5/#8 depend on both |\n 287|| W3 surfaces | #8 project column (list + --json additive); #7 `spt api endpoint-info` | Consume W1 stamps + W2 sources; xtask docs regen both |\n 288|| W4 UX | #5 choose-project step; #6 resume panel retention; **#10 BrokenPipe (micro)** | Build on W2's dir-carrying history model; #10 slots anywhere cheap |\n 289|\n\n# crates/\n\n## spt-daemon/\n\n### src/\n#### dispatch.rs\n 1879|                    adapter: None,\n*1880|                    recent_projects: Vec::new(),\n 1881|                    controlled: false,\n 1882|                },\n 1883|            })\n#### notif.rs\n 710|                    adapter: None,\n*711|                    recent_projects: Vec::new(),\n 712|                    controlled: false,\n 713|                },\n 714|            );\n#### presence.rs\n 231|            adapter: None,\n*232|            recent_projects: Vec::new(),\n 233|            controlled: false,\n 234|        }\n 235|    }\n#### reconcile.rs\n 63|            adapter: None,\n*64|            recent_projects: Vec::new(),\n 65|            controlled: false,\n 66|        }\n 67|    }\n#### registryhost.rs\n 572|            });\n*573|            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\n 574|            // real harness adapter + its recent projects + the EXPLICIT any-controller\n 575|            // truth, gossiped so `from_resource_row` stops faking remote rows.\n 576|            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\n 577|            //    used to show the resources blurb here).\n*578|            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n 579|            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n 580|            //    a local controller has driven_by=None so that WHO datum undercounts it).\n*581|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 582|            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n 583|            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n*584|            let recent_projects = recent_projects_for(&perch_path, owlery);\n 585|            let last_active_ms = info.and_then(|i| i.last_active_ms);\n 586|            for sub in &subnets.subnets {\n 587|                let Ok(ep) = epoch.next_epoch() else { continue };\n...\n 614|                    harness_only,\n*615|                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\n*616|                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 617|                    adapter: adapter.clone(),\n*618|                    recent_projects: recent_projects.clone(),\n 619|                    controlled,\n 620|                };\n 621|                let reg = regs.entry(sub.name.clone()).or_default();\n...\n 687|                    adapter: None,\n*688|                    recent_projects: Vec::new(),\n 689|                    controlled: false,\n 690|                };\n 691|                reg.merge_instance(&id, instance.clone());\n...\n 981|/// The endpoint's recent project IDs newest→oldest for gossip (#4,\n*982|/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n 983|/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n 984|/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n 985|/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n 986|/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n*987|// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n*988|fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n 989|    let entries = spt_store::sessions::read_all(perch_path);\n 990|    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n 991|    let mut out: Vec<String> = Vec::new();\n...\n 1193|\n*1194|    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n 1195|    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196|    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197|    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198|    #[test]\n*1199|    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200|        let tmp = tempfile::tempdir().unwrap();\n 1201|        let root = tmp.path();\n 1202|        let owlery = root.join(\"owlery\");\n...\n 1229|\n*1230|        let got = recent_projects_for(&perch, &owlery);\n 1231|        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232|        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233|    }\n...\n 1278|                adapter: None,\n*1279|                recent_projects: Vec::new(),\n 1280|                controlled: false,\n 1281|            },\n 1282|        }\n...\n 1366|            adapter: None,\n*1367|            recent_projects: Vec::new(),\n 1368|            controlled: false,\n 1369|        }\n 1370|    }\n...\n 1683|                    adapter: None,\n*1684|                    recent_projects: Vec::new(),\n 1685|                    controlled: false,\n 1686|                },\n 1687|            }\n...\n 1828|                    adapter: None,\n*1829|                    recent_projects: Vec::new(),\n 1830|                    controlled: false,\n 1831|                },\n 1832|            }\n#### shelldisc.rs\n 335|            adapter: None,\n*336|            recent_projects: Vec::new(),\n 337|            controlled: false,\n 338|        };\n 339|        let mut reg = SubnetRegistry::new();\n#### wan.rs\n 430|            adapter: None,\n*431|            recent_projects: Vec::new(),\n 432|            controlled: false,\n 433|        };\n 434|        let proven = \"aa11node\";\n\n### tests/\n#### dispatch.rs\n 759|            adapter: None,\n*760|            recent_projects: Vec::new(),\n 761|            controlled: false,\n 762|        },\n 763|    );\n...\n 1082|            adapter: None,\n*1083|            recent_projects: Vec::new(),\n 1084|            controlled: false,\n 1085|        },\n 1086|    });\n#### pump.rs\n 358|                    adapter: None,\n*359|                    recent_projects: Vec::new(),\n 360|                    controlled: false,\n 361|                },\n 362|            }],\n#### registry_lifecycle.rs\n 152|            adapter: None,\n*153|            recent_projects: Vec::new(),\n 154|            controlled: false,\n 155|        },\n 156|    }\n#### replicate.rs\n 129|        adapter: None,\n*130|        recent_projects: Vec::new(),\n 131|        controlled: false,\n 132|    };\n 133|    let admitted = advertise_if_visible(\n...\n 168|            adapter: None,\n*169|            recent_projects: Vec::new(),\n 170|            controlled: false,\n 171|        },\n 172|    };\n#### sync.rs\n 439|            adapter: None,\n*440|            recent_projects: Vec::new(),\n 441|            controlled: false,\n 442|        },\n 443|        Instance {\n...\n 456|            adapter: None,\n*457|            recent_projects: Vec::new(),\n 458|            controlled: false,\n 459|        },\n 460|    ];\n\n## spt-net/src/net/\n### registry.rs\n 196|    /// shows the real harness instead of the resources *blurb* masquerading as one\n*197|    /// (#4, REQ-GOSSIP-ADAPTER-PROJECTS: `from_resource_row` used to pass the blurb as\n 198|    /// the adapter). Node-level data riding the instance row like\n 199|    /// [`endpoint_type`](Self::endpoint_type) — same epoch lease, same visibility gate.\n 200|    /// Additive serde-default: an N-1 row parses clean to `None` (the picker renders `-`).\n*201|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 202|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n 203|    pub adapter: Option<String>,\n 204|    /// The endpoint's **recent projects**, newest-first, project IDs ONLY\n...\n 209|    /// Rides the instance row; additive serde-default: an N-1 row parses clean to empty.\n*210|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 211|    #[serde(default, skip_serializing_if = \"Vec::is_empty\")]\n*212|    pub recent_projects: Vec<String>,\n 213|    /// Whether ANY operator (local OR remote) currently drives this instance — the\n 214|    /// broker-owned any-controller marker ([`spt_store::info::Info::controlled`]).\n 215|    /// Gossiped **explicitly**, NOT derived from [`controller_node`](Self::controller_node):\n...\n 221|    /// `controlled=true`). Additive serde-default: an N-1 row parses clean to `false`.\n*222|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 223|    #[serde(default, skip_serializing_if = \"is_false\")]\n 224|    pub controlled: bool,\n 225|}\n...\n 530|    /// (#4). `None` on a pre-field remote row (renders `-`).\n*531|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 532|    pub adapter: Option<String>,\n*533|    /// The advertised recent-project IDs newest-first ([`Instance::recent_projects`]) —\n 534|    /// threaded so a remote picker/list renders real project history, not a faked empty\n 535|    /// (#4). Empty on a pre-field remote row.\n*536|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n*537|    pub recent_projects: Vec<String>,\n 538|    /// The advertised any-controller marker ([`Instance::controlled`]) — threaded so a\n 539|    /// remote row reads controlled-ness from the raw truth, not the WHO datum (#4;\n 540|    /// undercounts the local-controller case otherwise).\n*541|    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 542|    pub controlled: bool,\n 543|}\n 544|\n...\n 605|                epoch: instance.epoch,\n*606|                // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the real\n 607|                // adapter + recent projects + explicit any-controller truth ride the\n 608|                // projection so `from_resource_row` stops faking remote rows.\n*609|                // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 610|                adapter: instance.adapter.clone(),\n*611|                recent_projects: instance.recent_projects.clone(),\n 612|                controlled: instance.controlled,\n 613|            });\n 614|        }\n...\n 1144|            adapter: None,\n*1145|            recent_projects: Vec::new(),\n 1146|            controlled: false,\n 1147|        }\n 1148|    }\n...\n 1188|            adapter: None,\n*1189|            recent_projects: Vec::new(),\n 1190|            controlled: false,\n 1191|        };\n 1192|        // Full round-trip preserves every new field.\n...\n 1222|\n*1223|    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: the de-faking gossip fields\n*1224|    // (adapter / recent_projects / controlled) round-trip on the wire AND an N-1 row\n 1225|    // omitting all three parses clean to the conservative defaults (None / empty /\n 1226|    // false), so `from_resource_row` degrades to \"-\" on a mixed-version subnet instead\n 1227|    // of failing — the same ADR-0001 additive discipline as the W5 parity fields.\n...\n 1231|            adapter: Some(\"claude-spt:doyle\".to_string()),\n*1232|            recent_projects: vec![\"spt-core\".to_string(), \"owl\".to_string()],\n 1233|            controlled: true,\n 1234|            ..inst(\"n1\", Status::Active, 7)\n 1235|        };\n...\n 1238|        assert_eq!(back.adapter.as_deref(), Some(\"claude-spt:doyle\"));\n*1239|        assert_eq!(back.recent_projects, vec![\"spt-core\", \"owl\"]);\n 1240|        assert!(back.controlled);\n 1241|\n 1242|        // N-1 row (pre-#4 shape) → clean defaults.\n...\n 1245|        assert_eq!(old.adapter, None, \"N-1 → no adapter (renders '-')\");\n*1246|        assert!(old.recent_projects.is_empty(), \"N-1 → no projects\");\n 1247|        assert!(!old.controlled, \"N-1 → not controlled\");\n 1248|\n 1249|        // Common case skip-serializes — a forward node's output stays N-1-readable.\n### replicate.rs\n 170|                adapter: None,\n*171|                recent_projects: Vec::new(),\n 172|                controlled: false,\n 173|            },\n 174|        }\n### wanmsg.rs\n 149|                adapter: None,\n*150|                recent_projects: Vec::new(),\n 151|                controlled: false,\n 152|            },\n 153|        }\n\n## spt/src/\n### cli.rs\n 2957|    /// The endpoint's LATEST project ID (#8, REQ-ENDPOINT-LIST-PROJECT-COL) — the\n*2958|    /// gossiped `recent_projects` head. Additive, `skip_serializing_if` keeps the JSON\n 2959|    /// byte-identical for a pre-field remote row (N-1 safe).\n 2960|    // [impl->REQ-ENDPOINT-LIST-PROJECT-COL]\n 2961|    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n...\n 3109|                    // [impl->REQ-ENDPOINT-LIST-PROJECT-COL] additive project field:\n*3110|                    // the gossiped recent_projects head (IDs only).\n*3111|                    project: r.recent_projects.first().cloned(),\n 3112|                })\n 3113|                .collect();\n 3114|            subnet_groups.push(SubnetGroupJson { name, endpoints });\n...\n 3290|    /// row's #1-history head (sessions.log-derived, owlery-excluded) or the remote\n*3291|    /// row's #4-gossiped `recent_projects` head. `None` when unknown (a pre-field\n 3292|    /// remote row / an endpoint with no project history) → the column renders `-`.\n 3293|    /// Carries the DIR (not just the ID) so the render-time disambiguation\n 3294|    /// ([`disambiguate_project_ids`]) can suffix a colliding local ID; a remote head\n...\n 3416|        corrupt: false,\n*3417|        // #8: the LATEST project = the #4-gossiped recent_projects head. IDs only cross\n 3418|        // the wire (no dir), so the disambiguation degrades this to the bare ID.\n 3419|        // [impl->REQ-ENDPOINT-LIST-PROJECT-COL]\n*3420|        project_ref: r.recent_projects.first().map(|id| crate::picker::model::ProjectRef {\n 3421|            id: id.clone(),\n 3422|            dir: String::new(),\n 3423|            // IDs only cross the wire (no dir, no URL) → display falls back to the id\n...\n 13836|    // [unit->REQ-ENDPOINT-LIST-PROJECT-COL] #8: a REMOTE cell takes its project head\n*13837|    // from the #4-gossiped `recent_projects` (newest) — IDs only, NO dir on the wire; a\n*13838|    // pre-field remote row (empty recent_projects) has no project → the column renders '-'.\n 13839|    #[test]\n*13840|    fn remote_cell_project_ref_from_gossiped_recent_projects() {\n 13841|        use spt_net::net::registry::Status;\n 13842|        let mut row = res_row(\"ep\", \"nodehex\", \"BOX\", Status::Active, 1);\n*13843|        row.recent_projects = vec![\"spt-core\".into(), \"owl\".into()];\n 13844|        let cell = instance_cell_from_resource(&row);\n 13845|        assert_eq!(\n 13846|            cell.project_ref.as_ref().map(|r| r.id.as_str()),\n...\n 13850|        assert_eq!(cell.project_ref.as_ref().map(|r| r.dir.as_str()), Some(\"\"), \"no dir on the wire\");\n*13851|        row.recent_projects.clear();\n 13852|        assert!(\n 13853|            instance_cell_from_resource(&row).project_ref.is_none(),\n 13854|            \"pre-field remote row → no project (renders '-')\"\n...\n 13901|            adapter: None,\n*13902|            recent_projects: Vec::new(),\n 13903|            controlled: false,\n 13904|        }\n 13905|    }\n...\n 17077|                adapter: None,\n*17078|                recent_projects: Vec::new(),\n 17079|                controlled: false,\n 17080|            },\n 17081|        );\n...\n 17525|                    adapter: None,\n*17526|                    recent_projects: Vec::new(),\n 17527|                    controlled: false,\n 17528|                },\n 17529|            );\n...\n 17605|            adapter: None,\n*17606|            recent_projects: Vec::new(),\n 17607|            controlled: false,\n 17608|        };\n 17609|        let mut reg = SubnetRegistry::new();\n...\n 17718|            adapter: None,\n*17719|            recent_projects: Vec::new(),\n 17720|            controlled: false,\n 17721|        };\n 17722|        let now = 1_000_000u64;\n### wansend.rs\n 789|                adapter: None,\n*790|                recent_projects: Vec::new(),\n 791|                controlled: false,\n 792|            },\n 793|        );\n...\n 824|                    adapter: None,\n*825|                    recent_projects: Vec::new(),\n 826|                    controlled: false,\n 827|                },\n 828|            );\n...\n 1252|                    adapter: None,\n*1253|                    recent_projects: Vec::new(),\n 1254|                    controlled: false,\n 1255|                },\n 1256|            );\n\n### picker/\n#### data.rs\n 773|            adapter: None,\n*774|            recent_projects: Vec::new(),\n 775|            controlled: false,\n 776|        };\n 777|        let mut reg = SubnetRegistry::new();\n...\n 821|\n*822|    // [int->REQ-GOSSIP-ADAPTER-PROJECTS]\n 823|    // [int->REQ-SUBNET-DISPLAY-PARITY] the W5 parity end-to-end: a remote node\n 824|    // gossips four endpoints exercising every cross-subnet display state\n 825|    // (bound-free / unbound / controlled / harness-only), loaded through the REAL\n...\n 859|            adapter: None,\n*860|            recent_projects: Vec::new(),\n 861|            controlled,\n 862|        };\n 863|        let mut reg = SubnetRegistry::new();\n...\n 876|            adapter: Some(\"claude-spt:doyle\".to_string()),\n*877|            recent_projects: vec![\"spt-core\".to_string(), \"owl\".to_string()],\n 878|            ..inst(true, None, false, true)\n 879|        };\n 880|        reg.merge_instance(\"locctlep\", locctl);\n...\n 949|            adapter: None,\n*950|            recent_projects: Vec::new(),\n 951|            controlled: false,\n 952|        };\n 953|        // The SAME endpoint on the SAME machine, gossiped in BOTH subnets — but cold\n#### model.rs\n 586|            is_local: false,\n*587|            // #4 (REQ-GOSSIP-ADAPTER-PROJECTS): the REAL gossiped adapter — not the\n 588|            // resources blurb, which used to masquerade as the harness here. `None`\n 589|            // (a pre-field remote row) renders empty → the pane shows `-`.\n*590|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n 591|            adapter_profile: row.adapter.clone().unwrap_or_default(),\n 592|            // #4: real gossiped project history (IDs only; dirs never cross the wire),\n 593|            // no longer a hardcoded empty. Empty on a pre-field remote row.\n*594|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n*595|            project_history: row.recent_projects.clone(),\n*596|            // Remote rows still carry no project DIRS — recent_projects gossips IDs\n 597|            // only (dirs are local-only, for #5's Choose-project launch-into-dir).\n 598|            project_refs: Vec::new(),\n 599|            description: row.resources.clone().unwrap_or_default(),\n...\n 605|            // reopening the #3 hole. `driven_by` stays the separate WHO pin.\n*606|            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS] [impl->REQ-PICKER-CONTROLLED-LOCAL]\n 607|            controlled: row.controlled,\n 608|            driven_by,\n 609|            viewer_count: 0,\n...\n 1918|\n*1919|    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: from_resource_row stops FAKING remote\n 1920|    // rows. The real gossiped adapter fills `adapter_profile` (NOT the resources blurb,\n*1921|    // which used to masquerade as the harness); `recent_projects` fills\n 1922|    // `project_history`; `controlled` is read VERBATIM (NOT `driven_by.is_some()`, which\n 1923|    // undercounts the local-controller case). A pre-field N-1 row degrades clean.\n 1924|    #[test]\n...\n 1938|            adapter: adapter.map(str::to_string),\n*1939|            recent_projects: projects.iter().map(|s| s.to_string()).collect(),\n 1940|            controlled,\n 1941|        };\n 1942|\n\nShowing files 1-20 of 22+. Use skip=20 for the next page, or narrow paths/pattern."}],"details":{"scopePath":"docs, crates","searchPath":"C:\\Users\\decid\\Documents\\projects\\spt-core","cwd":"C:\\Users\\decid\\Documents\\projects\\spt-core","matchCount":90,"fileCount":20,"files":["docs/NEXT-MILESTONE-PICKER-TRIAGE.md","crates/spt-daemon/src/dispatch.rs","crates/spt-daemon/src/notif.rs","crates/spt-daemon/src/presence.rs","crates/spt-daemon/src/reconcile.rs","crates/spt-daemon/src/registryhost.rs","crates/spt-daemon/src/shelldisc.rs","crates/spt-daemon/src/wan.rs","crates/spt-daemon/tests/dispatch.rs","crates/spt-daemon/tests/pump.rs","crates/spt-daemon/tests/registry_lifecycle.rs","crates/spt-daemon/tests/replicate.rs","crates/spt-daemon/tests/sync.rs","crates/spt-net/src/net/registry.rs","crates/spt-net/src/net/replicate.rs","crates/spt-net/src/net/wanmsg.rs","crates/spt/src/cli.rs","crates/spt/src/picker/data.rs","crates/spt/src/picker/model.rs","crates/spt/src/wansend.rs"],"fileMatches":[{"path":"docs/NEXT-MILESTONE-PICKER-TRIAGE.md","count":3},{"path":"crates/spt-daemon/src/dispatch.rs","count":1},{"path":"crates/spt-daemon/src/notif.rs","count":1},{"path":"crates/spt-daemon/src/presence.rs","count":1},{"path":"crates/spt-daemon/src/reconcile.rs","count":1},{"path":"crates/spt-daemon/src/registryhost.rs","count":18},{"path":"crates/spt-daemon/src/shelldisc.rs","count":1},{"path":"crates/spt-daemon/src/wan.rs","count":1},{"path":"crates/spt-daemon/tests/dispatch.rs","count":2},{"path":"crates/spt-daemon/tests/pump.rs","count":1},{"path":"crates/spt-daemon/tests/registry_lifecycle.rs","count":1},{"path":"crates/spt-daemon/tests/replicate.rs","count":2},{"path":"crates/spt-daemon/tests/sync.rs","count":2},{"path":"crates/spt-net/src/net/registry.rs","count":20},{"path":"crates/spt-net/src/net/replicate.rs","count":1},{"path":"crates/spt-net/src/net/wanmsg.rs","count":1},{"path":"crates/spt/src/cli.rs","count":16},{"path":"crates/spt/src/picker/data.rs","count":5},{"path":"crates/spt/src/picker/model.rs","count":9},{"path":"crates/spt/src/wansend.rs","count":3}],"truncated":true,"fileLimitReached":20,"perFileLimitReached":20,"displayContent":"# docs/\n## NEXT-MILESTONE-PICKER-TRIAGE.md\n 149│**Fix shape:** additive gossip fields, N-1-safe exactly like `endpoint_type`:\n*150│`Instance.adapter` (composite `<adapter>[:profile]`) + `Instance.recent_projects`\n 151│(bounded, newest-first) → thread to `ResourceRow` → `from_resource_row` stops faking.\n 152│\n 153│**Project representation ruling (operator 2026-07-03): project IDs only, EVERYWHERE —\n    │...\n 229│(sessions.log-derived, owlery-excluded). Remote rows: head of #4's gossiped\n*230│`recent_projects`. Project IDs only + #4's disambiguation rule; `-` when unknown\n 231│(pre-field remote rows). Extends the fresh v0.21.0 node-grouped renderer\n 232│(`format_instance_rows` — additive column, alignment already char-width-safe).\n 233│`--json`: additive `project` field on the row DTO (skip-if-none, N-1 safe).\n    │...\n 285│| W1 presence-truth | #2 reap-clears + REQ-HAZARD-CONTROL-STAMP-LIFETIME mint; #3 local controlled-display; **#9 self-id PID-ancestry (rolled in — field-active)** | Field-visible lies about control/identity state; smallest, highest confidence; #7 depends on honest stamps |\n*286│| W2 history+details-truth | #1 sessions.log-derived history + owlery exclusion + project-ID display w/ disambiguation; SI-1 branchless-store RCA (full item); #4 gossip adapter+recent_projects | #1/#4 share the history/gossip seams; #5/#8 depend on both |\n 287│| W3 surfaces | #8 project column (list + --json additive); #7 `spt api endpoint-info` | Consume W1 stamps + W2 sources; xtask docs regen both |\n 288│| W4 UX | #5 choose-project step; #6 resume panel retention; **#10 BrokenPipe (micro)** | Build on W2's dir-carrying history model; #10 slots anywhere cheap |\n 289│\n\n# crates/\n\n## spt-daemon/\n\n### src/\n#### dispatch.rs\n 1879│                    adapter: None,\n*1880│                    recent_projects: Vec::new(),\n 1881│                    controlled: false,\n 1882│                },\n 1883│            })\n#### notif.rs\n 710│                    adapter: None,\n*711│                    recent_projects: Vec::new(),\n 712│                    controlled: false,\n 713│                },\n 714│            );\n#### presence.rs\n 231│            adapter: None,\n*232│            recent_projects: Vec::new(),\n 233│            controlled: false,\n 234│        }\n 235│    }\n#### reconcile.rs\n 63│            adapter: None,\n*64│            recent_projects: Vec::new(),\n 65│            controlled: false,\n 66│        }\n 67│    }\n#### registryhost.rs\n  572│            });\n *573│            // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the endpoint's\n  574│            // real harness adapter + its recent projects + the EXPLICIT any-controller\n  575│            // truth, gossiped so `from_resource_row` stops faking remote rows.\n  576│            //  - adapter: the composite `<adapter>[:profile]` off info.json (the picker\n  577│            //    used to show the resources blurb here).\n *578│            //  - recent_projects: sessions.log-derived, owlery-excluded, project IDs only.\n  579│            //  - controlled: the raw any-controller marker (NOT controller_node.is_some();\n  580│            //    a local controller has driven_by=None so that WHO datum undercounts it).\n *581│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  582│            let adapter = info.as_ref().and_then(|i| i.adapter.clone());\n  583│            let controlled = info.as_ref().is_some_and(|i| i.controlled);\n *584│            let recent_projects = recent_projects_for(&perch_path, owlery);\n  585│            let last_active_ms = info.and_then(|i| i.last_active_ms);\n  586│            for sub in &subnets.subnets {\n  587│                let Ok(ep) = epoch.next_epoch() else { continue };\n     │...\n  614│                    harness_only,\n *615│                    // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS).\n *616│                    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  617│                    adapter: adapter.clone(),\n *618│                    recent_projects: recent_projects.clone(),\n  619│                    controlled,\n  620│                };\n  621│                let reg = regs.entry(sub.name.clone()).or_default();\n     │...\n  687│                    adapter: None,\n *688│                    recent_projects: Vec::new(),\n  689│                    controlled: false,\n  690│                };\n  691│                reg.merge_instance(&id, instance.clone());\n     │...\n  981│/// The endpoint's recent project IDs newest→oldest for gossip (#4,\n *982│/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n  983│/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n  984│/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n  985│/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n  986│/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n *987│// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n *988│fn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n  989│    let entries = spt_store::sessions::read_all(perch_path);\n  990│    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n  991│    let mut out: Vec<String> = Vec::new();\n     │...\n 1193│\n*1194│    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: recent_projects_for derives the gossiped\n 1195│    // project IDs from the session ledger newest→oldest, excludes owlery-internal cwds\n 1196│    // (a psyche-host session is not a project), dedups (a project's newest occurrence\n 1197│    // wins its slot), and bounds the count. Project IDs only — no dirs on the wire.\n 1198│    #[test]\n*1199│    fn recent_projects_for_dedups_newest_first_excludes_owlery() {\n 1200│        let tmp = tempfile::tempdir().unwrap();\n 1201│        let root = tmp.path();\n 1202│        let owlery = root.join(\"owlery\");\n     │...\n 1229│\n*1230│        let got = recent_projects_for(&perch, &owlery);\n 1231│        // newest-first, owlery excluded, alpha deduped to its newest slot.\n 1232│        assert_eq!(got, vec![\"gamma\", \"alpha\", \"beta\"], \"got {got:?}\");\n 1233│    }\n     │...\n 1278│                adapter: None,\n*1279│                recent_projects: Vec::new(),\n 1280│                controlled: false,\n 1281│            },\n 1282│        }\n     │...\n 1366│            adapter: None,\n*1367│            recent_projects: Vec::new(),\n 1368│            controlled: false,\n 1369│        }\n 1370│    }\n     │...\n 1683│                    adapter: None,\n*1684│                    recent_projects: Vec::new(),\n 1685│                    controlled: false,\n 1686│                },\n 1687│            }\n     │...\n 1828│                    adapter: None,\n*1829│                    recent_projects: Vec::new(),\n 1830│                    controlled: false,\n 1831│                },\n 1832│            }\n#### shelldisc.rs\n 335│            adapter: None,\n*336│            recent_projects: Vec::new(),\n 337│            controlled: false,\n 338│        };\n 339│        let mut reg = SubnetRegistry::new();\n#### wan.rs\n 430│            adapter: None,\n*431│            recent_projects: Vec::new(),\n 432│            controlled: false,\n 433│        };\n 434│        let proven = \"aa11node\";\n\n### tests/\n#### dispatch.rs\n  759│            adapter: None,\n *760│            recent_projects: Vec::new(),\n  761│            controlled: false,\n  762│        },\n  763│    );\n     │...\n 1082│            adapter: None,\n*1083│            recent_projects: Vec::new(),\n 1084│            controlled: false,\n 1085│        },\n 1086│    });\n#### pump.rs\n 358│                    adapter: None,\n*359│                    recent_projects: Vec::new(),\n 360│                    controlled: false,\n 361│                },\n 362│            }],\n#### registry_lifecycle.rs\n 152│            adapter: None,\n*153│            recent_projects: Vec::new(),\n 154│            controlled: false,\n 155│        },\n 156│    }\n#### replicate.rs\n 129│        adapter: None,\n*130│        recent_projects: Vec::new(),\n 131│        controlled: false,\n 132│    };\n 133│    let admitted = advertise_if_visible(\n    │...\n 168│            adapter: None,\n*169│            recent_projects: Vec::new(),\n 170│            controlled: false,\n 171│        },\n 172│    };\n#### sync.rs\n 439│            adapter: None,\n*440│            recent_projects: Vec::new(),\n 441│            controlled: false,\n 442│        },\n 443│        Instance {\n    │...\n 456│            adapter: None,\n*457│            recent_projects: Vec::new(),\n 458│            controlled: false,\n 459│        },\n 460│    ];\n\n## spt-net/src/net/\n### registry.rs\n  196│    /// shows the real harness instead of the resources *blurb* masquerading as one\n *197│    /// (#4, REQ-GOSSIP-ADAPTER-PROJECTS: `from_resource_row` used to pass the blurb as\n  198│    /// the adapter). Node-level data riding the instance row like\n  199│    /// [`endpoint_type`](Self::endpoint_type) — same epoch lease, same visibility gate.\n  200│    /// Additive serde-default: an N-1 row parses clean to `None` (the picker renders `-`).\n *201│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  202│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n  203│    pub adapter: Option<String>,\n  204│    /// The endpoint's **recent projects**, newest-first, project IDs ONLY\n     │...\n  209│    /// Rides the instance row; additive serde-default: an N-1 row parses clean to empty.\n *210│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  211│    #[serde(default, skip_serializing_if = \"Vec::is_empty\")]\n *212│    pub recent_projects: Vec<String>,\n  213│    /// Whether ANY operator (local OR remote) currently drives this instance — the\n  214│    /// broker-owned any-controller marker ([`spt_store::info::Info::controlled`]).\n  215│    /// Gossiped **explicitly**, NOT derived from [`controller_node`](Self::controller_node):\n     │...\n  221│    /// `controlled=true`). Additive serde-default: an N-1 row parses clean to `false`.\n *222│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  223│    #[serde(default, skip_serializing_if = \"is_false\")]\n  224│    pub controlled: bool,\n  225│}\n     │...\n  530│    /// (#4). `None` on a pre-field remote row (renders `-`).\n *531│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  532│    pub adapter: Option<String>,\n *533│    /// The advertised recent-project IDs newest-first ([`Instance::recent_projects`]) —\n  534│    /// threaded so a remote picker/list renders real project history, not a faked empty\n  535│    /// (#4). Empty on a pre-field remote row.\n *536│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n *537│    pub recent_projects: Vec<String>,\n  538│    /// The advertised any-controller marker ([`Instance::controlled`]) — threaded so a\n  539│    /// remote row reads controlled-ness from the raw truth, not the WHO datum (#4;\n  540│    /// undercounts the local-controller case otherwise).\n *541│    // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  542│    pub controlled: bool,\n  543│}\n  544│\n     │...\n  605│                epoch: instance.epoch,\n *606│                // The #4 de-faking datums (REQ-GOSSIP-ADAPTER-PROJECTS): the real\n  607│                // adapter + recent projects + explicit any-controller truth ride the\n  608│                // projection so `from_resource_row` stops faking remote rows.\n *609│                // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  610│                adapter: instance.adapter.clone(),\n *611│                recent_projects: instance.recent_projects.clone(),\n  612│                controlled: instance.controlled,\n  613│            });\n  614│        }\n     │...\n 1144│            adapter: None,\n*1145│            recent_projects: Vec::new(),\n 1146│            controlled: false,\n 1147│        }\n 1148│    }\n     │...\n 1188│            adapter: None,\n*1189│            recent_projects: Vec::new(),\n 1190│            controlled: false,\n 1191│        };\n 1192│        // Full round-trip preserves every new field.\n     │...\n 1222│\n*1223│    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: the de-faking gossip fields\n*1224│    // (adapter / recent_projects / controlled) round-trip on the wire AND an N-1 row\n 1225│    // omitting all three parses clean to the conservative defaults (None / empty /\n 1226│    // false), so `from_resource_row` degrades to \"-\" on a mixed-version subnet instead\n 1227│    // of failing — the same ADR-0001 additive discipline as the W5 parity fields.\n     │...\n 1231│            adapter: Some(\"claude-spt:doyle\".to_string()),\n*1232│            recent_projects: vec![\"spt-core\".to_string(), \"owl\".to_string()],\n 1233│            controlled: true,\n 1234│            ..inst(\"n1\", Status::Active, 7)\n 1235│        };\n     │...\n 1238│        assert_eq!(back.adapter.as_deref(), Some(\"claude-spt:doyle\"));\n*1239│        assert_eq!(back.recent_projects, vec![\"spt-core\", \"owl\"]);\n 1240│        assert!(back.controlled);\n 1241│\n 1242│        // N-1 row (pre-#4 shape) → clean defaults.\n     │...\n 1245│        assert_eq!(old.adapter, None, \"N-1 → no adapter (renders '-')\");\n*1246│        assert!(old.recent_projects.is_empty(), \"N-1 → no projects\");\n 1247│        assert!(!old.controlled, \"N-1 → not controlled\");\n 1248│\n 1249│        // Common case skip-serializes — a forward node's output stays N-1-readable.\n### replicate.rs\n 170│                adapter: None,\n*171│                recent_projects: Vec::new(),\n 172│                controlled: false,\n 173│            },\n 174│        }\n### wanmsg.rs\n 149│                adapter: None,\n*150│                recent_projects: Vec::new(),\n 151│                controlled: false,\n 152│            },\n 153│        }\n\n## spt/src/\n### cli.rs\n  2957│    /// The endpoint's LATEST project ID (#8, REQ-ENDPOINT-LIST-PROJECT-COL) — the\n *2958│    /// gossiped `recent_projects` head. Additive, `skip_serializing_if` keeps the JSON\n  2959│    /// byte-identical for a pre-field remote row (N-1 safe).\n  2960│    // [impl->REQ-ENDPOINT-LIST-PROJECT-COL]\n  2961│    #[serde(default, skip_serializing_if = \"Option::is_none\")]\n      │...\n  3109│                    // [impl->REQ-ENDPOINT-LIST-PROJECT-COL] additive project field:\n *3110│                    // the gossiped recent_projects head (IDs only).\n *3111│                    project: r.recent_projects.first().cloned(),\n  3112│                })\n  3113│                .collect();\n  3114│            subnet_groups.push(SubnetGroupJson { name, endpoints });\n      │...\n  3290│    /// row's #1-history head (sessions.log-derived, owlery-excluded) or the remote\n *3291│    /// row's #4-gossiped `recent_projects` head. `None` when unknown (a pre-field\n  3292│    /// remote row / an endpoint with no project history) → the column renders `-`.\n  3293│    /// Carries the DIR (not just the ID) so the render-time disambiguation\n  3294│    /// ([`disambiguate_project_ids`]) can suffix a colliding local ID; a remote head\n      │...\n  3416│        corrupt: false,\n *3417│        // #8: the LATEST project = the #4-gossiped recent_projects head. IDs only cross\n  3418│        // the wire (no dir), so the disambiguation degrades this to the bare ID.\n  3419│        // [impl->REQ-ENDPOINT-LIST-PROJECT-COL]\n *3420│        project_ref: r.recent_projects.first().map(|id| crate::picker::model::ProjectRef {\n  3421│            id: id.clone(),\n  3422│            dir: String::new(),\n  3423│            // IDs only cross the wire (no dir, no URL) → display falls back to the id\n      │...\n 13836│    // [unit->REQ-ENDPOINT-LIST-PROJECT-COL] #8: a REMOTE cell takes its project head\n*13837│    // from the #4-gossiped `recent_projects` (newest) — IDs only, NO dir on the wire; a\n*13838│    // pre-field remote row (empty recent_projects) has no project → the column renders '-'.\n 13839│    #[test]\n*13840│    fn remote_cell_project_ref_from_gossiped_recent_projects() {\n 13841│        use spt_net::net::registry::Status;\n 13842│        let mut row = res_row(\"ep\", \"nodehex\", \"BOX\", Status::Active, 1);\n*13843│        row.recent_projects = vec![\"spt-core\".into(), \"owl\".into()];\n 13844│        let cell = instance_cell_from_resource(&row);\n 13845│        assert_eq!(\n 13846│            cell.project_ref.as_ref().map(|r| r.id.as_str()),\n      │...\n 13850│        assert_eq!(cell.project_ref.as_ref().map(|r| r.dir.as_str()), Some(\"\"), \"no dir on the wire\");\n*13851│        row.recent_projects.clear();\n 13852│        assert!(\n 13853│            instance_cell_from_resource(&row).project_ref.is_none(),\n 13854│            \"pre-field remote row → no project (renders '-')\"\n      │...\n 13901│            adapter: None,\n*13902│            recent_projects: Vec::new(),\n 13903│            controlled: false,\n 13904│        }\n 13905│    }\n      │...\n 17077│                adapter: None,\n*17078│                recent_projects: Vec::new(),\n 17079│                controlled: false,\n 17080│            },\n 17081│        );\n      │...\n 17525│                    adapter: None,\n*17526│                    recent_projects: Vec::new(),\n 17527│                    controlled: false,\n 17528│                },\n 17529│            );\n      │...\n 17605│            adapter: None,\n*17606│            recent_projects: Vec::new(),\n 17607│            controlled: false,\n 17608│        };\n 17609│        let mut reg = SubnetRegistry::new();\n      │...\n 17718│            adapter: None,\n*17719│            recent_projects: Vec::new(),\n 17720│            controlled: false,\n 17721│        };\n 17722│        let now = 1_000_000u64;\n### wansend.rs\n  789│                adapter: None,\n *790│                recent_projects: Vec::new(),\n  791│                controlled: false,\n  792│            },\n  793│        );\n     │...\n  824│                    adapter: None,\n *825│                    recent_projects: Vec::new(),\n  826│                    controlled: false,\n  827│                },\n  828│            );\n     │...\n 1252│                    adapter: None,\n*1253│                    recent_projects: Vec::new(),\n 1254│                    controlled: false,\n 1255│                },\n 1256│            );\n\n### picker/\n#### data.rs\n 773│            adapter: None,\n*774│            recent_projects: Vec::new(),\n 775│            controlled: false,\n 776│        };\n 777│        let mut reg = SubnetRegistry::new();\n    │...\n 821│\n*822│    // [int->REQ-GOSSIP-ADAPTER-PROJECTS]\n 823│    // [int->REQ-SUBNET-DISPLAY-PARITY] the W5 parity end-to-end: a remote node\n 824│    // gossips four endpoints exercising every cross-subnet display state\n 825│    // (bound-free / unbound / controlled / harness-only), loaded through the REAL\n    │...\n 859│            adapter: None,\n*860│            recent_projects: Vec::new(),\n 861│            controlled,\n 862│        };\n 863│        let mut reg = SubnetRegistry::new();\n    │...\n 876│            adapter: Some(\"claude-spt:doyle\".to_string()),\n*877│            recent_projects: vec![\"spt-core\".to_string(), \"owl\".to_string()],\n 878│            ..inst(true, None, false, true)\n 879│        };\n 880│        reg.merge_instance(\"locctlep\", locctl);\n    │...\n 949│            adapter: None,\n*950│            recent_projects: Vec::new(),\n 951│            controlled: false,\n 952│        };\n 953│        // The SAME endpoint on the SAME machine, gossiped in BOTH subnets — but cold\n#### model.rs\n  586│            is_local: false,\n *587│            // #4 (REQ-GOSSIP-ADAPTER-PROJECTS): the REAL gossiped adapter — not the\n  588│            // resources blurb, which used to masquerade as the harness here. `None`\n  589│            // (a pre-field remote row) renders empty → the pane shows `-`.\n *590│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n  591│            adapter_profile: row.adapter.clone().unwrap_or_default(),\n  592│            // #4: real gossiped project history (IDs only; dirs never cross the wire),\n  593│            // no longer a hardcoded empty. Empty on a pre-field remote row.\n *594│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\n *595│            project_history: row.recent_projects.clone(),\n *596│            // Remote rows still carry no project DIRS — recent_projects gossips IDs\n  597│            // only (dirs are local-only, for #5's Choose-project launch-into-dir).\n  598│            project_refs: Vec::new(),\n  599│            description: row.resources.clone().unwrap_or_default(),\n     │...\n  605│            // reopening the #3 hole. `driven_by` stays the separate WHO pin.\n *606│            // [impl->REQ-GOSSIP-ADAPTER-PROJECTS] [impl->REQ-PICKER-CONTROLLED-LOCAL]\n  607│            controlled: row.controlled,\n  608│            driven_by,\n  609│            viewer_count: 0,\n     │...\n 1918│\n*1919│    // [unit->REQ-GOSSIP-ADAPTER-PROJECTS] #4: from_resource_row stops FAKING remote\n 1920│    // rows. The real gossiped adapter fills `adapter_profile` (NOT the resources blurb,\n*1921│    // which used to masquerade as the harness); `recent_projects` fills\n 1922│    // `project_history`; `controlled` is read VERBATIM (NOT `driven_by.is_some()`, which\n 1923│    // undercounts the local-controller case). A pre-field N-1 row degrades clean.\n 1924│    #[test]\n     │...\n 1938│            adapter: adapter.map(str::to_string),\n*1939│            recent_projects: projects.iter().map(|s| s.to_string()).collect(),\n 1940│            controlled,\n 1941│        };\n 1942│"},"isError":false,"timestamp":1784293624443}}
{"type":"message","id":"04d28e8b","parentId":"6789a64e","timestamp":"2026-07-17T13:07:15.177Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Investigating CPU workload relocation**"},{"type":"toolCall","id":"call_30HfdW8cOfwVkf8hVBh94wBd|fc_04b15dc90dfe1c93016a5a2901cf448195a7d1535a68868865","name":"read","arguments":{"i":"Reading v037 CPU release claims","path":"CHANGELOG.md","selector":"1-85"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":17056,"output":134,"cacheRead":70144,"cacheWrite":0,"totalTokens":87334,"reasoningTokens":98,"cost":{"input":0.08528000000000001,"output":0.00402,"cacheRead":0.035072,"cacheWrite":0,"total":0.12437200000000001}},"stopReason":"toolUse","timestamp":1784293624488,"responseId":"resp_04b15dc90dfe1c93016a5a28f8e91481959c5277b7453a2056","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_04b15dc90dfe1c93016a5a28fdefa88195a47ab87511732712","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWikBCgYlWujPAKlvqIk3nYZfGdA3Hv6_aATKmPe8p-Jw6kDYVNOk4pEBQ3Z7DQYAzh7PEkZf8KPp74lmZKGrfflWIWUomQm80DSKcbgNkeq8YiW0MX_ljpd9GI5ny8rSBgEZxWKbjBJhdXz4tpeO1czjoQtvOVxMsmBkJs-DXe3bjfUTPTfQ_hJJblsLAkOfMfng6O_BHF0a0dZsqPZ8_BEzN6lGo4SdrKe4ahmxakXISrON5TE8NIBM3oARy9flsSm-43NcJ-_NSWHdrkXRreWI45SQn7ossip3pGL33S-W_Kw0HiJewBK2fxQQF6pFChG8k8DX2ygOql4YdpFJZdYtTRtHYzVEPOQP3pO1XZfMizzJljgYBIqXpA8ITCqGumZKmmPk0l511cy5x83IItj3YkPsZzD9EkZonfATsSvAocNinov_xZ4p3c7fc7CLQFOOIf0m6z1EbVGVb9jInzLzTA__TmnLyCilrigAjpz5fEOVKMZl_hZX00wx6gqDKa-AC9ypVr6ANax-kbvEK2slbxOn-wFocQhEWlOnS0hs60JHZS9zGkF9Teezj3xbo9v5Sprj-lE6jLWFTg00OfGqZYBHKcYS5H3GPINyPn73H4xMVhYog5BjLNcF_0pYx8NE3kxaIfJEHjxY7-whGiJql48tlsZDJZhW0J7cvnyK2c4b-o4Gi7zK4PvQihMyAYvq2ruKXQXlTkDm94Cwp0OFkSaZQ6um3w6uBe-pRscNXhgSlGh_jm4wbXkaElsc2beP31g50lMduIIeRmgwujgh6Z4OZjHpef5e2VdYqlSdggL22NJ32nsLu7bPQ19aINAKR9tvIkZdYwsOc91mFcTQxcOMG9zpR6Kbh1KbOSo3JVIv-WaMKqKbXJ_TsGXGuYKQ6TsRF43xP5c3_nozm5wX0VQs-FTSM7P-6lSIGdDsCXSdRLU3k8IN14c6NJS6b-cLd7Lo_fToQiZbRlZT2wDxX-D-Cq1X2bDu6HN7tXmlvxCjVOEXpnXtxNikjBKSJpZd9sTqiRhUvBep8cFSCHLLeoLeoqTt16sb7ofsiSvsU4Tg04KyS7nUr0GtIcyhNl0TakHHdWr5bQY3DrrPG6UFINZZXGofD6Pwjrem9ZB_D-jniUwlr8v-jNwbV2fbh1oYfiewUKjyGlhL6vpVVqFDg9NnODqZa0WtCB5k3cVW73eEo3ipvHfzCan_IsiQ51PwUxAM1UjZWyUde2B7H0jfId2kVD5fQHEzfdi8FL9SJOdiI2XAQK6A8csiJUTTwTQ6VK1U6YMbjsmMmS8SPEsywfh8vsWtyI23XvMTIqA-xYkSty1tbXpy8wYN8I6s-uxH4ePRj5OQm8_iKLkq5EM7OkIsJN5492Mur6QsP-qfX23ZXi0_NarMpcOWkDnizcP9","summary":[{"type":"summary_text","text":"**Investigating CPU workload relocation**"}]},{"id":"fc_04b15dc90dfe1c93016a5a2901cf448195a7d1535a68868865","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading v037 CPU release claims\",\"path\":\"CHANGELOG.md\",\"selector\":\"1-85\"}","call_id":"call_30HfdW8cOfwVkf8hVBh94wBd","name":"read"}]},"duration":10688.429000005126,"ttft":5463.698500007391,"contextSnapshot":{"promptTokens":87200,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_30HfdW8cOfwVkf8hVBh94wBd|fc_04b15dc90dfe1c93016a5a2901cf448195a7d1535a68868865","toolName":"read","startedAt":"2026-07-17T13:07:15.177Z","args":{"path":"CHANGELOG.md"},"intent":"Reading v037 CPU release claims"},"id":"0d2ce70c","parentId":"04d28e8b","timestamp":"2026-07-17T13:07:15.177Z"}
{"type":"message","id":"f79b5b5e","parentId":"0d2ce70c","timestamp":"2026-07-17T13:07:15.202Z","message":{"role":"toolResult","toolCallId":"call_30HfdW8cOfwVkf8hVBh94wBd|fc_04b15dc90dfe1c93016a5a2901cf448195a7d1535a68868865","toolName":"read","content":[{"type":"text","text":"# Changelog\n\nAll notable **user-facing** changes to `spt` — what a person running the CLI\nnotices or does differently. The `## [<version>]` section of each release\nbecomes that release's GitHub Release notes verbatim (see\n`docs/RELEASE-RUNBOOK.md`). This project follows\n[Keep a Changelog](https://keepachangelog.com) and semantic versioning\n(pre-1.0: breaking changes bump the minor).\n\n## [Unreleased]\n\n## [0.37.0] - 2026-07-17\n\nA stability and lifecycle release. It ends the steady background CPU use on every\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\ncontrolling endpoints behave predictably.\n\n### Changed\n\n- `spt endpoint run` no longer silently reattaches to a running session. When a\n  live session already exists for the endpoint, it now stops with\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\n  existing one. Attach to the running session with `spt rc <id>`, or pass\n  `--resume` to resume it.\n\n### Fixed\n\n- Nodes no longer use steady background CPU while idle. The daemon was\n  re-verifying its own program file about twice a second; it now does so once at\n  startup.\n\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\n  could keep re-applying old peer-directory updates; each update is now applied\n  once and completed transfers are discarded immediately. This also ends the slow\n  thread and memory growth that built up on long-lived connections.\n\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\n  reporting CONTROLLED. The state is released even if the daemon restarts.\n\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\n  stale ONLINE entries left by dead processes now clear on their own.\n\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\n  genuinely dead leftover is cleaned up and the restart proceeds.\n\n### Internal\n\n- Improved daemon diagnostics — named threads and stream/seat gauges.\n\n## [0.36.0] - 2026-07-16\n\nA stability release for attached sessions. A daemon update no longer disrupts\nactive sessions, and a session stuck by a bad connection now recovers on its own.\n\n### Fixed\n\n- Attached sessions no longer freeze after a daemon update or refresh.\n  Previously, a single bad viewer connection could hang an attached session for\n  up to a minute; a stuck viewer can no longer freeze other sessions.\n\n- Improved the stability of controlled sessions across a daemon restart.\n  Previously, session controllers could mix up and drop their attached sessions.\n\n- A session left stuck by a bad connection now recovers on reconnect, instead of\n  staying unresponsive.\n\n### Internal\n\n- Improved logging granularity for attached endpoints.\n\n## [0.35.0] - 2026-07-16\n\nA subnet resilience and visibility release. A node that briefly cannot reach a\npeer no longer isolates itself, and node status now shows whether your peers are\nactually reachable.\n\n### Added\n\n- **Peer reachability in `spt daemon status` and `spt subnet status`.** Both now\n  report how your node is really doing on its subnets: how many peers are\n  currently reachable, when a peer was last reached successfully, and when the\n  node last accepted a registry update from the subnet. When every peer is\n  unreachable the status reads **DEGRADED** and names the stage that is failing,\n  instead of staying green while the node is cut off. Dial failures in the daemon\n  log now carry the failing stage and a timestamp.\n\n### Fixed\n…\n\n…\nFirst public release of `spt`.\n\n[Showing lines 1-88 of 1186. Use :89 to continue]"}],"details":{"truncation":{"content":"# Changelog\r\n\r\nAll notable **user-facing** changes to `spt` — what a person running the CLI\r\nnotices or does differently. The `## [<version>]` section of each release\r\nbecomes that release's GitHub Release notes verbatim (see\r\n`docs/RELEASE-RUNBOOK.md`). This project follows\r\n[Keep a Changelog](https://keepachangelog.com) and semantic versioning\r\n(pre-1.0: breaking changes bump the minor).\r\n\r\n## [Unreleased]\r\n\r\n## [0.37.0] - 2026-07-17\r\n\r\nA stability and lifecycle release. It ends the steady background CPU use on every\r\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\r\ncontrolling endpoints behave predictably.\r\n\r\n### Changed\r\n\r\n- `spt endpoint run` no longer silently reattaches to a running session. When a\r\n  live session already exists for the endpoint, it now stops with\r\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\r\n  existing one. Attach to the running session with `spt rc <id>`, or pass\r\n  `--resume` to resume it.\r\n\r\n### Fixed\r\n\r\n- Nodes no longer use steady background CPU while idle. The daemon was\r\n  re-verifying its own program file about twice a second; it now does so once at\r\n  startup.\r\n\r\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\r\n  could keep re-applying old peer-directory updates; each update is now applied\r\n  once and completed transfers are discarded immediately. This also ends the slow\r\n  thread and memory growth that built up on long-lived connections.\r\n\r\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\r\n  reporting CONTROLLED. The state is released even if the daemon restarts.\r\n\r\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\r\n  stale ONLINE entries left by dead processes now clear on their own.\r\n\r\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\r\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\r\n  genuinely dead leftover is cleaned up and the restart proceeds.\r\n\r\n### Internal\r\n\r\n- Improved daemon diagnostics — named threads and stream/seat gauges.\r\n\r\n## [0.36.0] - 2026-07-16\r\n\r\nA stability release for attached sessions. A daemon update no longer disrupts\r\nactive sessions, and a session stuck by a bad connection now recovers on its own.\r\n\r\n### Fixed\r\n\r\n- Attached sessions no longer freeze after a daemon update or refresh.\r\n  Previously, a single bad viewer connection could hang an attached session for\r\n  up to a minute; a stuck viewer can no longer freeze other sessions.\r\n\r\n- Improved the stability of controlled sessions across a daemon restart.\r\n  Previously, session controllers could mix up and drop their attached sessions.\r\n\r\n- A session left stuck by a bad connection now recovers on reconnect, instead of\r\n  staying unresponsive.\r\n\r\n### Internal\r\n\r\n- Improved logging granularity for attached endpoints.\r\n\r\n## [0.35.0] - 2026-07-16\r\n\r\nA subnet resilience and visibility release. A node that briefly cannot reach a\r\npeer no longer isolates itself, and node status now shows whether your peers are\r\nactually reachable.\r\n\r\n### Added\r\n\r\n- **Peer reachability in `spt daemon status` and `spt subnet status`.** Both now\r\n  report how your node is really doing on its subnets: how many peers are\r\n  currently reachable, when a peer was last reached successfully, and when the\r\n  node last accepted a registry update from the subnet. When every peer is\r\n  unreachable the status reads **DEGRADED** and names the stage that is failing,\r\n  instead of staying green while the node is cut off. Dial failures in the daemon\r\n  log now carry the failing stage and a timestamp.\r\n\r\n### Fixed\r","truncated":true,"truncatedBy":"lines","totalLines":1186,"totalBytes":3669,"outputLines":88,"outputBytes":3669,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"# Changelog\r\n\r\nAll notable **user-facing** changes to `spt` — what a person running the CLI\r\nnotices or does differently. The `## [<version>]` section of each release\r\nbecomes that release's GitHub Release notes verbatim (see\r\n`docs/RELEASE-RUNBOOK.md`). This project follows\r\n[Keep a Changelog](https://keepachangelog.com) and semantic versioning\r\n(pre-1.0: breaking changes bump the minor).\r\n\r\n## [Unreleased]\r\n\r\n## [0.37.0] - 2026-07-17\r\n\r\nA stability and lifecycle release. It ends the steady background CPU use on every\r\nnode, stops attached endpoints from stalling, and makes stopping, starting, and\r\ncontrolling endpoints behave predictably.\r\n\r\n### Changed\r\n\r\n- `spt endpoint run` no longer silently reattaches to a running session. When a\r\n  live session already exists for the endpoint, it now stops with\r\n  `ENDPOINT_CREATE_CONFLICT` and a non-zero exit instead of quietly joining the\r\n  existing one. Attach to the running session with `spt rc <id>`, or pass\r\n  `--resume` to resume it.\r\n\r\n### Fixed\r\n\r\n- Nodes no longer use steady background CPU while idle. The daemon was\r\n  re-verifying its own program file about twice a second; it now does so once at\r\n  startup.\r\n\r\n- Attached endpoints no longer freeze for 15–25 seconds at a time. The daemon\r\n  could keep re-applying old peer-directory updates; each update is now applied\r\n  once and completed transfers are discarded immediately. This also ends the slow\r\n  thread and memory growth that built up on long-lived connections.\r\n\r\n- Closing a remote-control window abruptly no longer leaves an endpoint stuck\r\n  reporting CONTROLLED. The state is released even if the daemon restarts.\r\n\r\n- Stopped or crashed endpoints no longer resurrect themselves in a wake loop, and\r\n  stale ONLINE entries left by dead processes now clear on their own.\r\n\r\n- Stopping and restarting an endpoint no longer wedges on a leftover session.\r\n  `run`, `list`, and `shutdown` now agree on whether an endpoint is live; a\r\n  genuinely dead leftover is cleaned up and the restart proceeds.\r\n\r\n### Internal\r\n\r\n- Improved daemon diagnostics — named threads and stream/seat gauges.\r\n\r\n## [0.36.0] - 2026-07-16\r\n\r\nA stability release for attached sessions. A daemon update no longer disrupts\r\nactive sessions, and a session stuck by a bad connection now recovers on its own.\r\n\r\n### Fixed\r\n\r\n- Attached sessions no longer freeze after a daemon update or refresh.\r\n  Previously, a single bad viewer connection could hang an attached session for\r\n  up to a minute; a stuck viewer can no longer freeze other sessions.\r\n\r\n- Improved the stability of controlled sessions across a daemon restart.\r\n  Previously, session controllers could mix up and drop their attached sessions.\r\n\r\n- A session left stuck by a bad connection now recovers on reconnect, instead of\r\n  staying unresponsive.\r\n\r\n### Internal\r\n\r\n- Improved logging granularity for attached endpoints.\r\n\r\n## [0.35.0] - 2026-07-16\r\n\r\nA subnet resilience and visibility release. A node that briefly cannot reach a\r\npeer no longer isolates itself, and node status now shows whether your peers are\r\nactually reachable.\r\n\r\n### Added\r\n\r\n- **Peer reachability in `spt daemon status` and `spt subnet status`.** Both now\r\n  report how your node is really doing on its subnets: how many peers are\r\n  currently reachable, when a peer was last reached successfully, and when the\r\n  node last accepted a registry update from the subnet. When every peer is\r\n  unreachable the status reads **DEGRADED** and names the stage that is failing,\r\n  instead of staying green while the node is cut off. Dial failures in the daemon\r\n  log now carry the failing stage and a timestamp.\r\n\r\n### Fixed\r\n…\n\n…\nFirst public release of `spt`.","startLine":1,"lineNumbers":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,null,102,null,1185]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\CHANGELOG.md"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":1186,"totalBytes":3669,"outputLines":88,"outputBytes":3669,"shownRange":{"start":1,"end":88},"nextOffset":89}}},"isError":false,"timestamp":1784293635201}}
{"type":"message","id":"0d2bf30b","parentId":"f79b5b5e","timestamp":"2026-07-17T13:07:51.852Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Assessing idle CPU burst classification**\n\n**Analyzing residual CPU bursts after selfhash fix**\n\n**Confirming CPU cluster timing intervals**"},{"type":"thinking","thinking":"**Analyzing registry and CPU burst timing correlations**\n\n**Investigating dispatcher polling as CPU baseline source**"},{"type":"toolCall","id":"call_iIjgmDJnMSIyN2JmmjyBLpWH|fc_04b15dc90dfe1c93016a5a292695c0819585a8c356df4e74a3","name":"read","arguments":{"i":"Reading dispatcher cadence","path":"crates/spt-daemon/src/dispatch.rs","selector":"500-560,665-684"}},{"type":"toolCall","id":"call_gisYBETntC4YK4nInhJkXsPB|fc_04b15dc90dfe1c93016a5a292695d481959881161f7d4d748c","name":"read","arguments":{"i":"Reading registry worker cadence","path":"crates/spt-daemon/src/pump/registry.rs","selector":"130-175"}},{"type":"toolCall","id":"call_kcameIlYt9WmjyxoWplWjDyR|fc_04b15dc90dfe1c93016a5a292695dc81959d76d496ce700b32","name":"read","arguments":{"i":"Reading recent project resolver","path":"crates/spt-daemon/src/registryhost.rs","selector":"975-1012"}},{"type":"toolCall","id":"call_FCV9oxIEniJrbaB13FYnMtar|fc_04b15dc90dfe1c93016a5a292695e48195abf9eec435bdef4b","name":"read","arguments":{"i":"Reading project resolver subprocess","path":"crates/spt-store/src/project.rs","selector":"18-75,95-140"}},{"type":"toolCall","id":"call_myLOXMONx0qK9n6aQXwvpdFi|fc_04b15dc90dfe1c93016a5a292695e88195a727740d053ead6f","name":"read","arguments":{"i":"Reading current pump log anchors","path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","selector":"1014-1020,1248-1258,1418-1428,1605-1614"}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":8829,"output":1097,"cacheRead":79360,"cacheWrite":0,"totalTokens":89286,"reasoningTokens":861,"cost":{"input":0.044145000000000004,"output":0.03291,"cacheRead":0.03968,"cacheWrite":0,"total":0.116735}},"stopReason":"toolUse","timestamp":1784293635249,"responseId":"resp_04b15dc90dfe1c93016a5a2903cf508195a62bf835c3f06504","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_04b15dc90dfe1c93016a5a2906a73881958f568a7c4aa1d864","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWikYLh-qgqRqwsEdrUZ6PTAyQ9DnhnmIq74ZVzXbwKziFptovoHapDn9Y01oPHelV6LCuXSB8N5Pi0h9TTEbIRuuws1B3YpCLNihF36xYBr-44yXehH8FTST-oMrcEDiyQS3T6TwJ7XBlNfCnKy1bgR4mJbu--gfc8qlNG7F--dydnn0EF0YKzPL3NctPu0CXpFlhF-YWH1BR6RmKRuoINe_up11AbNeMDhC7XentZXXiNiMMJTN_mgOvs8xcXrLTl5NYFbh--v8eHa86aUuec4jizZNA0JHRIC_5USU4muelyyJ0VoC9tDNuBYoxdhYdbY9c4kLE1aOnMQn_KMIkb1QmJvfIZxVvFTJNIBb_0PIvbibUa7jHTLySF3TrbIFNPwHrdBhSB74ItegHBKZjaWV8Cnibsw8dunJHlpsaUTbac-ZTfsGS6OwkcRBcWOBftrboAXsmhscJGT6P0aJAcN9K-KYedvIdGRH8Lcm6PpnOCCwfrvewQwMqzmWsW5SseMT3lRFy4cYXBbCwn7eX1fUQY5OeTywIIc6Ynl5IR4pzyVjSWxAqP_fsB3Sf2NQbSzO1D5bPVt8GW92qWL0ZVPx01t2nNm6XVXC7fgwB2ECrgixzPnV-JX45jLzUlJRv1fdcUKG6qUuV_qn1f6h-0pY7WVNkFEaFyYrmWpFbPYGSf2Q_tHNoMxwhvJF6wKfrJyy-hNvxRtUqmi8gBQO0cqXWwl7dIgu1C8GZjs9JEvarLUugEXAwD5sUciQ1DOSjgJd5wJoDJCv7WyLugLRCoYxLOXEjICg4c4IqUPd3cSoSE5GVObRp2dHC0tR2VmrsDh0UnbyAL7SOitvxQVaYJ8df4LMQdiDBZur90TeRSBhomf6XJ4FX4BVFdnF-vDHpYlrtHLowja1oJITeimoWPXMMaVbxAUDcPr7KzCOoCCXqUAIl_G7xFP44tvRKgGsvR1lIu859aHtUgh0B-Y9pJyRs-EymkVf_MXhmXwTwIawRWi67T8u9QkDEZC1yoQ65tUSYKqf0D--tqTdZe0Y40FrNGclaGvJ9xVhCv5cP8FBZCOJ9dawPPMuEQ0ZNPBQ22ArmO1OhXak5kM5tS7kYnN0RlOSKVfQ6z4W6mvU02EUmUVZTrVcDsrck2YBaJoc-sognoPZgBe-7pllp-my8CeSVLDjkopW0RIb7CR8qrtknLBu_gnYeg3CnPXxEbg1zZ-mPEuHFouv7c0VTCCCcz-0s1Ru5c1iTzlAQc7M_8pBVtbSEULbIcifeiHQ0t8-XHUDskQVXGb6JLX8j5v7iJgB_OkeTCYLDqaQUkG1q2EoZ5p1ZFLjjjVIGo9Y-QJrtYsebt8kTxOzzqpw-JYWpxNM15BzMFo_FLd5IPWAEgwSNCUialXfgLr-kiM0Mmnim1japX5GccFMxtbgoAZ9-Tc9NDJpoWcrLkhNfU7dmb5XRAPAE4iY0ncfox9a8kH09gvDhZ5_xYy-AtWG8cAMo8RyskurgOcgULBwJfvW1_xhk18evOZsOnQ_p5KFkvr6ZqqZKZxPZOf3H84Oxnx6wFftpoFvRzI4ilbNb6hYZGWMrKryPY-_7JBEgCVvyaaP86DJEi8NJNWYJlckxG_x002cC_VONbj3pwf9Fv34zrN1-W_lsl57QWXKH8pdSXSOdeGD_fq6tkEvGYmd57ntQsk1_Ex4PJbfI85Nxcp4l7HEPkEo_mPlar21mDw9X0cOU7rlceWyJFut7txTc_p7OoH7pmW7JHeev7UxPfEpRP14ALP5wU4rXUjjVDAAC9cb1pgQTgO0vJRBgVVHJaNs-ERsNR56sLBr2tymT4Z3Cet26rfeULvSNRYQtC7Gd6m2drO7lSan1PLNgtqVB0-zpNEJFb7jKXerrEejGt9pd78JjVUq0JpMisGe3fnC76x0Ii3V8-XiH_5iFyKob7yYXoKnNPgT0A9ozWXDaos8XDO5Z6cwnjpaDd_FcTCjFiyBcGHBzs23n-0tk9UNEjJW8nJFVHrMZwREuOfhcBmrrt0h72BguT9EdrBIaqODVE6Ka0MY9CTpWEBsbihjv990-duqgFenVSMAUgDEsUrPGsKLk7wjZ5smHlwdaRnxG2CFqY7TRtGzr6DXIZL7H5V01M9rYWGEQt_tCnPFVKCSvENjxiR6Ehe8qgGu5nu8MzsnPD7lvCxDztGTQRrCxPa3uAZ8gIHGmjyraMUQNwRwPpBpHRZ2jfyvRV49iZqKX_x8K6uI7sH8p8YbSxjMclb7tEnNYUxXmdgXGVTyXhDCv5PzLvLiQ_XmdtcFVZbLlCpWdmelhmwNAP7gxvCQkAaHeKzNjZeAZKBV9sM9f1t7J2VrmUh3Hh6a3c_4fOWpO4457xbgSiinf-wzdha_dyrEpwPne7Sm90CV7I23N40ku3eJtWPQfxX2_2Eyv7vD6E-eN1QwaV0Cwtp2oZDsrd41cYbu3zYKK5ThZjykCzWa2nhWqZ0_WAF7u0Y7rFZ9RRnDgDAeJgR3f2UygmahYpALvWfmFxhd0Xm1MKHEccZ2X0Rs0GyK-4vE3zrdPQRO8mWI5Dl_YZrtQGkShs6nVrVB2AMf_rCjUmLC5qHZjTVLv2pK86woWOIfcWi12bZM4srhzSZq_6W3qYlNx9iduJvRkWY4NE629dcWtOoG4sPVRmcyil14L4VFvbpQx45p8OTrTps3ti_HaA6ZctO9rTEN1LrEwnI2yGYCnpTVFwJKLXXp_uAf6E2iEG-jyludA3nYd3XDeUtUA-V8Hftv2Ss-6UpuBXBfmQd3B4QfcTVSRT0sYFCzQcvPcZNWHFGDwp5KAo82tGbreQnHQsOD_fh0RZufxWtgoNwbsdNwprZE8eN43VJu5Cjvwm8oNYO2S5ByjNs1gKWBlOkqb5mTFd71fvOOBMNKRtiOsO_8heFqFkAkRDxcS7UOuXhhGyM7v3WtH-5xoquboxN0tClDLpOqV0zmWogo13KHzy8kZPunvgcqRrr5iHp0XSINRtxz6SLn-7a0cI34molbVFgUOaYpyf1oddQ77KiSX3nsQnrha6i0NuUJNrc6ErWdEktFelEd1ITJFGTO54W8MxRGj0rc7-PNi8JnbGWSixviqFHz99b5ees3RUpECApy320tLt2dAQPIJZ273y7DiCOA8V16MIeN3Y-wkRXnFA8YpxV79YxP_VSIHn2BD__sczzZt2SOp3boyStfdhOJ8UTMAVFAdCvAhJY6C8D_D0cHfEVRJjOGge0nPk7-yZX5fc8IRmim97KxOAT4nTVsccnj5sOITsvugzGAlMqqmRM4StutTvjOGBxlcCKQY7uUhFJrXk396aHOqDHvThhmlDT3BhugwekgNFqMh_FeW1DWP4jKvzjHStbjeX1Db5PSjRjvlRlYAVe6OH42r7Dfo5iBhEtyIz4hFEypmY7F0UE0RQMwKlSl94OypqmuBLtHhFesdn-b_PIFQ0PdCgfxa6skVSrMLU9mjdH8QLqf8GM0CTTg23j9nJfC68GrH2Nu30WmkeeF_83zRNKUGX4jOYZfxvDbLgxpuylVM3Of7IHJKQybU_aUG-2iUexTn8hnGw01lhhtqaqqWLVOXE1YPWyCc13XdChFu5MAhGEsOdEQvapjW2_Y2a96NUOI1zETXyj98iPmnOx413e_DIJIW8ezYyVkpDnHtUVvwrgUIPSMpNdCU7F6G7PJ-e7q4Qfw1Yqk0nueBDYJ22pkCge8EnWst52x6EySkLoJHFybcJzZI7xrNNbjYYwovyBdywt8RsMBjNMiB05aqtQzqEWqCLbWsk0dDzJ-ifl4qRGO3IBWDc_YQq2KPaLOSHWD8bHsYVmY5PTeWFemNq4cSfDXMRnl0vpNFS1F2Qedh0MSAzMhh37oyWonJ8fuEYTwQ36TvKfNH7jGhhmOe09alnXTL9w3owNMLD6uvEvoEVLvXRg6dAb2a6oXEBUG-R5qemD4-9_0hHp86vRu","summary":[{"type":"summary_text","text":"**Assessing idle CPU burst classification**"},{"type":"summary_text","text":"**Analyzing residual CPU bursts after selfhash fix**"},{"type":"summary_text","text":"**Confirming CPU cluster timing intervals**"}]},{"id":"rs_04b15dc90dfe1c93016a5a29187a3c8195a88ce1bad337cb38","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWikmlRnngFjj20YR1HBGfPZs01eGQtt-uRmTux-Erly6ftXfOPVmH4glT-7SoZjhmmbvyeZ5Vv1oIn08bW4J5C6df1xSkppUOzZuu5U9ugvJdUf_O4jvtIhgT6xMtHAwIU5n_kjvbfedsMVJ-WFd2OhkZbNlnBxmIclaVPjERkV7kKNCghmryEN8huTD57MbDtBhgWjK1bOgBb1IXKTtIMb8vyfdo7IMU8ovZVvZ4GvjOtg4TOzTCU1nkphe_PE8Bka5fbb-Z2Y0Q9pW7qthwjYKUA0HdGl66oqJZdn2iaVyCQo293vtifYYhDRITBlQSF4IV44mERyV1L-uUTenJ9gJtuWkntPWMgErOVoNTBpxLkQYqXstIQ3fvSzIRC5KIpP7OhZVZEAIj3wfepqgQ7dTnag5JDHo1TRcOAz_xOiqLqaP8fjfMsSw_Ma-zo5MX2LnwAqvmDTuxQOS3X5SwojF9bXzW2Z-BP-8LYQ-6K_2CePuRasdBwV9kawZirYPULjsJQ1J_vKSjomYNpS0fE8W_ZhnO4IkMNiH2PO56nrSa3NYWUi119Qy6I0mv-dcTX_FVMcqC8PQRZQ7FYDxRG1pzQDe2kEHRmUdHtHdT7FvUmB1uJCe8rfdarDUFvrrZ9Hyl7GkfHfKR0Wj1hYXZgXoy4Q8e7iHLWIz9glL6hKJK1r-kDpKK3gfhlCCiPh2F4sZMvH32j23ChvhR7C4IRagPPa2sd3Zxd79b7j_5hjAJt8jb98KdLkIkBl2JHZ_U9aU9WLD5oY1OSP9FR_wKjswHhyb33-56g_zaCSWfvUdOBK73pxER97E4Jq4G6KdMlwTC3ZFeQ8OIOcivFufU9pY9njcRtzqHDFa-2HOz0JC1lLBBuhw78hKEgVzd7FRulMOsL56MxeDm0yXeAkZLk6a5jLPgY7nqI-DSrA4ov9WNKet51wUXvMq74SxSVPW07HH3urX9i88hYV8Axlow4LXsZxDAXA711Scww-VRrrhzBdsWCLCVpnsTPb1qBtnBwJFxp2rxQpTh4EZSKvGKT8hvsPQtprzbLkNCV6GGZ74bOU_PxaUFQKgSX2x5CrPd65Sk6mNQthgll1esI1Gix3gEbnnCsYo5ExxMPx9SjRFfRS-IwR2IoPRytrI-iMJx2PKLz8aBu5BrVS-Xeb5wkHVsn4yjCnLD9TGtTAbhp8NzCmHIUmiLm7ISjHShgdZI-MAxBZTa-JVGoLhycFk5yniWpxFt6lPvUQ-34k4vXyUtw64dr8ryQ8pp39OawKySyAE-ItQblFBXXxKkkL7C7EFbi30s6HHOvTPN-KwtvIsoiNAiBPdR2Lucu41j4wWYo67O709ElVWd0ZIvrpSmSrhArJjWN_YCx4s10KUeKV5HLI8JYdNAZtYkmH2Riv8RypQ2e6_QZver-d-_DhatVS7WiV_GIFl9le2_M6QQpyH_tGoczKo7GiF0vQ30KrDowH7xQ2O5ANpUeTlHHWqZx2mFP0YkGY7QB61ykJV9h4PgWJkeALrLGcBtN1cyTEXxWYhzR1NhhY7Y5CO7fndiTLC1jchIILWzOFVZkd8jITHlJe0qIbhdshz4mFFrbk71ySKF2AsM8zf1xHH8kgEW7RVTZ0WN32-ThaARUivlmwsCLYl576lQwbUxSVx7OO_WQg7jxTuLE7oJsP7Fp2QQrtI9CWeNB6bfOB18ODeAD0aj6TIesJemZ53rkt0n-uXsiAm4Ky4yebn8fQ6rfIr6Aq-_lmm6zI0YJ1G76ks6yHUT0BNMn195DRJbUydu34ArFGn9erqzhRYD12inxeIOwxDJSju3chdSJlqThTFuFycIHvuq6wrTbJZLxRVaue9cRX2mIfa8KBgarWTGQwQJpCzFpruFDcbF0qht-l-exZmVNnDsRtPSCjY3bbnN-6IV_PQ-l1aTTZ9z7VNK5Zz7Q9p5CLrP-byNqW2L98Vip6eMcEIIfoPJTcGaKQIX1Rmx7gc2kmoyWBi0Q-JPQI-byiiO8C_UVzpeWw0pxfjc5JjKmNtvrLUfQ1Hxlozw1vWBkCVaVU4sIVlCMXxlfNJRRjBAkb34_Rnz_24eAI40w26scS_Ub3QH1AfZDFaxZ1-5LI-BOMLv_v-FDcdDFztpzRYPNu4BklHvC7bGxvIXrDfEJ9U0UvYdc-hZdsQuisMgZgn4aRA0IG9UTVOSA_qrdz35HHazEOiM9VzVguqmESTjNVOCs5uXJssAUSjFoSPEqFEXh7Z-gjaGMX3XSm_oKqWz_t_RjVMo-_ninayPeBmE3XB21N7Mvoh_kaEUOrTD-Vrwl5Iw4tjsKOuVMRAKeWKWDMfvmyC9VxORxOGRcDUziPgZ1c9fANS2CaA0hoUxWEGBzAvqqZd8q2cYf4FJnzoWmYazBVqpGA30RkXH7EUkmRK53AarQesxr4d36d3XsSAX7nU8HV9BXyLNe9zBnGyDqf9ncJB5viztYl8oKNSco8R5xbUoS4AkrlAWSCIDj0xeyes2xod6wfyAzkZrpabvTd55q7CjLVGbwEePsOCtfQvmJ8PqM5vTs1tZTSBxzORQxVrD8Bl3fXFBQtUPUw5En6vIyiWbLSS2l_EvvTHiyrJegjpBcIo926wrpjUZGiwl_ot9fVXyqFjdvarJqGw4sQJWaCeKzuBvlmReB7GBeREnWv2STN90MowbGloZAdeZ8bCw_1arL6c7JaLL3Emh6XDh-0Jy9mRs3DSODSwiBRzYDzxs6V9ItT1gT7h66W75EYsW-GqIjEy0CzpvU2dZzoD4pRnSA6Bw2pApbuTylnCVLWz63yxh6PlpYVhIMBtRrTcM5e2bujdWEPuhRqVOmNA3omPFuM-kYxvPrFX6KQfTMBj1F-Z0nHyx3_u1cSUm1867a18K7kAk3pSd6tyCZW04KuTG6MCQyIxYDweM1Xw1QQNoZPJ-GESzsEb4vKi","summary":[{"type":"summary_text","text":"**Analyzing registry and CPU burst timing correlations**"},{"type":"summary_text","text":"**Investigating dispatcher polling as CPU baseline source**"}]},{"id":"fc_04b15dc90dfe1c93016a5a292695c0819585a8c356df4e74a3","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading dispatcher cadence\",\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"selector\":\"500-560,665-684\"}","call_id":"call_iIjgmDJnMSIyN2JmmjyBLpWH","name":"read"},{"id":"fc_04b15dc90dfe1c93016a5a292695d481959881161f7d4d748c","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading registry worker cadence\",\"path\":\"crates/spt-daemon/src/pump/registry.rs\",\"selector\":\"130-175\"}","call_id":"call_gisYBETntC4YK4nInhJkXsPB","name":"read"},{"id":"fc_04b15dc90dfe1c93016a5a292695dc81959d76d496ce700b32","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading recent project resolver\",\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"selector\":\"975-1012\"}","call_id":"call_kcameIlYt9WmjyxoWplWjDyR","name":"read"},{"id":"fc_04b15dc90dfe1c93016a5a292695e48195abf9eec435bdef4b","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading project resolver subprocess\",\"path\":\"crates/spt-store/src/project.rs\",\"selector\":\"18-75,95-140\"}","call_id":"call_FCV9oxIEniJrbaB13FYnMtar","name":"read"},{"id":"fc_04b15dc90dfe1c93016a5a292695e88195a727740d053ead6f","type":"function_call","status":"completed","arguments":"{\"i\":\"Reading current pump log anchors\",\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"selector\":\"1014-1020,1248-1258,1418-1428,1605-1614\"}","call_id":"call_myLOXMONx0qK9n6aQXwvpdFi","name":"read"}]},"duration":36601.96209999919,"ttft":3572.966700002551,"contextSnapshot":{"promptTokens":88189,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_iIjgmDJnMSIyN2JmmjyBLpWH|fc_04b15dc90dfe1c93016a5a292695c0819585a8c356df4e74a3","toolName":"read","startedAt":"2026-07-17T13:07:51.853Z","args":{"path":"crates/spt-daemon/src/dispatch.rs"},"intent":"Reading dispatcher cadence"},"id":"3c37e785","parentId":"0d2bf30b","timestamp":"2026-07-17T13:07:51.853Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_gisYBETntC4YK4nInhJkXsPB|fc_04b15dc90dfe1c93016a5a292695d481959881161f7d4d748c","toolName":"read","startedAt":"2026-07-17T13:07:51.853Z","args":{"path":"crates/spt-daemon/src/pump/registry.rs"},"intent":"Reading registry worker cadence"},"id":"7c1055c9","parentId":"3c37e785","timestamp":"2026-07-17T13:07:51.853Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_kcameIlYt9WmjyxoWplWjDyR|fc_04b15dc90dfe1c93016a5a292695dc81959d76d496ce700b32","toolName":"read","startedAt":"2026-07-17T13:07:51.853Z","args":{"path":"crates/spt-daemon/src/registryhost.rs"},"intent":"Reading recent project resolver"},"id":"1fd5e91a","parentId":"7c1055c9","timestamp":"2026-07-17T13:07:51.853Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_FCV9oxIEniJrbaB13FYnMtar|fc_04b15dc90dfe1c93016a5a292695e48195abf9eec435bdef4b","toolName":"read","startedAt":"2026-07-17T13:07:51.853Z","args":{"path":"crates/spt-store/src/project.rs"},"intent":"Reading project resolver subprocess"},"id":"c9b2e994","parentId":"1fd5e91a","timestamp":"2026-07-17T13:07:51.853Z"}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_myLOXMONx0qK9n6aQXwvpdFi|fc_04b15dc90dfe1c93016a5a292695e88195a727740d053ead6f","toolName":"read","startedAt":"2026-07-17T13:07:51.853Z","args":{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"},"intent":"Reading current pump log anchors"},"id":"7e95ce26","parentId":"c9b2e994","timestamp":"2026-07-17T13:07:51.853Z"}
{"type":"message","id":"c9c820b8","parentId":"7e95ce26","timestamp":"2026-07-17T13:07:51.868Z","message":{"role":"toolResult","toolCallId":"call_iIjgmDJnMSIyN2JmmjyBLpWH|fc_04b15dc90dfe1c93016a5a292695c0819585a8c356df4e74a3","toolName":"read","content":[{"type":"text","text":"/// (the daemon spawns it on its own); workers detach (each ends with its\n/// stream).\npub fn run_dispatch_loop(\n    broker_name: &str,\n    paths: &DispatchPaths,\n    registry: Arc<RegistryHost>,\n    stop: &AtomicBool,\n    poll: Duration,\n) -> io::Result<()> {\n    let mut brain = connect(broker_name)?;\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n    // abandoned a stream on the first transient failure.\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\n    // loop emits carries it, so per-generation attach/poison censuses line up.\n    let generation = now_ms();\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\n    // with workers so a seat-blocked retry paces on it.\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\n    // with a large backlog) claims at most this many rows per poll — the\n    // rest wait for the next tick, batching the cold enumeration instead of\n    // spawning one thread per row. No claim lock is held across any I/O:\n    // enumeration runs lock-free, the claim map is touched in short scopes.\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n    while !stop.load(Ordering::Relaxed) {\n        if breaker.lock().unwrap().open(Instant::now()) {\n            // Circuit open: a poisoned replay just happened — pause ALL\n            // claiming for the window instead of hammering the wedged conn\n            // with fresh replay subscribers (Amendment fix 5).\n            thread::sleep(poll);\n            continue;\n        }\n        let reply = brain.net_streams()?;\n        for s in reply.streams {\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\n            // invisible until its first write anyway — gotcha #6 — but the\n            // next_seq guard also skips a row whose pump hasn't appended yet).\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\n            if s.initiated_locally || s.next_seq == 0 {\n                continue;\n            }\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\n                break; // pool full: the rest of the table waits for the next poll\n            }\n            let attempts = {\n                let mut c = claims.lock().unwrap();\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\n                    Some(attempts) => {\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\n                        attempts\n                    }\n                    None => continue,\n                }\n            };\n            let name = broker_name.to_string();\n            let origin = s.remote_id_hex.clone();\n…\n            thread::spawn(move || {\n…\n                if retire_terminal {\n…\n                    eprintln!(\n…\n                        dispatch_event(\n…\n                            attempts,\n                            conn_id,\n                            \"oneway-strike-retire\",\n                            &format!(\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\n                                 advertisement round recovers\"\n                            ),\n                        )\n                    );\n                }\n                let mut c = claims_done.lock().unwrap();\n                c.insert(stream_id, state);\n            });\n        }\n        thread::sleep(poll);\n    }\n    Ok(())\n}\n\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream"}],"details":{"displayContent":{"text":"/// (the daemon spawns it on its own); workers detach (each ends with its\n/// stream).\npub fn run_dispatch_loop(\n    broker_name: &str,\n    paths: &DispatchPaths,\n    registry: Arc<RegistryHost>,\n    stop: &AtomicBool,\n    poll: Duration,\n) -> io::Result<()> {\n    let mut brain = connect(broker_name)?;\n    // Claim lifecycle (ADR-0038 C): in-flight / terminal / retryable —\n    // replaces the pre-fix one-shot `HashSet` whose burned claims permanently\n    // abandoned a stream on the first transient failure.\n    let claims: Arc<Mutex<HashMap<u64, ClaimState>>> = Arc::new(Mutex::new(HashMap::new()));\n    // Dispatcher generation id (Amendment fix 9): every telemetry record this\n    // loop emits carries it, so per-generation attach/poison censuses line up.\n    let generation = now_ms();\n    // Global circuit breaker (Amendment fix 5) + its current window, shared\n    // with workers so a seat-blocked retry paces on it.\n    let breaker: Arc<Mutex<CircuitBreaker>> = Arc::new(Mutex::new(CircuitBreaker::default()));\n    // Bounded worker pool (Amendment fix 7): a cold table (daemon refresh\n    // with a large backlog) claims at most this many rows per poll — the\n    // rest wait for the next tick, batching the cold enumeration instead of\n    // spawning one thread per row. No claim lock is held across any I/O:\n    // enumeration runs lock-free, the claim map is touched in short scopes.\n    // [impl->REQ-DISPATCH-HYGIENE-TELEMETRY]\n    let active_workers = Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n    while !stop.load(Ordering::Relaxed) {\n        if breaker.lock().unwrap().open(Instant::now()) {\n            // Circuit open: a poisoned replay just happened — pause ALL\n            // claiming for the window instead of hammering the wedged conn\n            // with fresh replay subscribers (Amendment fix 5).\n            thread::sleep(poll);\n            continue;\n        }\n        let reply = brain.net_streams()?;\n        for s in reply.streams {\n            // Claim only peer-initiated rows with bytes (a QUIC stream is\n            // invisible until its first write anyway — gotcha #6 — but the\n            // next_seq guard also skips a row whose pump hasn't appended yet).\n            // Terminal rows never re-enter; a released (Retry) claim re-enters\n            // after its backoff (REQ-DISPATCH-CLAIM-RETRY).\n            if s.initiated_locally || s.next_seq == 0 {\n                continue;\n            }\n            if !pool_has_room(active_workers.load(Ordering::Relaxed)) {\n                break; // pool full: the rest of the table waits for the next poll\n            }\n            let attempts = {\n                let mut c = claims.lock().unwrap();\n                match should_claim(c.get(&s.stream_id), Instant::now()) {\n                    Some(attempts) => {\n                        c.insert(s.stream_id, ClaimState::InFlight { attempts });\n                        attempts\n                    }\n                    None => continue,\n                }\n            };\n            let name = broker_name.to_string();\n            let origin = s.remote_id_hex.clone();\n…\n            thread::spawn(move || {\n…\n                if retire_terminal {\n…\n                    eprintln!(\n…\n                        dispatch_event(\n…\n                            attempts,\n                            conn_id,\n                            \"oneway-strike-retire\",\n                            &format!(\n                                \"budget={ONEWAY_POISON_STRIKES} row retired terminal; next \\\n                                 advertisement round recovers\"\n                            ),\n                        )\n                    );\n                }\n                let mut c = claims_done.lock().unwrap();\n                c.insert(stream_id, state);\n            });\n        }\n        thread::sleep(poll);\n    }\n    Ok(())\n}\n\n/// Bounded redispatch worker pool (ADR-0038 Amendment fix 7): a cold stream","startLine":500,"lineNumbers":[500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,null,571,null,655,null,659,null,661,null,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\dispatch.rs"}}},"isError":false,"timestamp":1784293671867}}
{"type":"message","id":"d9e1a26f","parentId":"c9c820b8","timestamp":"2026-07-17T13:07:51.873Z","message":{"role":"toolResult","toolCallId":"call_FCV9oxIEniJrbaB13FYnMtar|fc_04b15dc90dfe1c93016a5a292695e48195abf9eec435bdef4b","toolName":"read","content":[{"type":"text","text":"use std::path::Path;\nuse std::time::Duration;\n\nuse crate::gitrun::run_git;\n\n/// Budget for the (local, fast) `git remote get-url` / `rev-parse` reads.\nconst PROJECT_GIT_TIMEOUT: Duration = Duration::from_secs(10);\n\n/// Slug a remote URL (or any name) into the project-id charset: lowercase,\n/// scheme/credentials/`.git` stripped, every non-`[a-z0-9]` run collapsed to\n/// one `-`, trimmed of leading/trailing `-`.\nfn slug(raw: &str) -> String {\n    let mut s = raw.trim().to_ascii_lowercase();\n    // Strip URL scheme and credentials: `https://user@host/p` → `host/p`,\n    // `git@host:p` → `host:p` (the `:` collapses to `-` below).\n    if let Some(idx) = s.find(\"://\") {\n        s = s[idx + 3..].to_string();\n    }\n    if let Some(idx) = s.find('@') {\n        s = s[idx + 1..].to_string();\n    }\n    if let Some(stripped) = s.strip_suffix(\".git\") {\n        s = stripped.to_string();\n    }\n    let mut out = String::with_capacity(s.len());\n    let mut last_dash = true; // suppress a leading '-'\n    for c in s.chars() {\n        if c.is_ascii_alphanumeric() {\n            out.push(c);\n            last_dash = false;\n        } else if !last_dash {\n            out.push('-');\n            last_dash = true;\n        }\n    }\n    while out.ends_with('-') {\n        out.pop();\n    }\n    out\n}\n\n/// Derive the `project_id` for a directory inside (or being) a project.\n/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\n/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\n/// a broken repo must not stall context routing.\n// [impl->REQ-STORE-1]\npub fn project_id_for_dir(dir: &Path) -> String {\n    project_id_and_display_for_dir(dir).0\n}\n\n/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\n/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\n/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\n/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\n/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\nfn display_from_url(url: &str) -> String {\n    let s = url.trim().trim_end_matches('/');\n    let s = s.strip_suffix(\".git\").unwrap_or(s);\n…\n}\n…\n\n    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            let url = out.stdout_trimmed();\n            let id = slug(&url);\n            if !id.is_empty() {\n                return (id, display_from_url(&url));\n            }\n        }\n    }\n\n    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            if let Some(name) = Path::new(&out.stdout_trimmed())\n                .file_name()\n                .map(|n| n.to_string_lossy().to_string())\n            {\n                let id = slug(&name);\n                if !id.is_empty() {\n                    return (id, name);\n                }\n            }\n        }\n    }\n\n    // 3. The directory's own folder name.\n    let name = dir\n        .file_name()\n        .map(|n| n.to_string_lossy().to_string())\n        .unwrap_or_default();\n    let id = if name.is_empty() { String::new() } else { slug(&name) };\n    if id.is_empty() {\n        (\"unnamed-project\".to_string(), \"unnamed-project\".to_string())\n    } else {\n…\n    }"}],"details":{"displayContent":{"text":"use std::path::Path;\nuse std::time::Duration;\n\nuse crate::gitrun::run_git;\n\n/// Budget for the (local, fast) `git remote get-url` / `rev-parse` reads.\nconst PROJECT_GIT_TIMEOUT: Duration = Duration::from_secs(10);\n\n/// Slug a remote URL (or any name) into the project-id charset: lowercase,\n/// scheme/credentials/`.git` stripped, every non-`[a-z0-9]` run collapsed to\n/// one `-`, trimmed of leading/trailing `-`.\nfn slug(raw: &str) -> String {\n    let mut s = raw.trim().to_ascii_lowercase();\n    // Strip URL scheme and credentials: `https://user@host/p` → `host/p`,\n    // `git@host:p` → `host:p` (the `:` collapses to `-` below).\n    if let Some(idx) = s.find(\"://\") {\n        s = s[idx + 3..].to_string();\n    }\n    if let Some(idx) = s.find('@') {\n        s = s[idx + 1..].to_string();\n    }\n    if let Some(stripped) = s.strip_suffix(\".git\") {\n        s = stripped.to_string();\n    }\n    let mut out = String::with_capacity(s.len());\n    let mut last_dash = true; // suppress a leading '-'\n    for c in s.chars() {\n        if c.is_ascii_alphanumeric() {\n            out.push(c);\n            last_dash = false;\n        } else if !last_dash {\n            out.push('-');\n            last_dash = true;\n        }\n    }\n    while out.ends_with('-') {\n        out.pop();\n    }\n    out\n}\n\n/// Derive the `project_id` for a directory inside (or being) a project.\n/// Remote-URL first, then git-toplevel folder name, then the dir's own name;\n/// an empty derivation degrades to `\"unnamed-project\"` rather than erroring —\n/// a broken repo must not stall context routing.\n// [impl->REQ-STORE-1]\npub fn project_id_for_dir(dir: &Path) -> String {\n    project_id_and_display_for_dir(dir).0\n}\n\n/// The human-recognizable DISPLAY name for a remote URL: the last path segment,\n/// `.git` + trailing slash stripped, case preserved. `https://github.com/SaberMage/\n/// spt-core.git` → `spt-core`; `git@github.com:SaberMage/spt-core.git` → `spt-core`.\n/// NOT parsed back out of the slug (org/repo boundaries don't survive slugging —\n/// `my-org/x` and `my/org-x` slug identically). Empty URL tail degrades to the id.\nfn display_from_url(url: &str) -> String {\n    let s = url.trim().trim_end_matches('/');\n    let s = s.strip_suffix(\".git\").unwrap_or(s);\n…\n}\n…\n\n    // 1. Remote URL (stable + path-independent): id = slug(url), display = URL tail.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"remote\", \"get-url\", \"origin\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            let url = out.stdout_trimmed();\n            let id = slug(&url);\n            if !id.is_empty() {\n                return (id, display_from_url(&url));\n            }\n        }\n    }\n\n    // 2. Git toplevel folder name (repo without a remote): id = slug, display = folder.\n    if let Ok(out) = run_git(\n        &[\"-C\", &dir_arg, \"rev-parse\", \"--show-toplevel\"],\n        None,\n        None,\n        PROJECT_GIT_TIMEOUT,\n    ) {\n        if out.success() {\n            if let Some(name) = Path::new(&out.stdout_trimmed())\n                .file_name()\n                .map(|n| n.to_string_lossy().to_string())\n            {\n                let id = slug(&name);\n                if !id.is_empty() {\n                    return (id, name);\n                }\n            }\n        }\n    }\n\n    // 3. The directory's own folder name.\n    let name = dir\n        .file_name()\n        .map(|n| n.to_string_lossy().to_string())\n        .unwrap_or_default();\n    let id = if name.is_empty() { String::new() } else { slug(&name) };\n    if id.is_empty() {\n        (\"unnamed-project\".to_string(), \"unnamed-project\".to_string())\n    } else {\n…\n    }","startLine":18,"lineNumbers":[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,null,83,null,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,null,142]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-store\\src\\project.rs"}}},"isError":false,"timestamp":1784293671872}}
{"type":"message","id":"53880ff1","parentId":"d9e1a26f","timestamp":"2026-07-17T13:07:51.875Z","message":{"role":"toolResult","toolCallId":"call_gisYBETntC4YK4nInhJkXsPB|fc_04b15dc90dfe1c93016a5a292695d481959881161f7d4d748c","toolName":"read","content":[{"type":"text","text":"    fn pre_round(&mut self, _ctx: &RoundCtx) {\n…\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\n        // eviction.\n        // [impl->REQ-SUBNET-7]\n        self.registry.consume_repair_evictions();\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\n        // resolution forever; a live peer re-stamps its heard entry with every\n        // admitted feed and is never touched.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_silent_peers(self.evict_after);\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\n        // evicts rows that have been non-routable (Offline) beyond the grace even\n        // while their author node is alive (a purge/erase Offline ghost that\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\n        // registry_evict_after grace; own rows never decay; the receiver-observed\n        // offline_since is self-pruning so a whole-node eviction above drops its\n        // stamps for free.\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\n        self.registry.evict_aged_offline_rows(self.evict_after);\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\n        // closed — after the eviction sweep, before re-advertising. The\n        // re-minted seed rides the member control stream on the next connect;\n        // the revokee's tombstone (already propagated) keeps it locked out.\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\n        // Re-advertise this node's own rows; held as worker state for the\n        // per-subnet `peer_step` filter below.\n        self.adverts = self.registry.advertise_local(&self.owlery);\n    }\n\n    /// Push this node's own rows for `subnet` over the peer's feed stream\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\n    /// stream per feed.\n    fn peer_step(\n        &mut self,\n        io: &mut PeerIo,\n        subnet: &str,\n        _peer_hex: &str,\n        _ctx: &RoundCtx,\n    ) -> io::Result<()> {\n        let lines: Vec<u8> = self\n            .adverts\n            .iter()\n            .filter(|u| u.subnet() == subnet)\n            .flat_map(|u| u.encode_line())\n            .collect();\n        if !lines.is_empty() {\n            io.push_feed(&lines)?;\n        }\n        Ok(())\n    }\n\n[Showing lines 129-178 of 334. Use :179 to continue]"}],"details":{"truncation":{"content":"        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r","truncated":true,"truncatedBy":"lines","totalLines":206,"totalBytes":2461,"outputLines":50,"outputBytes":2461,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"    fn pre_round(&mut self, _ctx: &RoundCtx) {\n…\n        // tick's snapshot mirror can resurrect the pairing host's disk-side\r\n        // eviction.\r\n        // [impl->REQ-SUBNET-7]\r\n        self.registry.consume_repair_evictions();\r\n        // Sweep silent-node ghost rows BEFORE re-advertising (KNOWN-HAZARDS\r\n        // 4.10): a dead node identity's rows decay instead of poisoning bare-id\r\n        // resolution forever; a live peer re-stamps its heard entry with every\r\n        // admitted feed and is never touched.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_silent_peers(self.evict_after);\r\n        // Trigger (b) — per-row Offline-TTL (#2-secondary): the SAME sweep also\r\n        // evicts rows that have been non-routable (Offline) beyond the grace even\r\n        // while their author node is alive (a purge/erase Offline ghost that\r\n        // ghost-heal re-advertised once and whole-node eviction never reaps). Same\r\n        // registry_evict_after grace; own rows never decay; the receiver-observed\r\n        // offline_since is self-pruning so a whole-node eviction above drops its\r\n        // stamps for free.\r\n        // [impl->REQ-HAZARD-REGISTRY-GHOST-ROWS]\r\n        self.registry.evict_aged_offline_rows(self.evict_after);\r\n        // Mesh-D7 (REQ-MESH-4): fire any seed rotation whose revoke window has\r\n        // closed — after the eviction sweep, before re-advertising. The\r\n        // re-minted seed rides the member control stream on the next connect;\r\n        // the revokee's tombstone (already propagated) keeps it locked out.\r\n        fire_due_rotations(&self.subnets, &self.rotations, now_ms());\r\n        // Re-advertise this node's own rows; held as worker state for the\r\n        // per-subnet `peer_step` filter below.\r\n        self.adverts = self.registry.advertise_local(&self.owlery);\r\n    }\r\n\r\n    /// Push this node's own rows for `subnet` over the peer's feed stream\r\n    /// (per-subnet filter of the `pre_round` adverts). Fire-and-forget, one\r\n    /// stream per feed.\r\n    fn peer_step(\r\n        &mut self,\r\n        io: &mut PeerIo,\r\n        subnet: &str,\r\n        _peer_hex: &str,\r\n        _ctx: &RoundCtx,\r\n    ) -> io::Result<()> {\r\n        let lines: Vec<u8> = self\r\n            .adverts\r\n            .iter()\r\n            .filter(|u| u.subnet() == subnet)\r\n            .flat_map(|u| u.encode_line())\r\n            .collect();\r\n        if !lines.is_empty() {\r\n            io.push_feed(&lines)?;\r\n        }\r\n        Ok(())\r\n    }\r","startLine":126,"lineNumbers":[126,null,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\pump\\registry.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":334,"totalBytes":2461,"outputLines":50,"outputBytes":2461,"shownRange":{"start":129,"end":178},"nextOffset":179}}},"isError":false,"timestamp":1784293671875}}
{"type":"message","id":"ce991c09","parentId":"53880ff1","timestamp":"2026-07-17T13:07:51.964Z","message":{"role":"toolResult","toolCallId":"call_myLOXMONx0qK9n6aQXwvpdFi|fc_04b15dc90dfe1c93016a5a292695e88195a727740d053ead6f","toolName":"read","content":[{"type":"text","text":"CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\nCONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_IPC_READER: spawned\nPUMP_IPC_READER: spawned\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608894 mono_ms=194530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=569 role=brain wall_ms=1784292608894 mono_ms=194530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=569 role=brain wall_ms=1784292608894 mono_ms=194530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\nCONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=646 role=brain stream-subscriber stream=242 wall_ms=1784292639786 mono_ms=225422 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=647 role=brain wall_ms=1784292639787 mono_ms=225422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=647 role=brain wall_ms=1784292639787 mono_ms=225423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\nCONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]"}],"details":{"displayContent":{"text":"CONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=407 role=brain wall_ms=1784292560353 mono_ms=145989 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nBRAIN_NET_CONSUMERS_UP: net enabled (node 14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d) — dispatcher + peer pump started\nCONN_LIFECYCLE: conn=408 role=brain wall_ms=1784292560815 mono_ms=146451 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_IPC_READER: spawned\nPUMP_IPC_READER: spawned\nCONN_LIFECYCLE: conn=410 role=brain presence-subscriber wall_ms=1784292560815 mono_ms=146451 event=presence-sub-attach from_seq=18446744073709551615 [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=492 role=brain stream-subscriber stream=183 wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=498 role=brain wall_ms=1784292586718 mono_ms=172354 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=494 role=brain stream-subscriber stream=184 wall_ms=1784292586735 mono_ms=172371 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172371 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=499 role=brain wall_ms=1784292586735 mono_ms=172372 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586908 mono_ms=0\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292586909 mono_ms=0\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=501 role=brain wall_ms=1784292587407 mono_ms=173043 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=500 role=brain wall_ms=1784292587407 mono_ms=173043 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=568 role=brain wall_ms=1784292608887 mono_ms=194523 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=567 role=brain stream-subscriber stream=213 wall_ms=1784292608894 mono_ms=194530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=569 role=brain wall_ms=1784292608894 mono_ms=194530 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=569 role=brain wall_ms=1784292608894 mono_ms=194530 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=570 role=brain wall_ms=1784292610705 mono_ms=196341 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611960 mono_ms=25052\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292611961 mono_ms=25052\nCONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=571 role=brain wall_ms=1784292614604 mono_ms=200240 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=572 role=brain wall_ms=1784292614605 mono_ms=200241 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\n…\nCONN_LIFECYCLE: conn=646 role=brain stream-subscriber stream=242 wall_ms=1784292639786 mono_ms=225422 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=647 role=brain wall_ms=1784292639787 mono_ms=225422 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=647 role=brain wall_ms=1784292639787 mono_ms=225423 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=648 role=brain wall_ms=1784292640903 mono_ms=226539 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nPUMP_PEER_FAIL:5ff50e75cd91d3b88ae3a0aa863e4371ad810c9747a43ac6242661e8cf8738ce:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\nPUMP_PEER_FAIL:c8939d2f12b7488cf658a694b500f2da3ab32fa478dfe078557a862534baa573:stage=quic-connect: submit-dial exceeded the 10s bound (peer unresponsive) wall_ms=1784292643383 mono_ms=56475\nCONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=write-start [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=649 role=brain wall_ms=1784292644702 mono_ms=230338 event=transport-close poisoned=false timed_out=false [REQ-CONN-POISON-ATTRIBUTION]\nCONN_LIFECYCLE: conn=650 role=brain wall_ms=1784292644703 mono_ms=230339 event=write-start [REQ-CONN-POISON-ATTRIBUTION]","startLine":1014,"lineNumbers":[1014,1015,1016,1017,1018,1019,1020,null,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,null,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,null,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614]},"meta":{"source":{"type":"path","value":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log"}}},"isError":false,"timestamp":1784293671964}}
{"type":"message","id":"18e2770c","parentId":"ce991c09","timestamp":"2026-07-17T13:07:51.983Z","message":{"role":"toolResult","toolCallId":"call_kcameIlYt9WmjyxoWplWjDyR|fc_04b15dc90dfe1c93016a5a292695dc81959d76d496ce700b32","toolName":"read","content":[{"type":"text","text":"fn gossip_controller_node(\n…\n) -> Option<String> {\n…\n}\n\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\n/// accumulate many cwds); the picker's project pane never needs more.\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\n\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\n    let entries = spt_store::sessions::read_all(perch_path);\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n    let mut out: Vec<String> = Vec::new();\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\n        let dir = Path::new(cwd);\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\n            continue;\n        }\n        let pid = spt_store::project::project_id_for_dir(dir);\n        if pid.is_empty() {\n            continue;\n        }\n        if seen.insert(pid.clone()) {\n            out.push(pid);\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\n                break;\n            }\n        }\n    }\n    out\n}\n\n/// The superseded identities a completed ceremony's intro reveals (pure,\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\n/// label AND machine id under a DIFFERENT node key than the re-paired\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\n/// collide), a machine id alone is never gossiped without its label.\n\n[Showing lines 974-1015 of 2429. Use :1016 to continue]"}],"details":{"truncation":{"content":"}\r\n\r\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\r\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\r\n/// accumulate many cwds); the picker's project pane never needs more.\r\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\r\n\r\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\r\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\r\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\r\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\r\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\r\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\r\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\r\n    let entries = spt_store::sessions::read_all(perch_path);\r\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\r\n    let mut out: Vec<String> = Vec::new();\r\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\r\n        let dir = Path::new(cwd);\r\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\r\n            continue;\r\n        }\r\n        let pid = spt_store::project::project_id_for_dir(dir);\r\n        if pid.is_empty() {\r\n            continue;\r\n        }\r\n        if seen.insert(pid.clone()) {\r\n            out.push(pid);\r\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// The superseded identities a completed ceremony's intro reveals (pure,\r\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\r\n/// label AND machine id under a DIFFERENT node key than the re-paired\r\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\r\n/// collide), a machine id alone is never gossiped without its label.\r","truncated":true,"truncatedBy":"lines","totalLines":1456,"totalBytes":1997,"outputLines":42,"outputBytes":1997,"lastLinePartial":false,"firstLineExceedsLimit":false},"displayContent":{"text":"fn gossip_controller_node(\n…\n) -> Option<String> {\n…\n}\r\n\r\n/// Bound on the recent-project IDs a single instance gossips — newest-first, so the\r\n/// cap keeps the freshest projects. Keeps the wire compact (a long-lived endpoint can\r\n/// accumulate many cwds); the picker's project pane never needs more.\r\nconst MAX_GOSSIPED_PROJECTS: usize = 8;\r\n\r\n/// The endpoint's recent project IDs newest→oldest for gossip (#4,\r\n/// REQ-GOSSIP-ADAPTER-PROJECTS): the session ledger's cwds mapped to project IDs,\r\n/// owlery-internal cwds excluded (a psyche-host session is not a project — mirrors the\r\n/// picker + `REQ-STORE-CONTEXT-BRANCH-FILL` exclusion), deduped newest-first, bounded.\r\n/// Project IDs ONLY — dirs never cross the wire (they leak usernames/dir structure).\r\n/// Degrade-to-empty on any IO error (best-effort gossip, never a crash).\r\n// [impl->REQ-GOSSIP-ADAPTER-PROJECTS]\r\nfn recent_projects_for(perch_path: &Path, owlery: &Path) -> Vec<String> {\r\n    let entries = spt_store::sessions::read_all(perch_path);\r\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\r\n    let mut out: Vec<String> = Vec::new();\r\n    for cwd in entries.iter().rev().filter_map(|e| e.cwd.as_deref()) {\r\n        let dir = Path::new(cwd);\r\n        if crate::lifecycle::is_owlery_internal(dir, owlery) {\r\n            continue;\r\n        }\r\n        let pid = spt_store::project::project_id_for_dir(dir);\r\n        if pid.is_empty() {\r\n            continue;\r\n        }\r\n        if seen.insert(pid.clone()) {\r\n            out.push(pid);\r\n            if out.len() >= MAX_GOSSIPED_PROJECTS {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    out\r\n}\r\n\r\n/// The superseded identities a completed ceremony's intro reveals (pure,\r\n/// M8 decision 13 / REQ-SUBNET-7): rows in `reg` advertising the SAME node\r\n/// label AND machine id under a DIFFERENT node key than the re-paired\r\n/// joiner. Both must match — a label alone re-pairs nothing (hostnames\r\n/// collide), a machine id alone is never gossiped without its label.\r","startLine":964,"lineNumbers":[964,null,968,null,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015]},"meta":{"source":{"type":"path","value":"C:\\Users\\decid\\Documents\\projects\\spt-core\\crates\\spt-daemon\\src\\registryhost.rs"},"truncation":{"direction":"head","truncatedBy":"lines","totalLines":2429,"totalBytes":1997,"outputLines":42,"outputBytes":1997,"shownRange":{"start":974,"end":1015},"nextOffset":1016}}},"isError":false,"timestamp":1784293671983}}
{"type":"message","id":"9d2d2dc9","parentId":"18e2770c","timestamp":"2026-07-17T13:09:47.778Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"**Analyzing failure timestamp discrepancies**\n\n**Verifying failure connections and project counts**\n\n**Confirming atomic write counts**"},{"type":"thinking","thinking":"**Analyzing registry snapshot timing**\n\n**Investigating cluster burst timing and registry wake effects**\n\n**Identifying CPU usage by registry pump thread**"},{"type":"thinking","thinking":"**Profiling git-related process clusters**\n\n**Evaluating registry lifecycle performance**"},{"type":"toolCall","id":"call_iEgvath9gg9dysc3aieRUTg6|fc_04b15dc90dfe1c93016a5a295623b48195bfc3943b6cb88762","name":"yield","arguments":{"type":"result","result":{"data":{"summary":"## Finding\n\n**Highest-confidence source of the residual v0.37 brain CPU bursts is the registry pump’s local re-advertisement pass, specifically repeated project-ID derivation from every endpoint session-ledger row.** This is not the already-fixed executable self-hash and does not require a poisoned connection to occur.\n\n### Cadence and field correlation\n\n- `crates/spt-daemon/src/config.rs:35-42` defines the peer-pump cadences; registry defaults to **30 s**.\n- The deployed `C:/Users/decid/AppData/Local/spt-core/daemon.json` confirms `registry_pump_period_ms: 30000` and `peer_pump: true`.\n- `crates/spt-daemon/src/pump/mod.rs:95-103` gives the scheduler a 200 ms tick, while `:587-591` initializes every worker’s last-run value to `None`, so all four pump legs run immediately after a brain refresh.\n- `crates/spt-daemon/src/pump/mod.rs:728-729` stamps the worker **after the entire round**, not when work begins. Therefore the registry burst is not on a rigid 30 s wall-clock grid: the next registry pass begins 30 s after the previous round finishes. With the current dead-peer 10 s dial waits, burst starts can be roughly 56 s apart rather than 30 s apart.\n- The current log provides a useful natural experiment:\n  - `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:1016-1019`: refreshed brain’s dispatcher/pump starts at `wall_ms=1784292560815`.\n  - `:1254-1255`: the prime-all round reaches its paired 10 s dial timeouts at `1784292586908/9`.\n  - `:1424-1425`: the next **15 s notif-only** round reaches the same 10 s timeout at `1784292611960/1`. From the prior round’s completion, `15 s cadence + 10 s timeout` predicts approximately `1784292611909`; the observed extra local work is only about **51 ms**.\n  - `:1610-1611`: the next **30 s registry** round reaches timeout at `1784292643383`. From the initial round completion, `30 s cadence + 10 s timeout` accounts for 40 s; the remaining approximately **16.47 s** is recurring local work before the dials are drained. This isolates registry-round preparation from the cheap notif round without requiring speculative CPU attribution.\n- Two approximately 16 s registry clusters in a 90 s window can occupy about 32 one-second buckets; the observed **27/90 samples at least 10%**, with dense clusters and a low 3.1% median, is the expected shape after sampling/phase boundaries. It is not the shape of the dispatcher’s 100 ms polling baseline.\n\n### Work performed on each registry round\n\n1. `crates/spt-daemon/src/pump/registry.rs:141-162` runs eviction/rotation work and then unconditionally calls `RegistryHost::advertise_local` in `pre_round`, before connecting to any peer. Thus it runs even when no peer is reachable.\n2. `crates/spt-daemon/src/registryhost.rs:579-620` enumerates every bound top-level perch and calls `recent_projects_for` once per perch.\n3. `crates/spt-daemon/src/registryhost.rs:981-1009` reads the full bounded `sessions.log`, walks newest-to-oldest, excludes owlery-internal paths, and only stops after finding eight **unique** project IDs. Deduplication occurs **after** project-ID derivation.\n4. `crates/spt-store/src/sessions.rs:27-30,99-102` shows each ledger is a rolling file capped at 64 rows and `read_all` reads/parses the file each call.\n5. `crates/spt-store/src/project.rs:21-24,55-64,95-137` derives each row’s project by spawning `git -C <cwd> remote get-url origin`, then—if that does not return a usable remote—spawns `git -C <cwd> rev-parse --show-toplevel`. Each eligible ledger row therefore costs **one or two subprocess launches with 10 s budgets**, even when many rows repeat the same cwd/project.\n6. A census of the current 12 bound-perch ledgers found **200 eligible non-owlery cwd rows**. No perch reaches the cap of eight unique projects, so all 200 rows are derived each registry pass: **at least 200 and at most 400 sequential `git.exe` launches per pass**. Repeated cwd values are not cached.\n7. `crates/spt-daemon/src/registryhost.rs:584-632,701-728` also advances the epoch once for every perch/subnet row and once per subnet node-label row. The current `identity/subnet.json` has two active subnets and there are 12 bound perches, yielding **26 epoch advances per round**. `crates/spt-store/src/epoch.rs:63-75` shows every advance is an atomic file write. `RegistryHost::advertise_local` then rewrites registry snapshots at `registryhost.rs:729-733`.\n\nComplexity is therefore approximately $O(L \\times G + P \\times S + R)$ per registry pass, where $L$ is eligible ledger rows, $G$ is one/two external Git processes per row, $P$ is bound perches, $S$ is subnets, and $R$ is in-memory registry rows scanned/serialized. The subprocess term dominates on this Windows host.\n\n### Candidate discrimination\n\n- **Notif pump, 15 s:** source cadence is `config.rs:40`; the log’s isolated notif round adds only about 51 ms before the fixed 10 s timeout. It cannot explain a recurring 16 s CPU cluster.\n- **Dispatcher, 100 ms:** `dispatch.rs:500-544,665-679` performs `brain.net_streams()` every poll and spawns only for newly eligible rows. It can explain a low steady baseline or stream-event spikes, but not the log-isolated 30 s registry preparation delay. Current post-refresh log has no poison/failure evidence supplied by this path.\n- **Live-host reconciliation, 5 s:** `livehost.rs:49-51,1015-1017,1106-1111` queries live sessions and scans endpoint records every 5 s. It does not run Git per historical ledger row; a 5 s phase-locked signal would look materially different.\n- **Project-index full backstop, 300 s:** `projwriter.rs:55-64,590-690` can be expensive but can contribute at most one scheduled pass in a 90 s sample. Current `project-index-stats.json` also reports the latest cycle at 549 ms, not a dense multi-second cluster.\n\n### Falsifiable field measurement\n\nCapture at least 120 s of ETW/WPR CPU sampling plus process-start events, or Procmon process events, filtered to the current brain PID and its descendants. Also record write events for `identity/epoch` and `identity/registry/{BIGNET,SPT_DEV}.json`.\n\nThe registry explanation predicts:\n\n1. CPU clusters are on the brain’s `spt-peer-pump` thread.\n2. Each cluster contains approximately **200–400 `git.exe` child starts**, concentrated over approximately 16 s.\n3. The registry/epoch writes finish near the end of that cluster.\n4. For the currently unreachable peers, `PUMP_PEER_FAIL ... exceeded the 10s bound` follows approximately 10 s later.\n5. The intervening 15 s notif round has no comparable Git-child cluster.\n\nZero clustered Git starts, CPU attribution to another brain thread, or 5 s rather than registry-round phase locking falsifies this explanation and elevates livehost/dispatcher as the next candidates.\n\n### Field-gate disposition\n\n**CPU field gate: HOLD / NO-GO. Registry-lifecycle correctness gate: PASS on the available zero-poison evidence.**\n\nThis is **expected steady-state behavior of the current source**, not a recurrence of REGISTRY-LIFECYCLE poison and not evidence that the self-hash fix failed—the read-rate collapse from 63.91 MiB/s to 0.29 MiB/s corroborates that fix. It is also not a v0.37 lifecycle regression in the narrow causal sense: it is a pre-existing/latent periodic workload now exposed after removing the continuous hash load. Nevertheless, 90 s mean brain CPU of 8.39% of one core, p95 28.1%, and approximately 16 s hot clusters do not satisfy v0.37’s release claim that idle-node steady background CPU has ended. The mean improved versus v0.36’s 15.5%, but the residual is real scheduled work rather than measurement noise; the overall performance field gate should remain held until the process-start discriminator confirms or rejects it and the accepted idle threshold is met.","files":[{"path":"crates/spt-daemon/src/pump/registry.rs","description":"Lines 141-162 perform all node-local registry eviction/rotation/re-advertisement work in `pre_round`; line 162 calls `advertise_local` before peer fan-out."},{"path":"crates/spt-daemon/src/registryhost.rs","description":"Lines 579-632 derive recent projects for every bound perch and author a row for each subnet; lines 701-733 add node-label epochs and rewrite snapshots; lines 981-1009 scan ledgers and invoke project derivation before deduplication."},{"path":"crates/spt-store/src/project.rs","description":"Lines 21-24 define a 10 s Git budget; lines 55-64 expose project-ID derivation; lines 95-137 show sequential `git remote get-url` and fallback `git rev-parse` subprocesses for every cwd."},{"path":"crates/spt-store/src/sessions.rs","description":"Lines 27-30 define the 64-row rolling ledger cap; lines 99-102 show `read_all` reads/parses the ledger file."},{"path":"crates/spt-store/src/epoch.rs","description":"Lines 63-75 show every registry epoch increment is persisted with an atomic write."},{"path":"crates/spt-daemon/src/pump/mod.rs","description":"Lines 95-103 define the 200 ms scheduler tick; lines 516-518 state ordering; lines 587-591 prime all workers after refresh; lines 728-729 timestamp cadence after the completed round."},{"path":"crates/spt-daemon/src/config.rs","description":"Lines 35-42 define 30 s registry, 15 s notif, 60 s sync, and 3600 s update pump cadences."},{"path":"crates/spt-daemon/src/dispatch.rs","description":"Lines 500-544 and 665-679 show the 100 ms-style polling dispatcher enumeration and end-of-loop sleep, a steady-baseline comparator rather than the isolated 30 s local delay."},{"path":"crates/spt-daemon/src/livehost.rs","description":"Lines 49-51 and 1015-1111 define the 5 s reconciliation comparator and its sliced sleep."},{"path":"crates/spt-daemon/src/projwriter.rs","description":"Lines 55-64 and 590-690 define the 300 s project-index backstop comparator."},{"path":"C:/Users/decid/AppData/Local/spt-core/daemon.json","description":"Deployed configuration confirms peer pump enabled and registry/notif/sync periods of 30000/15000/60000 ms."},{"path":"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json","description":"Current field state has two active subnets, SPT_DEV and BIGNET, determining the per-round epoch/write multiplier."},{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","description":"Lines 1016-1019, 1254-1255, 1424-1425, and 1610-1611 provide the refresh start and three timeout anchors that isolate approximately 16.47 s of recurring registry-local preparation versus approximately 51 ms for notif."},{"path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","description":"Current index state reports 12 endpoints, five projects, and latest periodic cycle duration 549 ms, excluding project-index reconciliation as the dense 90 s burst source."}],"architecture":"`run_brain` starts the brain-owned network consumers → `run_peer_pump` schedules four worker legs → every registry-due round calls `RegistryWorker::pre_round` → `RegistryHost::advertise_local` enumerates 12 bound perches → `recent_projects_for` parses each perch’s rolling session ledger → every eligible historical cwd synchronously calls `project_id_for_dir` → one/two `git.exe` processes run before project deduplication → each perch/subnet advertisement advances an atomically persisted epoch → registry snapshots are rewritten → only then does peer dial/fan-out begin. Because worker cadence is marked after the entire round, approximately 16.5 s local registry preparation plus current 10 s peer waits stretches nominal 30 s registry scheduling into approximately 56.5 s burst-start spacing. That architecture predicts low CPU between dense clusters and directly matches the observed median/mean/p95 split."}}}}],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":13824,"output":4246,"cacheRead":80384,"cacheWrite":0,"totalTokens":98454,"reasoningTokens":1314,"cost":{"input":0.06912,"output":0.12738,"cacheRead":0.040192,"cacheWrite":0,"total":0.236692}},"stopReason":"toolUse","timestamp":1784293672031,"responseId":"resp_04b15dc90dfe1c93016a5a2928928c81958c5e7b6195cf2597","providerPayload":{"type":"openaiResponsesHistory","provider":"openai-codex","dt":true,"items":[{"id":"rs_04b15dc90dfe1c93016a5a292b31d48195b047e5a708bb24d5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWik8VhOClzNxexbIewMo_IUta8Q-7gr37Oo27tqxnyMBO2nxiGB4nyIDLk_1clE4U9Bu-cM0bIgS_RPpBCl-DjlE-wmQCa4cZb0WksC8cWcZzKsxkCiNPH8K04_dDqq8K_DA7Mp3ZDDEwq99WlJmlLMsR2Ho7oAQ86g02Il4n-YAayChR7RtQMLTmNl64Y4jWX3JTNrYGKg_-jul7-5-8ubWKz1pKnDycHFJie5yonvUA0YkKKTAhDs0ji_4os8JHMTc-CDOI56Cbwo4WBiakNLIO8h59Wa6GaST7exxmMl6_TOXSHzg28DFiTYVc5YL_tUJ_Ezb68K3aIHXDiz8CmZqfMgaaTsiX8FIbgnrHDPVgAmHcoluTkjNUr_fTGxkd78vIS61pg27yEwhp-fsoXefjfxqZTSMKaKNUxx_yG2krMN2thVUs7PCfB2D9nq6TdAy_QIKn2w3OkokostW_L28kqlKDVWNFRavhUCWSwfLhiW3bilP1aDeDs-i2B3i8xYYdwMcRQkRvM7oRPiOMRSUw-CfOYJ0rK7OaiIny3gdkBGhxI-guvNzYboVsy8zr7AJrqu3yYCa0zVm-P9Nb3qFHxG3E5cDbUKQQcYws6GEJiDJ1fTrcoelNyjfVo4v8-kQXLYJi7-q-QIXHOoUiNURwhvR5kxYxvf4tokcvevQzREkDsjdmFWaf42W__ELn8yTpu46PExc8gJKMT9rMoHAfdpsYBH0HoB5b1TjsMiY7ESRwBNgIdsZJHFv__qJI9-cuCfclrlTiGoAbVguM1Po99Bt9MN_RHi-lsTs3PXJwTg4wBOr5idanFYS7jkMZaFlio7wmDKmBmypMQKDifxw0mJc2JxuF52Hi1pbNXn1vKEdAv9uBZvj4z374x0fISQvJSqLvCWqXkaOY0oO6Pwea_tikRQfk54LvSxS0eDMlR9vE-0evUaGeZDRHv5Zcix4kECg7wYKLy_cU0bA5uE-YllseMhE8XimgYJ0F9SRzWIxP0_94TVJSQCmtGIp3ribf7jwVU76o-zh8H-oK_R4bZQvAxewjHnO8YxGPXmFzr8_AKInUd3mFEc_aJBFZTJIp8Ksy8d2F5KVV3tRyJU7lfUVTie5UEIgyq-okGeDYgIcP1ixzw_xa1f4GnXyrDhni5F-QL_8mGV6s7fPlYE2DbiDeVfE5SBBTBa9RIvS0I600wwrjOHX-_YVbaz3y2rz3uXxue-CMKbE0wDTyWYfkXbvNZKNX7u97wICP2mP-paGV_DUe-7WrY1k2rwNAccKKtelQNxec0BpINNsq_QYuS3B6YhzpKAZQ4pnY9UIDMFEQEr22QOsenHCgbvcOycyfCvTa-w9VYYJPM-6m4hsjsyJ0M3cENcx5iHer9_wXQ_lWM6KPLZIJdBQXBn6TdjaR14pr1KjZ4LsBXn4Zr-HlV3GsTg3gjx1UgL6pBzywWOmkqxHE7jRlmIh3LmMsz1IzvMvRB1Y0ZKgpHDT81QT_JeH98xSZtiKdct7ltQWgwUqHV07XNA_I2q5uazq1ARNdLLJ47BiDiMD1xoyjYdAV6K_O-m25OxqS1dRzlzKXLOWsPsrzKTuSYzPUNWdMFqfHSjzXcO9hFLPY-pRg81VAHb2kxXEmatx42CFebe1-VLkhMWhS8US1MfLbdQQpw623AgVSaa64Cr_5cQTWmMS8045AHUY8EN0wkfJP3HccgPijjP7OhEJnZzZbpe38z1Dot2fMXut3WrMfsWk7YwJ7VpIDqQ9D-T0WgNRiBD_O2N4mClGAB54RW2uNrPlVNNwc4PpJi59gD2MqgxK9QzMcRnJKSfbbP5LjNjO_djhmfFsbQtOCHTeylo5plS3oaf8M4hzeUKczq85wq55DEkC8LzZy_kN0Ez9q18t1069akd1Pivqpei4crdOPes5KBiPoN8jSkLLf6-d-62KbMBHLuk0vP1AEoG6qd3Ujwvo7rGC7FtYgxvBs0I5YO-tyN2gGXwGHUSTIhuJgmLc4uXZL0hs5IxWpqToa9SLyv4GfKH89hI6COpxyZpJXJIjS6dJTd-c8HlWklw7W7wDuBu7vMsZAm0tfDzRikWKUUIFim4thi_cvYyf1mWBGUNzcxS4Oxh1rrEDg9vTfMHeb0yruHc9AAFIw9dajXNnMdqDzAHY7S-bMCiTQqDqIlCptLR8m-2q5VIhlp0ifIqJu1sSfqMPb6YR8JLUVcBjBmt-a8xxe6sVlBR2gPWaqTdnLtFa57nXMcYl6Cnh74k7eUUeB6iEK6-vzn9wM5itIVq4J2fWoeYe01bvLe4qWySa__LJz6YRlXjRivSsYx6WnP3B8tK-NElGiGDA04KPhhbu497v99jg35td6V4MN2AKrK407gWuTAl494w6AXHknvCXPiLxE21gpC18DOK9DfxXJ3raxunP59mdoH3NEmABuhWVOhpvFZD6fbaphHXIxgSR9CvNLUddP5u81c6MhyEINdTW9ahxov3CtOpo41ecBLU1MBAmcsB4hZcxokCQzulBTqH6ksuzNnzXyJqVWY-eq4C0soGRX3HMtULyXijtdXN9UAf21T4v7GyyxJHmmX33WJrY2XqoCHcerZvLNiskv7ftKJFb_HeVnSW6Pn3uf9wuRw49tXwsUID3gr1KO8uoQqxM9RNrUSuFF800iTFgB4ycQXuK8X8S0EK-61_LmZNU43c-PkONwrPVPEwPoRKStq2u8PpV4GoIN67U2MFlYLgT3H-FY_I1cURcDz1ESpwUXnnKN_Z01pxG5X2XAQUY7B3cSvd1psFARCpegR7RdlIbVIVhj_GvaTJ7xzcX4zfY3mT7H6R01s2ggHtS7HTg5lIczYGZ0wOPoBq0nJ6XAVilvzGq91JDp97wFO9HcXoB2kRbgp6IrzA7tl2w3sKlTxK_taWTl6I5DtIZVqrVktqB3hlYPfNGzxI6yVu46lz2SK8sLEZH4_3yPhnyr5x_NCAVOwdjYVRnhjoRP-tGTb38Zw0fnVYOhBRN4B3ygt3Uu41ejrfGQrvz1qLQuw7Is2lkVPbLszJTv4ffK4n_ToD-0ViNJpmgTGRjm__ZkKIBteDaUe5oz6FbXsTkrJ-tRp6lv6D2fcwJvIzsUwsOm3muGw5oKWBouOEIZNGs2qu4YPfZW-Yo6jd_7gBGjcaPdVgVoBsK4aWbob7qxuN-9lukEZzT4GuAwZEBMBS03tBv28JzWz2irN8-4GYTSAiCqFZgRWAWZuvJP8QUD_GSV8c2Ff6vKi66eZfmoGaiVCqUkixREmuaKX41tE2BrbVVxgwEC0xIOcKJlKvRinXEToRVu6uivIKQiBTplTt-zJsOCAffPq89ypbyMckEJzEJ5nSnp6OMz80V9RmSD35vSqcUiM7YDoWrsHXB-Zp8TUtTMiFu3LmC5aXlkoRcqphPH3xna0-D4kDjefRlVaxQqYaJta5B-Ylh0YliMlBSjrfjZyB4TKEKoqSvaF6-bx2bVaiF6xY8NnXTAWlpdAaXFbKnKYnB9Z0cpWESCQcdvClmLsFDDf05_yjdWpo3fBizwAswSs2djz29BPYAYiBO1VqZFE1libYHJg-GLpopDbVt-70LcgBCXSbmo_sKA60yqxoPj00nfiZTYwdbASxBLx1a-p0rqgG_76ngmx4pBjqT8JuWcAlHEQvfW_Hx9AAIipgJC4p4-HHquUdBkKEadKbIizzErGO3YL3l9V1-HX1tJa5XdwGhWnPmsfse86Q2v9-Osr4l6C0X-YsWWmQw4szyZvZ-k_S4WOjS7Zhk_V1eslWQ8G0xQ4CchCxa7RsNlVwLoQSfmFGMK3IFjcszeLyQOMEHpDY20GBSOKGODtPY95xrYAosrHkv7r1BHaHFwLuHO7I8ZmptAKSJIE5igQMUvZBupL8ynVrOxB7MXEpG5e7PaDCpzunEqMNe9fBUpQ==","summary":[{"type":"summary_text","text":"**Analyzing failure timestamp discrepancies**"},{"type":"summary_text","text":"**Verifying failure connections and project counts**"},{"type":"summary_text","text":"**Confirming atomic write counts**"}]},{"id":"rs_04b15dc90dfe1c93016a5a293cb27c819581e45de6231890c3","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWilNVNiWSafgSFsGDCW2DiJoh3yRVuYLBMb6PZQA--v3FZ45wSnEQ6sP0Zt0djc6qr5jAGkngxT5TKnIflGE-7uiP4WqX4tiP1J-eW1xZfv5fIZhEPpfWrxlDVAvT69wCLbl7NwnDM66Pp2dS4uDTSKWrJOKOzEv9CVXUYhRa6AB4LePM8818oQzDQz3PwTn38O9kPfYGGbyN0NVUyhhzbnt7BSwr16q50diUF9PqhoDCDa637kf4OQaPLBp78j-2zHBvEzC961q-8W7VCM5xO57qNTi3SYpzkvEp9onLIn0j8jJyGCkvslXgBBzvcTiU-ac6CJxYG1ru0jwwxiRRXyjpTAtbJMO-nqEqxM-26fvz7H8hgHzTkX3T1jcZ05Mg3YjkrGnse-gH0TwqAVaM5qc5O3048R-JQRWjVfUQSBUsRReZuU0otMY3yis3TLom9ZkfQgQovvXij7LOYOEoIKRufUx_2oHw4jtpag3Ek53xsvpyn_S66SBhKKVjMSlRbi8TzBpGuFt0lx-ov90zjlzqzbV-nTQ4id72lubBfLzH8MVJGxpHP-9XPC_PMbEOfLFpU8U0tEeNnOOM5dMv6IoztuRtTxFdk_uXsKYmCnIjHRx4Jnkvi11jXlFJDlIz1RSkudCM0_sSV7DKnovFJ0jwF54nP1JKiLHPGL7X9adgi79KUn58FLMH-ZZ54nHgTTewII5tI4DmLgw6zRjZaLiXmg1ks4rBSfTzkfzHuwxgbRCKl6f4UkiaJiirdiSvoI5oeP3BBI2sEvLu-K6dxNRpPWZZ5d1S3hVAnNUfKawHUq2Ntjz0PDDznFyOXC0yxm_RmsT07EGevL09L3LbNJJYUDIdk4yQa3e4QLXeC0TDf-M4vTVgtev85AFCIHyBY5YMZAToh-QP5reHkb-VZ3KQJigw4c6y-PI9-m2tkghVvr3wxa7EnQOLQt3uEv24U7Yhl_t-NVa1H8Pj5hT3psYkX0EzR1Jv7FMGjkbfeSPpJxbH29SMsYli61Tlk57aukH_gFOAHGwwnis0-Ei-YZ7y_2hBFlZEdXGRopaPkH5yT3HiFFzSCIj7RrWrRqkgS3JX12wR8dyn5oHsTsucES-HqbCe9R9iyQv9h4PKl1yEb1ItbvQCeMNx_jTI0dC7DGnflt-HhyjgMA42kS61QL2vF7KiU3dQ5qqzlYkT3QTgn2ejrvMhK2UtxvkX6nrv9RvUgtbYgqASrQRxMo4nheKIjPWXjhJXOWDyMtu9eXJqgmAbCqnRpTq4QkqdUkmQ7ZqJUTmgPZNV_fbNQ_MO9Z0OADdtl46ywOrW6Ci6lza57volfY_s9-bbWtg9D3GxiaFFohWFNDi-b-SyaTNfu8YcEQHx3uH13xYgrXL_xamfdTbr1-Mfj6cUvw3MolSGPw5Meo5gyYWFxfqb25H3BpcLOgLVIvAJT5s6oX8zTgpu_WNadMwns9997KonUXb1l6CMGclT_dguNcYUy3SHxyMS2a6W_XzfJcpL-bGGnm01n8kK8daxsqZdLMeXxfAeDiyU22WWr0bcakvqg8Ketlk67iL9TQMv0vf3H3g5Ou6-NhY06kzYeTbCx91d1GlDXVYPoik8HsB7TskfOjz1tvWpjbjZ5l9WJ2Zj8pAqHXnAKaGOQnMsDx73Ds4lcbvQ_Y8QGvNlKvr2Fw71h9uORH-Y4Playatc84LAYP1YNzPWn7CH7e8dF9kZE8ttKpxDBPg4K29CAOQCtA7jmR-88JYNEr668MhF4c3NExDOxXsBPyJ-hhzsQ2b03aZ1uGO-NnaStfQsdOQhlZ2zdr6atVS5dLfg5jmWKFdEH71U4qnKsUqUq_r2xP8lx2MbubaBeVNEgcn1HeSIg7Rb0lU-mWZ3ES4dQrfElzLAmu00RIylG14xGlb7dMOv_JEw8xmlZfmdcEmhdT_iGgoqQRj9deLEWpRcoGH6SUC0jI58EzUuuowQQ5HZpyxxdqnB_lyprzRnxg6hy5XgamZZWyfwO68AvTJ-ZgQg4BUJ2XBPzfSP-yMxAUSbnWyK70hqku8RHcbRre80cz0I8KrRdstNnEtGamP-ymI4xv8b2a5PmHM3W2OUT7oX79dJmLdIIldNbIO7bAOr4b62NGFUlzjCjDGQKnmxLT6fqOF1hceh-ym7Y4SUQy1IaQK7Q3WAxxQylCqKCjrv2RmrkraZ18xQKCkj0bu9RfF7XJTJi96P9Q-5Kg9nVPyRNM6-Y-4lhAyBa5RrrLLJgiTu-5rKUbfmrCFd1q8zpwpJ25sc-oYA7WRbiJEL5RlbKK0L_tmJCojQPg6MBXh7QCOqVf9RlZHwEG4i-WWCqxBFIoxad_DzBAcMPqgmmPq8xt_8orYcl7cmLhN2AxlX1ZhxoT4EkrQf425cYFR23y245NuwdDNdgvyNvJdRWm0oCEKAYg-e_uoWytPnPOoseOLnMxnq_-kcy-iXTtsillLMI0tJoY86Vf9ulqEq_0SkXPGlZWAujK86tmsaT9AE72TrMDC8NgPQUGBOxYUiHdsokRffA5g9eI3Ha4ii4CkObxUS-kEBDPNqVFzN-qkwxo8Iimq8P_vnT6IDjfOW3vzrD5tGTVwAoxA-oZ15f0JOBzRuRhv4MqKY2ZvXtZRs4f0-U9UnkRJxNMj-EWQwEJCpb8SMf1kdn7hCNgtijNFn-h32a9i1o7eHz37a8LspWp89xCi_9yfhyQTV83A9RsKzMgNAWD0aksmz_en5W6w1rnrvMeNmNPdMFxqZXbbiVTBgmly7gMH4mz448vwi25SkDwmcL2EnY7jTRyQGPM88y6GN1nYMPqPo250fIvdHO0kMkfzQ2LXFPFinhUXMuC0aDnGukkhabQ_5ZW4EdXA3rhjxmpyen0BUwk6KiAdpP6PUna5SxfQW7rNoT6ANo2clIILes1dN-vP3rMep_thX8VcT5ikZOgYsl4cq0GT-p9KyYHWx6lYA8GlCqaS5rUzHEsovJE8ZxQPCC6kdwO3Y-DYNO0fscfhQmKbZNnzWTHWh8t_cBawAlBzGoQPE57zYlLz7_rh2W1bHMjfIe0kjChExeObA2KduBrBWs13uwjcrFutN8xdbj-_-3O7mOeKCih2i_25VF9QqnC3IPe0CFiVR1RFqqTshzXX7SPm4TpXjxuf_AtiQ87DdM0JEsiEUr3PRJ8XOxNAVWfvdce_IxafR9SMQ_tzCbcFNbHrdEbEE9XerobqmsYpstkSN_gIgVFUjwm7RIlZWHuLU6PWf6ORhfVmi7g62EtPLXdG3PfbTOJR5xndAT3R26I4REbIg9eZBAUNXWcwP6axjI7oBqP_qqxe3r6gof-f7bpkhQdESJ889wE3UTAxfZogeXpZGIfiRonIW9VCIhVjt4rkBgvV8occ-UE8ZTblFvS91HdGwwRv0mr2M94rJxrPbrsONeRo9U85ysHrp2Ahn0QImjoIwHjq4kAuwj22fz0D-_2Qq_BUlMUgKNHg3OQ6gng4jzlZ2RSCo9nFcC5wZ4bheV00ZVm0FQ9HDY2V6xGHB-9h7mY-dtt3mlO9-kGQbBR0xGqaw3WD7TDd_ILiYmuBPOJQBN8XJ7shA88kNyPRgaiWRW131025c2B210fPRzHfPY39P0TP0vBhOGOXmDEcTHnoh6u3mFCOupAAk9sgcImP65GqJcP66UugPmLOcfb_N8gWZQz0K_-aPSPCQ26PXarNWIhEpb0gE8VLkhK3plpnNQDFhdHRwhegjmr8ftz86y6-14Nk_5-2hvMz3EjIknZRVLwswsm2E1m8xIth3LcSbSq7RXCLumvRs6e4s-Apuv0rMw8GQV6LdZBrcRIzsuJE_qa1CmTlwCbV","summary":[{"type":"summary_text","text":"**Analyzing registry snapshot timing**"},{"type":"summary_text","text":"**Investigating cluster burst timing and registry wake effects**"},{"type":"summary_text","text":"**Identifying CPU usage by registry pump thread**"}]},{"id":"rs_04b15dc90dfe1c93016a5a294d6cf881959a99b308de910bed","type":"reasoning","content":[],"encrypted_content":"gAAAAABqWilWXHc6c2l1TH0nMhs5gmOoPFVG6Sh5zVia2GYIvs4DtgkxDuD8ZRK_o0d0eq7hACs3fqQYaoe3tyc38vX0ZU-DdFbuMMpIO9f6n6-zlBn3Egc0WbSwH3sJuWZfUPSS1g6sRiUgaewTwC0ZyySu4pS6nXUvk5b5C9T79_kVAtDjAz-jCjeSgkI6570FdWFfyfc7OsTZDIJG1o2qGy6tLrc_5l-JHokQW50Q2vVux4fkURYQ7HDJHUr07CJynsn3y9T2xyrwehhnL7dwVdZZNSygYkzsCftK0LHEMWIhDI1SO9FYN1Sv6Dv6w9tRkEPhO4wki7Eiuje3omuVWSBHToGXHa7nfWGpLpDLLfjooZhAggWVZfojrklhN52lM_XnLda4mEaUG9NmvRy_4Aw6RXHbIVWEhzhYb4V-ZYnz5FXEPVdgmRQ7gxrMLtL6LBmRjKUDwf5K96OPrBeBLc-aDOEtmudxio6Jz_lwbg8IKZLczVtN79lSMi2yyYlnZsSJMWvIGbHQvwmctm74A6JK15Ho9y00tpD8usVfBuXw6cQGnshxdVHU_diqjzSXWtxrfIMT4mPB7vG5LIsTZYowRNkiTnM9-4_LGUm5abIm2KWXVlRwvmi7N6pe6JR9ckenVkRr3P5stVnKVr3MOKFmNsOKoKWpafINvPji_HGNiVmLCfO4sBwj4LWjAD2_2-4vxNG_22B8dR_TI4cqe4_DB5B1ZKMYGzVVdKOLcc4bZkRIv6CwlpifbcIterJZy1XX1dc-caL7lA85i0kh73_QNgt89rOjt5giLS5w6FueU_rHEDPAF1fHi3y9m9vx4QMMwOF99-wkwNhJ_Yfzn02iUQ0WM5R2nBGnFnVZLTBjYr9IDDiMcQAfY9xTVSbZ3tp8ygm1xE3Eujm7ry-BC4iYK0SwbSfAWGAws82-VuzWSft5qDgci-gK5-TsPW-BH0gKgkECJYGq4qEFxADfokLjUHIEMbhkY8cnnXn39pdL5gQYTjL0kOJJtk1_KxcaEqzlhpVDdaY3OgPxmY2vHzt8w89wtzhn1ISL-nvmGRJuvxntTQTgUimPvXFdHs0w7MfDdF9HIQ86jBMkUALCFYubJ9ULcwqYZP2XBVdpBNz4SAtXNxJN5AMxmAF3o_zKLwvU4FnWo4DLmr_hCOHWJfULp71IYVEQ0BZCeoXHWVI_sutCjgKQ3nLNqy6dLJmvVJQEnFdR8Gc5hUDfeJIWzVaBfcWdKhMfwF8Y_pY22j9BNMjyYH29fYHuulBlIgT0jla_6Por5cD6PRBwkrhx6ME1ZbMLMZQRWkgnteHkRFRRIHJrGfRa4ItKV7Wsqz9FqN4jJXORz_DbTuEqti1mNIVsGqnTPLobhmmW1yVYYgeFwRD2JWI19KDxWbGR9u9p42_rnTqCC02rAcnO194iyEVHfn9fbTFUOJTGV-U2TNlNY8BmJJNnbUFDnwBoqsn5_zdZ8DCqB4-9uS0wwKb8-W-IruqqaVDpEyRqU4unZrlrI0WzBAUBupJJ4tR22ue34XGVEsNMH4lvy5PHPCRYLJDwJmVc0spuF_4tHyRNLG4mgqFGL5ySbZxkDx_aIqERjjgZC7L1RnlloKbWCXd7VgwHJou-CDd9oN1YW9GivY3hdC_BWkjx1nPokeGl4eYnxggvYOS91wOo8_Wdy08puTERNuWled3DiPn1OrgrPmU-mO7hjtITObh15cBlJZ2h2JHs2UprDscp9RhTsv6P3FOscABA600yx5ROfyyZo4q2GkyRR2k7AHnDLX-TcANgq1z-xk3f36i9SsObE20KI-B3l-VZsTOJo_rXdrrPR1DYz7h_BVTwWXJtiDHlAwKMoyfIcxwGqJYT4vGUVdAeSRRSdC399xPLxrOrQejfWoelCvvNXEw2Wo0MDnPelkyY8CULhIQIybV2Ham6qCHGshYCD6_7JW_hOkgYTtYtzN6xrbp-YfhZ7y6RqKPZy0ekbSLibZi2J-bwxTYiIg2ZCawAHzpjKAGhFOQvzKCnc_uoTh1evWOUhWraZuDejTkuaf2y32artvSlsDXaX98frVpQ9jrEcfN-_oLyfL2Sh5GhN4xoQJl2onruK2StJAcvLdUkpqqneJ8B_BsGtbh4ju02r9DNPZthlgjzxWaAFl-1HyrPNuIZOfjcYNx0R2mc1ThFFx80-zXuYF8YJ5RyH2JBVhgIo8s3uZiitI3v73EzKcIUVS4lmq9FDwFw3a5ejejUSeaptOWX-R6eR2ysIGectrLvnmtr2uQmDNIfhiRtr8ANyHk1CUdJ69SyYZJ6rzMtDmJOv8NNkDDOODEIpzIGrYdgyGZvFUmn_JKZTCcF-vyVKjnHfkeGOGgYO61GOvoIzkuZWBfhyaADJ7FAFu6S_DnCbVjddEuuCpVH-4DWnHoeSaI1UBAfMzcPkV3NxPmqlBQCMKasqElGeHlrhTcALrwczI9RQKkIjU6m8_P7prsIwpsrjLrq37z4vIBF86mHE0-UtpoYNbuPBytv5iMSI7wCOQ==","summary":[{"type":"summary_text","text":"**Profiling git-related process clusters**"},{"type":"summary_text","text":"**Evaluating registry lifecycle performance**"}]},{"id":"fc_04b15dc90dfe1c93016a5a295623b48195bfc3943b6cb88762","type":"function_call","status":"completed","arguments":"{\"type\":\"result\",\"result\":{\"data\":{\"summary\":\"## Finding\\n\\n**Highest-confidence source of the residual v0.37 brain CPU bursts is the registry pump’s local re-advertisement pass, specifically repeated project-ID derivation from every endpoint session-ledger row.** This is not the already-fixed executable self-hash and does not require a poisoned connection to occur.\\n\\n### Cadence and field correlation\\n\\n- `crates/spt-daemon/src/config.rs:35-42` defines the peer-pump cadences; registry defaults to **30 s**.\\n- The deployed `C:/Users/decid/AppData/Local/spt-core/daemon.json` confirms `registry_pump_period_ms: 30000` and `peer_pump: true`.\\n- `crates/spt-daemon/src/pump/mod.rs:95-103` gives the scheduler a 200 ms tick, while `:587-591` initializes every worker’s last-run value to `None`, so all four pump legs run immediately after a brain refresh.\\n- `crates/spt-daemon/src/pump/mod.rs:728-729` stamps the worker **after the entire round**, not when work begins. Therefore the registry burst is not on a rigid 30 s wall-clock grid: the next registry pass begins 30 s after the previous round finishes. With the current dead-peer 10 s dial waits, burst starts can be roughly 56 s apart rather than 30 s apart.\\n- The current log provides a useful natural experiment:\\n  - `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:1016-1019`: refreshed brain’s dispatcher/pump starts at `wall_ms=1784292560815`.\\n  - `:1254-1255`: the prime-all round reaches its paired 10 s dial timeouts at `1784292586908/9`.\\n  - `:1424-1425`: the next **15 s notif-only** round reaches the same 10 s timeout at `1784292611960/1`. From the prior round’s completion, `15 s cadence + 10 s timeout` predicts approximately `1784292611909`; the observed extra local work is only about **51 ms**.\\n  - `:1610-1611`: the next **30 s registry** round reaches timeout at `1784292643383`. From the initial round completion, `30 s cadence + 10 s timeout` accounts for 40 s; the remaining approximately **16.47 s** is recurring local work before the dials are drained. This isolates registry-round preparation from the cheap notif round without requiring speculative CPU attribution.\\n- Two approximately 16 s registry clusters in a 90 s window can occupy about 32 one-second buckets; the observed **27/90 samples at least 10%**, with dense clusters and a low 3.1% median, is the expected shape after sampling/phase boundaries. It is not the shape of the dispatcher’s 100 ms polling baseline.\\n\\n### Work performed on each registry round\\n\\n1. `crates/spt-daemon/src/pump/registry.rs:141-162` runs eviction/rotation work and then unconditionally calls `RegistryHost::advertise_local` in `pre_round`, before connecting to any peer. Thus it runs even when no peer is reachable.\\n2. `crates/spt-daemon/src/registryhost.rs:579-620` enumerates every bound top-level perch and calls `recent_projects_for` once per perch.\\n3. `crates/spt-daemon/src/registryhost.rs:981-1009` reads the full bounded `sessions.log`, walks newest-to-oldest, excludes owlery-internal paths, and only stops after finding eight **unique** project IDs. Deduplication occurs **after** project-ID derivation.\\n4. `crates/spt-store/src/sessions.rs:27-30,99-102` shows each ledger is a rolling file capped at 64 rows and `read_all` reads/parses the file each call.\\n5. `crates/spt-store/src/project.rs:21-24,55-64,95-137` derives each row’s project by spawning `git -C <cwd> remote get-url origin`, then—if that does not return a usable remote—spawns `git -C <cwd> rev-parse --show-toplevel`. Each eligible ledger row therefore costs **one or two subprocess launches with 10 s budgets**, even when many rows repeat the same cwd/project.\\n6. A census of the current 12 bound-perch ledgers found **200 eligible non-owlery cwd rows**. No perch reaches the cap of eight unique projects, so all 200 rows are derived each registry pass: **at least 200 and at most 400 sequential `git.exe` launches per pass**. Repeated cwd values are not cached.\\n7. `crates/spt-daemon/src/registryhost.rs:584-632,701-728` also advances the epoch once for every perch/subnet row and once per subnet node-label row. The current `identity/subnet.json` has two active subnets and there are 12 bound perches, yielding **26 epoch advances per round**. `crates/spt-store/src/epoch.rs:63-75` shows every advance is an atomic file write. `RegistryHost::advertise_local` then rewrites registry snapshots at `registryhost.rs:729-733`.\\n\\nComplexity is therefore approximately $O(L \\\\times G + P \\\\times S + R)$ per registry pass, where $L$ is eligible ledger rows, $G$ is one/two external Git processes per row, $P$ is bound perches, $S$ is subnets, and $R$ is in-memory registry rows scanned/serialized. The subprocess term dominates on this Windows host.\\n\\n### Candidate discrimination\\n\\n- **Notif pump, 15 s:** source cadence is `config.rs:40`; the log’s isolated notif round adds only about 51 ms before the fixed 10 s timeout. It cannot explain a recurring 16 s CPU cluster.\\n- **Dispatcher, 100 ms:** `dispatch.rs:500-544,665-679` performs `brain.net_streams()` every poll and spawns only for newly eligible rows. It can explain a low steady baseline or stream-event spikes, but not the log-isolated 30 s registry preparation delay. Current post-refresh log has no poison/failure evidence supplied by this path.\\n- **Live-host reconciliation, 5 s:** `livehost.rs:49-51,1015-1017,1106-1111` queries live sessions and scans endpoint records every 5 s. It does not run Git per historical ledger row; a 5 s phase-locked signal would look materially different.\\n- **Project-index full backstop, 300 s:** `projwriter.rs:55-64,590-690` can be expensive but can contribute at most one scheduled pass in a 90 s sample. Current `project-index-stats.json` also reports the latest cycle at 549 ms, not a dense multi-second cluster.\\n\\n### Falsifiable field measurement\\n\\nCapture at least 120 s of ETW/WPR CPU sampling plus process-start events, or Procmon process events, filtered to the current brain PID and its descendants. Also record write events for `identity/epoch` and `identity/registry/{BIGNET,SPT_DEV}.json`.\\n\\nThe registry explanation predicts:\\n\\n1. CPU clusters are on the brain’s `spt-peer-pump` thread.\\n2. Each cluster contains approximately **200–400 `git.exe` child starts**, concentrated over approximately 16 s.\\n3. The registry/epoch writes finish near the end of that cluster.\\n4. For the currently unreachable peers, `PUMP_PEER_FAIL ... exceeded the 10s bound` follows approximately 10 s later.\\n5. The intervening 15 s notif round has no comparable Git-child cluster.\\n\\nZero clustered Git starts, CPU attribution to another brain thread, or 5 s rather than registry-round phase locking falsifies this explanation and elevates livehost/dispatcher as the next candidates.\\n\\n### Field-gate disposition\\n\\n**CPU field gate: HOLD / NO-GO. Registry-lifecycle correctness gate: PASS on the available zero-poison evidence.**\\n\\nThis is **expected steady-state behavior of the current source**, not a recurrence of REGISTRY-LIFECYCLE poison and not evidence that the self-hash fix failed—the read-rate collapse from 63.91 MiB/s to 0.29 MiB/s corroborates that fix. It is also not a v0.37 lifecycle regression in the narrow causal sense: it is a pre-existing/latent periodic workload now exposed after removing the continuous hash load. Nevertheless, 90 s mean brain CPU of 8.39% of one core, p95 28.1%, and approximately 16 s hot clusters do not satisfy v0.37’s release claim that idle-node steady background CPU has ended. The mean improved versus v0.36’s 15.5%, but the residual is real scheduled work rather than measurement noise; the overall performance field gate should remain held until the process-start discriminator confirms or rejects it and the accepted idle threshold is met.\",\"files\":[{\"path\":\"crates/spt-daemon/src/pump/registry.rs\",\"description\":\"Lines 141-162 perform all node-local registry eviction/rotation/re-advertisement work in `pre_round`; line 162 calls `advertise_local` before peer fan-out.\"},{\"path\":\"crates/spt-daemon/src/registryhost.rs\",\"description\":\"Lines 579-632 derive recent projects for every bound perch and author a row for each subnet; lines 701-733 add node-label epochs and rewrite snapshots; lines 981-1009 scan ledgers and invoke project derivation before deduplication.\"},{\"path\":\"crates/spt-store/src/project.rs\",\"description\":\"Lines 21-24 define a 10 s Git budget; lines 55-64 expose project-ID derivation; lines 95-137 show sequential `git remote get-url` and fallback `git rev-parse` subprocesses for every cwd.\"},{\"path\":\"crates/spt-store/src/sessions.rs\",\"description\":\"Lines 27-30 define the 64-row rolling ledger cap; lines 99-102 show `read_all` reads/parses the ledger file.\"},{\"path\":\"crates/spt-store/src/epoch.rs\",\"description\":\"Lines 63-75 show every registry epoch increment is persisted with an atomic write.\"},{\"path\":\"crates/spt-daemon/src/pump/mod.rs\",\"description\":\"Lines 95-103 define the 200 ms scheduler tick; lines 516-518 state ordering; lines 587-591 prime all workers after refresh; lines 728-729 timestamp cadence after the completed round.\"},{\"path\":\"crates/spt-daemon/src/config.rs\",\"description\":\"Lines 35-42 define 30 s registry, 15 s notif, 60 s sync, and 3600 s update pump cadences.\"},{\"path\":\"crates/spt-daemon/src/dispatch.rs\",\"description\":\"Lines 500-544 and 665-679 show the 100 ms-style polling dispatcher enumeration and end-of-loop sleep, a steady-baseline comparator rather than the isolated 30 s local delay.\"},{\"path\":\"crates/spt-daemon/src/livehost.rs\",\"description\":\"Lines 49-51 and 1015-1111 define the 5 s reconciliation comparator and its sliced sleep.\"},{\"path\":\"crates/spt-daemon/src/projwriter.rs\",\"description\":\"Lines 55-64 and 590-690 define the 300 s project-index backstop comparator.\"},{\"path\":\"C:/Users/decid/AppData/Local/spt-core/daemon.json\",\"description\":\"Deployed configuration confirms peer pump enabled and registry/notif/sync periods of 30000/15000/60000 ms.\"},{\"path\":\"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json\",\"description\":\"Current field state has two active subnets, SPT_DEV and BIGNET, determining the per-round epoch/write multiplier.\"},{\"path\":\"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log\",\"description\":\"Lines 1016-1019, 1254-1255, 1424-1425, and 1610-1611 provide the refresh start and three timeout anchors that isolate approximately 16.47 s of recurring registry-local preparation versus approximately 51 ms for notif.\"},{\"path\":\"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json\",\"description\":\"Current index state reports 12 endpoints, five projects, and latest periodic cycle duration 549 ms, excluding project-index reconciliation as the dense 90 s burst source.\"}],\"architecture\":\"`run_brain` starts the brain-owned network consumers → `run_peer_pump` schedules four worker legs → every registry-due round calls `RegistryWorker::pre_round` → `RegistryHost::advertise_local` enumerates 12 bound perches → `recent_projects_for` parses each perch’s rolling session ledger → every eligible historical cwd synchronously calls `project_id_for_dir` → one/two `git.exe` processes run before project deduplication → each perch/subnet advertisement advances an atomically persisted epoch → registry snapshots are rewritten → only then does peer dial/fan-out begin. Because worker cadence is marked after the entire round, approximately 16.5 s local registry preparation plus current 10 s peer waits stretches nominal 30 s registry scheduling into approximately 56.5 s burst-start spacing. That architecture predicts low CPU between dense clusters and directly matches the observed median/mean/p95 split.\"}}}","call_id":"call_iEgvath9gg9dysc3aieRUTg6","name":"yield"}]},"duration":115744.69919998944,"ttft":3185.4697999954224,"contextSnapshot":{"promptTokens":94208,"nonMessageTokens":15503}}}
{"type":"custom","customType":"tool_execution_start","data":{"toolCallId":"call_iEgvath9gg9dysc3aieRUTg6|fc_04b15dc90dfe1c93016a5a295623b48195bfc3943b6cb88762","toolName":"yield","startedAt":"2026-07-17T13:09:47.778Z"},"id":"31355087","parentId":"9d2d2dc9","timestamp":"2026-07-17T13:09:47.778Z"}
{"type":"message","id":"635356ba","parentId":"31355087","timestamp":"2026-07-17T13:09:47.779Z","message":{"role":"toolResult","toolCallId":"call_iEgvath9gg9dysc3aieRUTg6|fc_04b15dc90dfe1c93016a5a295623b48195bfc3943b6cb88762","toolName":"yield","content":[{"type":"text","text":"Result submitted."}],"details":{"data":{"summary":"## Finding\n\n**Highest-confidence source of the residual v0.37 brain CPU bursts is the registry pump’s local re-advertisement pass, specifically repeated project-ID derivation from every endpoint session-ledger row.** This is not the already-fixed executable self-hash and does not require a poisoned connection to occur.\n\n### Cadence and field correlation\n\n- `crates/spt-daemon/src/config.rs:35-42` defines the peer-pump cadences; registry defaults to **30 s**.\n- The deployed `C:/Users/decid/AppData/Local/spt-core/daemon.json` confirms `registry_pump_period_ms: 30000` and `peer_pump: true`.\n- `crates/spt-daemon/src/pump/mod.rs:95-103` gives the scheduler a 200 ms tick, while `:587-591` initializes every worker’s last-run value to `None`, so all four pump legs run immediately after a brain refresh.\n- `crates/spt-daemon/src/pump/mod.rs:728-729` stamps the worker **after the entire round**, not when work begins. Therefore the registry burst is not on a rigid 30 s wall-clock grid: the next registry pass begins 30 s after the previous round finishes. With the current dead-peer 10 s dial waits, burst starts can be roughly 56 s apart rather than 30 s apart.\n- The current log provides a useful natural experiment:\n  - `C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log:1016-1019`: refreshed brain’s dispatcher/pump starts at `wall_ms=1784292560815`.\n  - `:1254-1255`: the prime-all round reaches its paired 10 s dial timeouts at `1784292586908/9`.\n  - `:1424-1425`: the next **15 s notif-only** round reaches the same 10 s timeout at `1784292611960/1`. From the prior round’s completion, `15 s cadence + 10 s timeout` predicts approximately `1784292611909`; the observed extra local work is only about **51 ms**.\n  - `:1610-1611`: the next **30 s registry** round reaches timeout at `1784292643383`. From the initial round completion, `30 s cadence + 10 s timeout` accounts for 40 s; the remaining approximately **16.47 s** is recurring local work before the dials are drained. This isolates registry-round preparation from the cheap notif round without requiring speculative CPU attribution.\n- Two approximately 16 s registry clusters in a 90 s window can occupy about 32 one-second buckets; the observed **27/90 samples at least 10%**, with dense clusters and a low 3.1% median, is the expected shape after sampling/phase boundaries. It is not the shape of the dispatcher’s 100 ms polling baseline.\n\n### Work performed on each registry round\n\n1. `crates/spt-daemon/src/pump/registry.rs:141-162` runs eviction/rotation work and then unconditionally calls `RegistryHost::advertise_local` in `pre_round`, before connecting to any peer. Thus it runs even when no peer is reachable.\n2. `crates/spt-daemon/src/registryhost.rs:579-620` enumerates every bound top-level perch and calls `recent_projects_for` once per perch.\n3. `crates/spt-daemon/src/registryhost.rs:981-1009` reads the full bounded `sessions.log`, walks newest-to-oldest, excludes owlery-internal paths, and only stops after finding eight **unique** project IDs. Deduplication occurs **after** project-ID derivation.\n4. `crates/spt-store/src/sessions.rs:27-30,99-102` shows each ledger is a rolling file capped at 64 rows and `read_all` reads/parses the file each call.\n5. `crates/spt-store/src/project.rs:21-24,55-64,95-137` derives each row’s project by spawning `git -C <cwd> remote get-url origin`, then—if that does not return a usable remote—spawns `git -C <cwd> rev-parse --show-toplevel`. Each eligible ledger row therefore costs **one or two subprocess launches with 10 s budgets**, even when many rows repeat the same cwd/project.\n6. A census of the current 12 bound-perch ledgers found **200 eligible non-owlery cwd rows**. No perch reaches the cap of eight unique projects, so all 200 rows are derived each registry pass: **at least 200 and at most 400 sequential `git.exe` launches per pass**. Repeated cwd values are not cached.\n7. `crates/spt-daemon/src/registryhost.rs:584-632,701-728` also advances the epoch once for every perch/subnet row and once per subnet node-label row. The current `identity/subnet.json` has two active subnets and there are 12 bound perches, yielding **26 epoch advances per round**. `crates/spt-store/src/epoch.rs:63-75` shows every advance is an atomic file write. `RegistryHost::advertise_local` then rewrites registry snapshots at `registryhost.rs:729-733`.\n\nComplexity is therefore approximately $O(L \\times G + P \\times S + R)$ per registry pass, where $L$ is eligible ledger rows, $G$ is one/two external Git processes per row, $P$ is bound perches, $S$ is subnets, and $R$ is in-memory registry rows scanned/serialized. The subprocess term dominates on this Windows host.\n\n### Candidate discrimination\n\n- **Notif pump, 15 s:** source cadence is `config.rs:40`; the log’s isolated notif round adds only about 51 ms before the fixed 10 s timeout. It cannot explain a recurring 16 s CPU cluster.\n- **Dispatcher, 100 ms:** `dispatch.rs:500-544,665-679` performs `brain.net_streams()` every poll and spawns only for newly eligible rows. It can explain a low steady baseline or stream-event spikes, but not the log-isolated 30 s registry preparation delay. Current post-refresh log has no poison/failure evidence supplied by this path.\n- **Live-host reconciliation, 5 s:** `livehost.rs:49-51,1015-1017,1106-1111` queries live sessions and scans endpoint records every 5 s. It does not run Git per historical ledger row; a 5 s phase-locked signal would look materially different.\n- **Project-index full backstop, 300 s:** `projwriter.rs:55-64,590-690` can be expensive but can contribute at most one scheduled pass in a 90 s sample. Current `project-index-stats.json` also reports the latest cycle at 549 ms, not a dense multi-second cluster.\n\n### Falsifiable field measurement\n\nCapture at least 120 s of ETW/WPR CPU sampling plus process-start events, or Procmon process events, filtered to the current brain PID and its descendants. Also record write events for `identity/epoch` and `identity/registry/{BIGNET,SPT_DEV}.json`.\n\nThe registry explanation predicts:\n\n1. CPU clusters are on the brain’s `spt-peer-pump` thread.\n2. Each cluster contains approximately **200–400 `git.exe` child starts**, concentrated over approximately 16 s.\n3. The registry/epoch writes finish near the end of that cluster.\n4. For the currently unreachable peers, `PUMP_PEER_FAIL ... exceeded the 10s bound` follows approximately 10 s later.\n5. The intervening 15 s notif round has no comparable Git-child cluster.\n\nZero clustered Git starts, CPU attribution to another brain thread, or 5 s rather than registry-round phase locking falsifies this explanation and elevates livehost/dispatcher as the next candidates.\n\n### Field-gate disposition\n\n**CPU field gate: HOLD / NO-GO. Registry-lifecycle correctness gate: PASS on the available zero-poison evidence.**\n\nThis is **expected steady-state behavior of the current source**, not a recurrence of REGISTRY-LIFECYCLE poison and not evidence that the self-hash fix failed—the read-rate collapse from 63.91 MiB/s to 0.29 MiB/s corroborates that fix. It is also not a v0.37 lifecycle regression in the narrow causal sense: it is a pre-existing/latent periodic workload now exposed after removing the continuous hash load. Nevertheless, 90 s mean brain CPU of 8.39% of one core, p95 28.1%, and approximately 16 s hot clusters do not satisfy v0.37’s release claim that idle-node steady background CPU has ended. The mean improved versus v0.36’s 15.5%, but the residual is real scheduled work rather than measurement noise; the overall performance field gate should remain held until the process-start discriminator confirms or rejects it and the accepted idle threshold is met.","files":[{"path":"crates/spt-daemon/src/pump/registry.rs","description":"Lines 141-162 perform all node-local registry eviction/rotation/re-advertisement work in `pre_round`; line 162 calls `advertise_local` before peer fan-out."},{"path":"crates/spt-daemon/src/registryhost.rs","description":"Lines 579-632 derive recent projects for every bound perch and author a row for each subnet; lines 701-733 add node-label epochs and rewrite snapshots; lines 981-1009 scan ledgers and invoke project derivation before deduplication."},{"path":"crates/spt-store/src/project.rs","description":"Lines 21-24 define a 10 s Git budget; lines 55-64 expose project-ID derivation; lines 95-137 show sequential `git remote get-url` and fallback `git rev-parse` subprocesses for every cwd."},{"path":"crates/spt-store/src/sessions.rs","description":"Lines 27-30 define the 64-row rolling ledger cap; lines 99-102 show `read_all` reads/parses the ledger file."},{"path":"crates/spt-store/src/epoch.rs","description":"Lines 63-75 show every registry epoch increment is persisted with an atomic write."},{"path":"crates/spt-daemon/src/pump/mod.rs","description":"Lines 95-103 define the 200 ms scheduler tick; lines 516-518 state ordering; lines 587-591 prime all workers after refresh; lines 728-729 timestamp cadence after the completed round."},{"path":"crates/spt-daemon/src/config.rs","description":"Lines 35-42 define 30 s registry, 15 s notif, 60 s sync, and 3600 s update pump cadences."},{"path":"crates/spt-daemon/src/dispatch.rs","description":"Lines 500-544 and 665-679 show the 100 ms-style polling dispatcher enumeration and end-of-loop sleep, a steady-baseline comparator rather than the isolated 30 s local delay."},{"path":"crates/spt-daemon/src/livehost.rs","description":"Lines 49-51 and 1015-1111 define the 5 s reconciliation comparator and its sliced sleep."},{"path":"crates/spt-daemon/src/projwriter.rs","description":"Lines 55-64 and 590-690 define the 300 s project-index backstop comparator."},{"path":"C:/Users/decid/AppData/Local/spt-core/daemon.json","description":"Deployed configuration confirms peer pump enabled and registry/notif/sync periods of 30000/15000/60000 ms."},{"path":"C:/Users/decid/AppData/Local/spt-core/identity/subnet.json","description":"Current field state has two active subnets, SPT_DEV and BIGNET, determining the per-round epoch/write multiplier."},{"path":"C:/Users/decid/AppData/Local/spt-core/logs/daemon.stderr.log","description":"Lines 1016-1019, 1254-1255, 1424-1425, and 1610-1611 provide the refresh start and three timeout anchors that isolate approximately 16.47 s of recurring registry-local preparation versus approximately 51 ms for notif."},{"path":"C:/Users/decid/AppData/Local/spt-core/index/project-index-stats.json","description":"Current index state reports 12 endpoints, five projects, and latest periodic cycle duration 549 ms, excluding project-index reconciliation as the dense 90 s burst source."}],"architecture":"`run_brain` starts the brain-owned network consumers → `run_peer_pump` schedules four worker legs → every registry-due round calls `RegistryWorker::pre_round` → `RegistryHost::advertise_local` enumerates 12 bound perches → `recent_projects_for` parses each perch’s rolling session ledger → every eligible historical cwd synchronously calls `project_id_for_dir` → one/two `git.exe` processes run before project deduplication → each perch/subnet advertisement advances an atomically persisted epoch → registry snapshots are rewritten → only then does peer dial/fan-out begin. Because worker cadence is marked after the entire round, approximately 16.5 s local registry preparation plus current 10 s peer waits stretches nominal 30 s registry scheduling into approximately 56.5 s burst-start spacing. That architecture predicts low CPU between dense clusters and directly matches the observed median/mean/p95 split."},"status":"success","type":"result"},"isError":false,"timestamp":1784293787778}}
{"type":"message","id":"aa886c2f","parentId":"635356ba","timestamp":"2026-07-17T13:09:47.785Z","message":{"role":"assistant","content":[],"api":"openai-codex-responses","provider":"openai-codex","model":"gpt-5.6-sol","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"aborted","errorMessage":"Request was aborted","errorId":134221824,"timestamp":1784293787781}}
{"type":"custom","customType":"session_exit","data":{"reason":"dispose","kind":"normal","recordedAt":"2026-07-17T13:16:47.799Z"},"id":"365f3c55","parentId":"aa886c2f","timestamp":"2026-07-17T13:16:47.799Z"}
